ardupilot之添加mavlink消息

本文详细介绍了如何在ardupilot中添加并发送自定义的mavlink消息。首先分析了arducopter发送mavlink消息的过程,从时间片调度到消息生成和发送。接着,通过编辑ardupilotmega.xml文件,添加新的mavlink消息,并使用mavlink generator生成库。最后,说明了如何在代码中调用新消息并在地面站连接后进行测试验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文是这篇文章的复现:http://www.sohu.com/a/213599378_175233

一、mavlink分析

  Mavlink 的全称是Micro Air Vehicle link,pixhawk把它作为与地面站通信的手段。有了它通信变的有序且简洁。使用需要花些心思,这里给出pixhawk飞控中arducopter代码是如何利用mavlink发送消息,并且更新xml文件通过mavlink generator生成新的消息并发送出来。

1.arducopter发送mavlink消息分析

这里给出arducopter是如何发送mavlink消息的。

首先在arducopter代码上层会通过时间片管理调用多个任务,其中就包括mavlink消息的发送。

ArduCopter.cpp中时间列表调度里如下图所示:
这里写图片描述

其中SCHED_TASK(gcs_data_stream_send, 50, 550)为主要的数据流发送部分

跟踪其函数到GCS_Mavlink.cpp中

void Copter::gcs_data_stream_send(void)

### ArduPilot 接收自定义 MAVLink 消息实现方法 为了使 ArduPilot 能够接收并处理自定义的 MAVLink 消息,需完成几个关键步骤。这些步骤涉及修改源代码中的特定文件来注册新消息及其对应的处理器函数。 #### 注册新的 MAVLink 消息 ID 和映射关系 在 `GCS_MAVLINK` 类中找到成员函数 `mavlink_id_to_ap_message_id()` 的定义位置,在此函数内部存在一个静态结构体数组用于建立标准 MAVLink 消息ID到本地枚举类型之间的对应表。对于新增的消息项 `{ MAVLINK_MSG_ID_MAV_MESSAGE_TEMP_TEST, MSG_MAV_MESSAGE_TEMP_TEST}` 应当被加入该表格内以便于后续解析流程识别来自地面站或其他节点发送过来的新类型数据包[^1]。 ```cpp static const struct { uint32_t mavlink_id; ap_message msg_id; } map[] = { ... { MAVLINK_MSG_ID_MAV_MESSAGE_TEMP_TEST, MSG_MAV_MESSAGE_TEMP_TEST }, // 自定义的mavlink }; ``` #### 定义消息常量与处理逻辑 编辑 `ap_message.h` 文件并向其中添加代表新消息类型的枚举值 `MSG_MAV_MESSAGE_TEMP_TEST`, 同时注意保持原有格式不变即每条记录之间保留逗号分隔符[^2]: ```c++ typedef enum PACKED { ... MSG_MAV_MESSAGE_TEMP_TEST, ... } ap_message; ``` 接着针对所创建的具体应用需求编写相应的业务逻辑代码片段,通常情况下会放置于飞行控制器固件项目下的某个合适模块里作为独立的方法实现;假设这里是以读取传感器深度信息为例,则可以在适当的位置声明如下接口原型: ```cpp void send_depth() const; ``` 最后一步是在实际接收到指定编号的数据帧之后触发调用上述预设好的回调入口点执行必要的操作序列,这一般通过重载基类虚函数的方式达成目的——每当有匹配成功的事件发生时就会自动激活关联的动作链路从而达到预期效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值