ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

ArduPilot 视频流信息脚本:基于 Lua 脚本与 AP_Camera 库下发 VIDEO_STREAM_INFORMATION 消息的完整指南

ArduPilot 视频流信息脚本:基于 Lua 脚本与 AP_Camera 库下发 VIDEO_STREAM_INFORMATION 消息的完整指南 ArduPilot 视频流信息脚本基于 Lua 脚本与 AP_Camera 库下发 VIDEO_STREAM_INFORMATION 消息的完整指南【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot导读本文围绕 ArduPilot 官方脚本样例 video-stream-information.md 与对应的 video-stream-information.lua系统讲解如何通过机载 Lua 脚本填充 MAVLinkVIDEO_STREAM_INFORMATION消息让地面站GCS自动发现并播放图传/相机云台发出的实时视频流。读完本文你将掌握该脚本的 15 个VID1_*参数含义、主流云台相机Siyi、Herelink、Topotek、Viewpro的预置配置、脚本在 AP_Camera 库中的完整调用链以及使用 MAVLink Inspector 验证 URI 的排查方法。一、脚本解决什么问题ArduPilot 固件本身并不直接转发相机的视频流但它可以告诉地面站视频流在哪个地址。这一信息通过 MAVLink 的VIDEO_STREAM_INFORMATION消息承载其核心字段是uri形如rtsp://192.168.144.25:8554/main.264。地面站收到该消息后即可据此连接 RTSP/RTP 等视频流并在 HUD 中实时显示画面。问题在于不同云台相机的网络地址、码流路径、编码格式、视场角FOV各不相同且通常需要用户手工配置。video-stream-information.lua正是为此设计——它读取用户设置的VID1_*脚本参数构造并周期性刷新VIDEO_STREAM_INFORMATION消息写入 AP_Camera 库后由飞控转发给地面站。从仓库源码看这一功能由编译宏AP_CAMERA_INFO_FROM_SCRIPT_ENABLED与AP_MAVLINK_MSG_VIDEO_STREAM_INFORMATION_ENABLED控制二者同时启用时脚本下发的信息才会真正生效见 AP_Camera_Backend.cpp。二、脚本工作原理源码级2.1 脚本参数注册机制脚本通过 Lua 绑定创建独立参数表local PARAM_TABLE_KEY 90 local PARAM_TABLE_PREFIX VID1_ assert(param:add_table(PARAM_TABLE_KEY, PARAM_TABLE_PREFIX, 15), could not add param table)PARAM_TABLE_KEY 90脚本参数表在固件中的唯一编号PARAM_TABLE_PREFIX VID1_生成的参数统一以VID1_开头便于地面站检索参数表容量为 15对应下面将要介绍的 15 个参数。随后bind_add_param()逐一调用param:add_param()并绑定为Parameter对象供脚本运行时读写video-stream-information.lua。2.2 消息构造与刷新周期脚本核心函数set_video_stream_information()完成三件事按相机模型选择默认值IP、URI 后缀、水平 FOV按用户覆盖参数重算 URI 与 HFOV填充mavlink_video_stream_information_t并调用camera:set_stream_information(0, stream_info)写入相机库。脚本通过update()每 5 秒执行一次刷新function update() set_video_stream_information() return update, 5000 end启动时还会发送一条video-stream-information script loaded的 INFO 级地面站提示video-stream-information.lua。2.3 写入 AP_Camera 库并转发给地面站脚本调用链在 C 侧的实现如下脚本层camera:set_stream_information(INSTANCE, stream_info)绑定定义见 bindings.desc其依赖宏AP_CAMERA_INFO_FROM_SCRIPT_ENABLEDAP_Camera::set_stream_information 加信号量后按实例号路由到对应 backendAP_Camera_Backend::set_stream_information 将消息体保存到_stream_info地面站周期性请求时send_video_stream_information 通过mavlink_msg_video_stream_information_send_struct()将_stream_info编码发送到对应 MAVLink 通道。需要说明的是AP_Camera 的 scripting backend 本身位于 AP_Camera_Scripting.cpp / AP_Camera_Scripting.h负责拍照、录像、变焦、对焦、跟踪等状态的存取而视频流信息是脚本直接写入的独立通道。三、安装与启用步骤原文档给出的七步流程结合仓库实际情况整理如下配置相机云台与以太网按照 ArduPilot 官方 Wiki 完成相机云台的安装与以太网Ethernet连接配置确保飞控与云台处于同一网段、可互相 ping 通。确认云台 IP 地址记录相机云台的 IP 与流端口例如 Siyi 系列通常为192.168.144.25:8554后续参数配置需要用到。启用脚本支持刷入包含脚本功能的固件后将SCR_ENABLE参数设为1并重启飞控参见 libraries/AP_Scripting/README.md。部署脚本文件将 video-stream-information.lua 复制到飞控存储的scripts目录下重启后脚本会自动加载。设置VID1_CAMMODEL将参数设为实际云台型号对应的枚举值脚本会自动套用该型号的默认 IP、URI 后缀与 FOV再按需调整其余VID1_*参数。用 MAVLink Inspector 验证在地面站的 MAVLink Inspector 中检查VIDEO_STREAM_INFORMATION消息的uri字段是否符合预期。确认地面站显示画面地面站收到正确 URI 后应能连接并显示实时视频。四、参数详解以下 15 个参数全部以VID1_为前缀注册于脚本参数表与 video-stream-information.lua 中的声明一一对应参数显示名说明取值范围/枚举默认值VID1_CAMMODELCamera Model视频流相机型号0:Unknown, 1:Siyi A8, 2:Siyi ZR10, 3:Siyi ZR30, 4:Siyi ZT30 Zoom, 5:Siyi ZT30 Wide, 6:Siyi ZT30 IR, 7:Siyi ZT6 RGB, 8:Siyi ZT6 IR, 9:Herelink WifiAP, 10:Herelink USB-tethering, 11:Topotek 1080p, 12:Topotek 480p, 13:Viewpro0VID1_IDStream Id视频流 ID0–501VID1_TYPEStream Type视频流传输类型0:RTSP, 1:RTPUDP, 2:TCP_MPEG, 3:MPEG_TS0VID1_FLAGStream Flags视频流标志位位掩码0:Running, 1:Thermal, 2:Thermal Range Enabled1VID1_FRAME_RATEFrame Rate视频流帧率fps0–5030VID1_HRESHorizontal Resolution水平分辨率像素0–40961920VID1_VRESVertical Resolution垂直分辨率像素0–40961080VID1_BITRATEBitrate视频流码率kbps0–100001500VID1_HFOVHorizontal FOV水平视场角度0 表示使用相机模型默认值0–3600VID1_ENCODINGEncoding视频编码格式0:Unknown, 1:H264, 2:H2651VID1_IPADDR0IP Address 0IP 地址第一段若配置为 -1 则使用相机模型默认 IP0–255-1 表示未设置-1VID1_IPADDR1IP Address 1IP 地址第二段0–255-1 表示未设置-1VID1_IPADDR2IP Address 2IP 地址第三段0–255-1 表示未设置-1VID1_IPADDR3IP Address 3IP 地址第四段0–255-1 表示未设置-1VID1_IPPORTIP Port视频流端口0–65535-1 表示未设置-14.1 关键参数说明VID1_CAMMODEL是一键配置开关设为非 0 值时脚本会自动套用该型号的默认 IP、URI 路径与水平 FOV详见第五节后续只需微调即可。VID1_TYPE决定 URI 的构造方式RTSP0构造rtsp://ip:port/suffix形式RTPUDP1与 MPEG_TS3直接以端口号作为 URITCP_MPEG2则拼接ip:port/suffix。详见第六节。VID1_FLAG为位掩码第 0 位 Running流是否运行中、第 1 位 Thermal热成像、第 2 位 Thermal Range Enabled热成像量程已启用。默认值 1 表示流正在运行。IP 四段与端口默认均为 -1脚本以任一字段大于 0作为用户是否覆盖默认 IP 的判断依据见 video-stream-information.lua因此若要自定义 IP四个八位组都必须设置为有效值。五、相机型号预置配置脚本为 13 种相机型号内置了默认 IP、URI 后缀与水平 FOVvideo-stream-information.lua型号枚举值默认 IP:端口URI 后缀默认 HFOVSiyi A81192.168.144.25:8554/main.26481°Siyi ZR102192.168.144.25:8554/main.26462°Siyi ZR303192.168.144.25:8554/main.26458°Siyi ZT30 Zoom4192.168.144.25:8554/video258°Siyi ZT30 Wide5192.168.144.25:8554/video285°Siyi ZT30 IR6192.168.144.25:8554/video124°Siyi ZT6 RGB7192.168.144.25:8554/video285°Siyi ZT6 IR8192.168.144.25:8554/video132°Herelink WifiAP9192.168.42.1:8554/fpv_stream50°通用兜底Herelink USB-tethering10192.168.42.129:8554/fpv_stream50°通用兜底Topotek 1080p11192.168.144.108:554/stream050°Topotek 480p12192.168.144.108:554/stream150°Viewpro13192.168.2.119:554无后缀50°通用兜底注意Siyi 系列热成像与可见光采用不同码流路径/video1与/video2选择型号时务必区分 Zoom/Wide/RGB/IR 变体Herelink 与 Viewpro 未在脚本中显式设置hfov此时使用脚本顶部的通用默认值 50°video-stream-information.lua可用VID1_HFOV覆盖。六、URI 构造逻辑与典型配置示例URI 的最终形态由相机型号默认值、用户覆盖参数与VID1_TYPE三者共同决定逻辑如下video-stream-information.lua-- 任一 IP 八位组或端口 0 时用用户值拼出 ip:port uri_ip floor(IPADDR0) .. . .. floor(IPADDR1) .. . .. floor(IPADDR2) .. . .. floor(IPADDR3) .. : .. floor(IPPORT) if TYPE RTPUDP or TYPE MPEG_TS then -- 需要 VID1_IPPORT 0否则报错 check VID1_IPPORT uri tostring(IPPORT) elseif TYPE RTSP then -- 需要 IP 非空否则报错 check VID1_IPADDR params uri rtsp:// .. uri_ip .. uri_suffix else -- TCP_MPEG uri uri_ip .. uri_suffix end6.1 示例一Siyi ZT30 可见光最简单只设置型号其余保持默认VID1_CAMMODEL 5 (Siyi ZT30 Wide) VID1_TYPE 0 (RTSP)生成的 URIrtsp://192.168.144.25:8554/video2HFOV 自动取 85°。6.2 示例二自定义 IP 的 RTSP 流假设云台 IP 改为10.0.0.50端口不变VID1_CAMMODEL 1 (Siyi A8) VID1_IPADDR0 10 VID1_IPADDR1 0 VID1_IPADDR2 0 VID1_IPADDR3 50 VID1_IPPORT 8554生成的 URIrtsp://10.0.0.50:8554/main.264默认后缀/main.264仍来自型号预置。6.3 示例三RTP UDP 纯端口模式VID1_TYPE 1 (RTPUDP) VID1_IPPORT 5000此时脚本校验VID1_IPPORT必须大于 0否则发送video-stream-information:check VID1_IPPORT错误提示并提前返回校验通过后 URI 直接为端口字符串5000。6.4 校验失败时的行为脚本会在两种情况下通过gcs:send_text()发送 ERROR 级文本前缀video-stream-information:RTPUDP/MPEG_TS 类型但VID1_IPPORT未设置 →check VID1_IPPORTRTSP 类型但最终 IP 为空型号未知且 IP 参数均未设置→check VID1_IPADDR params。这两种提示是排查配置问题的重要线索。七、消息字段与地面站验证脚本构造的mavlink_video_stream_information_t消息体字段如下video-stream-information.luastream_idVID1_IDcount硬编码为 1本脚本只描述单路视频流type、flags、framerate、resolution_h、resolution_v、bitrate、encoding分别取自对应VID1_*参数rotation硬编码为 0视频图像顺时针旋转角本脚本不支持配置hfov为计算后的水平视场角型号默认值或VID1_HFOV覆盖值name固定为字符串Videouri为按第六节逻辑构造的流地址。验证步骤在 Mission Planner / QGroundControl 等地面站的 MAVLink Inspector 中筛选VIDEO_STREAM_INFORMATION消息确认uri字段与相机实际流地址一致随后地面站应能基于该 URI 拉流并显示实时画面。由于脚本每 5 秒刷新一次参数改动无需重启飞控即可在地面站观察到更新。八、前置条件与常见问题编译宏依赖AP_CAMERA_INFO_FROM_SCRIPT_ENABLED与AP_MAVLINK_MSG_VIDEO_STREAM_INFORMATION_ENABLED必须同时开启默认固件通常满足消息发送代码见 AP_Camera_Backend.cpp同时确保AP_CAMERA_SCRIPTING_ENABLED生效以便camera:绑定可用。脚本功能未启用检查SCR_ENABLE是否为 1并在设置后重启飞控。脚本未加载确认 video-stream-information.lua 已放入scripts目录且文件名正确加载成功时地面站会收到video-stream-information script loaded提示。URI 错误优先核对VID1_CAMMODEL是否正确不同型号的码流路径与 FOV 差异很大再核对 IP 四段与端口RTSP 类型下 URI 为空会触发check VID1_IPADDR params报错。RTPUDP/MPEG_TS 类型报错确认VID1_IPPORT已设置为有效端口否则脚本会拒绝构造消息。网络连通性脚本只负责上报 URI实际拉流仍需飞控所在局域网与相机云台网络互通请先确认相机 IP 可 ping 通。九、总结video-stream-information.lua是 ArduPilot 脚本体系中用参数驱动 MAVLink 消息的典型范例15 个VID1_*参数通过脚本参数表注入飞控参数系统运行时按相机型号套用默认值、按用户覆盖重算 URI最终经 AP_Camera 库周期性向地面站广播VIDEO_STREAM_INFORMATION。掌握本文的参数含义、型号预置表与 URI 构造逻辑后即可在任意支持脚本的 ArduPilot 载具上快速实现图传画面在地面站的自动发现与播放。【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表