联系作者QQ 843230304
本文翻译自 https://mavlink.io/en/services/image_transmission.html
Mavlink图像传输协议
-
图像传输协议使用MAVLink作为通信通道,以将任何类型的图像(原始图像,Kinect数据等)从一个MAVLink节点传输到另一个节点。它基本上会拍摄实时摄像机图像,将其分成小块,然后通过MAVLink发送。
-
本主题描述了图像流功能如何工作,并涵盖了通信协议和实现细节(针对车辆和QGroundControl)。
在撰写本文时(2018年3月),该协议主要用于将图像从车辆传输到QGroundControl(以显示用于聚焦的PX4 Flow图像)。该协议还可以用于发送任何其他文件类型。
通信
图像流组件使用两条MAVLink消息:握手消息DATA_TRANSMISSION_HANDSHAKE,以启动,控制和停止图像流;数据容器消息ENCAPSULATED_DATA来传输图像数据。
1.通信由QGroundControl发起,并带有启动流的请求。为此,必须在MAVLink消息中设置以下字段:
- target:目标MAV的ID,
- state:为0的请求,
- id:图像流的ID,
目前,图像流媒体仅支持每种图像类型一个流,因此要求您将设置id为与该type字段相同的整数。
- type:任何在枚举类型的MAVLINK_DATA_STREAM_TYPE在mavlink.h,
- freq:大于0表示“每秒帧数”,小于0表示“每秒帧数”
可以要求特定的图像质量。为此,您必须设置“质量”字段。在初始请求中,所有其他字段应为零。
1.当目标MAV收到握手请求时,它会发回确认并以请求的帧速率启动图像流。握手ACK数据包通常包含与GCS请求的值相同的值(state由于是ACK,因此设置为1),并添加有关下一个发送图像大小的数据:
- 该字段packets包含MAVLink ENCAPSULATED_DATA数据包的数量,
- 该字段payload指定每个数据包有效载荷的大小(通常为252个字节),
- 并且该size字段指定图像大小(以字节为单位)。
2.然后将图像数据拆分为多个块,以适合常规的MAVLink消息。然后将它们打包成ENCAPSULATED_DATA数据包并通过MAVLink发送。每个数据包都包含一个序列号及其所属的图像流的ID。现在,图像流处理器会定期发送新图像,不需要进一步的交互。每一个新的形象带有一个新的DATA_TRANSMISSION_HANDSHAKE与更新的图像ACK包size,packets和payload领域。在此ACK数据包之后,新图像将作为一系列ENCAPSULATED_DATA数据包到达。
对于流的每个新图像,序列号都从0开始。
用法/配置
要使用MAV上的两个模块,必须执行以下步骤:
- 编译mavconn您的MAV中间件:指南,Github上。
- 在MAV上至少启动以下组件:
px_mavlink_bridge_udp &
px_system_control --heartbeat &
px_camera -o lcm &
- 编译并启动QGroundControl。
- 启动图像流组件(你可以添加-v标志,以看到更多的输出)px_imagestreamer。
- 启动图像流:打开HUD小部件,右键单击该小部件,然后选择启用实时图像流。
现在,您应该能够以每秒一幅图像的速度观看实时视频供稿(默认情况下,目前为硬编码)。
开发者
现成的图像流组件仅实现相机图像的JPEG流。要实现自己的图像流,您必须执行以下操作:
- 编写一个MAVLink处理程序,该处理程序处理启动所选类型图像流的请求。
- 编写一个数据处理程序,该处理程序将获取所需的数据(即,立体摄像机图像),将其编码为您选择的格式(即,原始图像,JPEG,BMP),然后通过MAVLink分割/发送数据。
- 扩展QGroundControl的UAS组件中的数据/消息处理程序以正确处理您的数据(即,解压缩所选格式)。
- 编写或扩展小部件以根据您的意愿显示数据。