# MAVLink 消息传送
MAVLink (打开新窗口) 是一个非常轻量级的消息传输协议,专为无人机生态系统设计。
PX4 的用途 MAVLink 沟通 QGroundControl (和其他地面站),以及作为与飞行控制器以外的无人机组件连接的集成机制:配套计算机、支持 MAVLink 的相机等。
该协议定义了一系列标准 信息 (打开新窗口) 和 微服务 (打开新窗口) 用于交换数据(PX4 中实现了许多(但不是全部)信息/服务)。
本教程介绍如何为自己的新 "custom" 消息添加 PX4 支持。
备注
本教程假定您拥有 自定义 uORB ca_trajectory
信息中 msg/ca_trajectory.msg
和定制的 MAVLink ca_trajectory
信息中 mavlink/include/mavlink/v2.0/custom_messages/mavlink_msg_ca_trajectory.h
.
# 定义自定义 MAVLink 信息
MAVLink 开发人员指南介绍了如何定义新信息并将其构建到新的编程专用库中:
您的信息需要作为 MAVLink 2 的 C 语言库生成。一旦您 已安装 MAVLink (打开新窗口) 您可以在命令行中使用该命令来完成此操作:
python -m pymavlink.tools.mavgen --lang=C --wire-protocol=2.0 --输出=generated/include/mavlink/v2.0 message_definitions/v1.0/custom_messages.xml
为方便使用/测试,您可以将生成的标头复制到 PX4-Autopilot/mavlink/include/mavlink/v2.0.
为方便他人测试您的更改,更好的办法是将生成的头文件添加到 https://github.com/mavlink/c_library_v2 的 fork 中。然后,PX4 开发人员可以在构建之前将子模块更新为 PX4-Autopilot repo 中的分叉。
# 发送自定义 MAVLink 信息
本节将介绍如何使用自定义 uORB 信息并将其作为 MAVLink 信息发送。
将 MAVLink 和 uORB 信息的标题添加到 mavlink_messages.cpp (打开新窗口)
#包括 <uORB/topics/ca_trajectory.h>;
#包括 <v2.0/custom_messages/mavlink.h>;
在 mavlink_messages.cpp (打开新窗口)
类 MavlinkStreamCaTrajectory : 公共 MavlinkStream
{
公:
缢 烧焦 *获取名称() 缢
{
返回 MavlinkStreamCaTrajectory::获取静态名称();
}
天电 缢 烧焦 *获取静态名称()
{
返回 "CA_TRAJECTORY";;
}
天电 uint16_t get_id_static()
{
返回 mavlink_msg_id_ca_trajectory;
}
uint16_t 获取()
{
返回 get_id_static();
}
天电 MavlinkStream *新实例(Mavlink *多点连接)
{
返回 新 MavlinkStreamCaTrajectory(多点连接);
}
无符号 get_size()
{
返回 mavlink_msg_id_ca_trajectory_len + mavlink_num_non_payload_bytes;
}
私人:
uORB::订阅 _sub{ORB_ID(ca_trajectory)};
/* 不允许在顶部复制该类 */
MavlinkStreamCaTrajectory(MavlinkStreamCaTrajectory 及样品;);
MavlinkStreamCaTrajectory及样品; 操作员 = (缢 MavlinkStreamCaTrajectory 及样品;);
受保护的:
不含糊 MavlinkStreamCaTrajectory(Mavlink *多点连接) : MavlinkStream(多点连接)
{}
bool 发送() 否决
{
结构 ca_traj_struct_s _CA_轨迹; //确保 ca_traj_struct_s 是你的 uORB 主题的定义
如果 (_子.更新(及样品;_CA_轨迹)) {
mavlink_ca_trajectory_t _msg_ca_轨迹; //确保 mavlink_ca_trajectory_t 是自定义 MAVLink 消息的定义
_msg_ca_轨迹.时戳 = _CA_轨迹.时戳;
_msg_ca_轨迹.开始时间 = _CA_轨迹.开始时间;
_msg_ca_轨迹.停止时间 = _CA_轨迹.停止时间;
_msg_ca_轨迹.系数 =_CA_轨迹.系数;
_msg_ca_轨迹.seq_id = _CA_轨迹.seq_id;
mavlink_msg_ca_trajectory_send_struct(_mavlink->;获取频道(), 及样品;_msg_ca_轨迹);
返回 真;
}
返回 错误;
}
};
最后将流类附加到 流列表
在
mavlink_messages.cpp (打开新窗口)
StreamListItem *流列表[] = {
...
创建流列表项目<;MavlinkStreamCaTrajectory>;(),
...
然后确保启用数据流,例如在 启动脚本 例如 /ROMFS/px4fmu_common/init.d-posix/rcS (打开新窗口) 或 ROMFS/px4fmu_common/init.d-posix/rcS (打开新窗口))对海丰国际信托有限公司的影响。注意 -r
配置流传输速率和 -u
确定 UDP 端口 14556 上的 MAVLink 通道)。
mavlink stream -r 50 -s CA_TRAJECTORY -u 14556
TIP
您可以使用 uorb top [<信息名称>]
命令来实时验证信息是否已发布以及发布率(请参阅 uORB 消息传送).这种方法也可用于测试发布 uORB 主题的传入信息(对于其他信息,可使用 printf
并在 SITL 中进行测试)。
要在 QGroundControl 您需要 用您的 MAVLink 库构建它 (打开新窗口)然后使用 MAVLink 检查器小工具 (打开新窗口) (或其他 MAVLink 工具)。
# 接收自定义 MAVLink 信息
本节介绍如何通过 MAVLink 接收信息并将其发布到 uORB。
添加一个函数,用于在 mavlink_receiver.h (打开新窗口)
#包括 <uORB/topics/ca_trajectory.h>;
#包括 <v2.0/custom_messages/mavlink_msg_ca_trajectory.h>;
添加一个函数,在 MavlinkReceiver
类中
mavlink_receiver.h (打开新窗口)
空白 处理 CA_trajectory_msg 消息(mavlink_message_t *信息);
在 MavlinkReceiver
类中
mavlink_receiver.h (打开新窗口)
uORB::出版物<;ca_trajectory_s>; _flow_pub{ORB_ID(ca_trajectory)};
实施 处理 CA_trajectory_msg 消息
在 mavlink_receiver.cpp (打开新窗口)
空白 MavlinkReceiver::处理 CA_trajectory_msg 消息(mavlink_message_t *信息)
{
mavlink_ca_trajectory_t traj;
mavlink_msg_ca_trajectory_decode(信息, 及样品;traj);
结构 ca_traj_struct_s f;
memset(及样品;f, 0, 尺寸(f));
f.时戳 = hrt_absolute_time();
f.seq_id = traj.seq_id;
f.开始时间 = traj.开始时间;
f.停止时间 = traj.停止时间;
对于(int i=0;i<;28;i++)
f.系数[i] = traj.系数[i];
_ca_traj_msg_pub.发布(f);
}
最后确保在 MavlinkReceiver::handle_message() (打开新窗口)
MavlinkReceiver::处理信息(mavlink_message_t *信息)
{
开关 (信息->;msgstr) {
...
个案 mavlink_msg_id_ca_trajectory:
处理 CA_trajectory_msg 消息(信息);
断裂;
...
}
# 创建自定义 MAVLink 信息的替代方案
有时需要定制 MAVLink 信息,其内容尚未完全定义。
例如,当使用 MAVLink 连接 PX4 和嵌入式设备时,自动驾驶仪和设备之间交换的信息可能会经过多次反复,才能稳定下来。在这种情况下,重新生成 MAVLink 标头并确保两台设备使用相同版本的协议既耗时又容易出错。
另一个临时解决方案是重新利用调试信息。而不是创建一个自定义的 MAVLink 消息 CA_TRAJECTORY
您可以发送信息 DEBUG_VECT
用字符串键 CA_TRAJ
中的数据 x
, y
和 z
领域。参见 本教程调试信息的使用示例。
备注
该解决方案通过网络发送字符串并涉及字符串比较,因此效率不高。它只能用于开发!
# 一般情况
# 设置流速率
有时,提高单个主题的流速率(例如在 QGC 中进行检查)非常有用。这可以通过在 shell 中键入以下一行来实现:
mavlink stream -u <;端口号>; -s <;mavlink 主题名称>; -r <;费率>;
您可以使用 mavlink 状态
将输出(其中包括) 传输协议:UDP(<端口号>)。
.例如
mavlink stream -u 14556 -s OPTICAL_FLOW_RAD -r 300