本节介绍 ArduPilot 项目中添加MAVLink消息步骤和测试方法,并且演示WireShark网络监控调试工具使用方法。
一、添加MAVLink消息(ArduPilot)1.1 添加消息定义(修改 XML 文件)1.1.1 修改 ardupilotmega.xml1.1.2 编译 ./waf sub1.1.3 查看生成文件1.2 添加代码到飞行器代码中1.2.1 包含新生成的消息头文件1.2.2 添加发送接口 GCS_Common.cpp1.3 烧录测试二、使用WireShark调试MAVLink2.1 基础使用2.2 高级使用2.2.1 捕获MAVLink流2.2.2 捕获远程机器tcpdump数据流到本地WireShark2.2.3 使用Wireshark测量MAVLink数据速率引用
一、添加MAVLink消息(ArduPilot)
下面是添加MavLink消息的总体步骤:
1.1 添加消息定义(修改 XML 文件)
个人使用,或者仅仅适用于ardupilot,消息添加到ardupilotmega.xml。
1.1.1 修改 ardupilotmega.xml
在modules/mavlink/message_definitions/v1.0/ardupilotmega.xml 文件末尾新添如下消息:
1.1.2 编译 ./waf sub
1.1.3 查看生成文件
在
build/fmuv3/libraries/GCS_MAVLink/include/mavlink/v2.0/ardupilotmega/
路径下生成MAVLink库文件(已在上一节说明),新添XML消息生成对应头文件mavlink_msg_test_battery.h
。
1.2 添加代码到飞行器代码中
将头文件函数添加到合适位置。
1.2.1 包含新生成的消息头文件
头文件的引用链如下:GCS_MAVLink.h → mavlink.h → all.h → ardupilotmega.h → mavlink_msg_test_battery.h。因此只要包含libraries/GCS_MAVLink/GCS_MAVLink.h即可包含底层头文件。
1.2.2 添加发送接口 GCS_Common.cpp
- 仿照 send_battery_status() 添加 send_test_battery() 接口(测试数据采取固定数值)。
- 在 libraries/GCS_MAVLink/ap_message.h 中 ap_message 枚举数据末尾添加 MSG_TEST_BATTERY 消息ID(注意这个消息和XML文件定义的<message id="11045" name="Test_Battery"> 不是同一个值)
- 将 send_test_battery 添加到 try_send_message (返回上一节查看,这里添加到最后一个,default前)
1.3 烧录测试
烧录固件后,重新插拔(若你使用虚拟机,可以更改USB设备挂载位置,从虚拟机移到PC上)。
需要将飞控先与mission planner连接,否则一直发应答包,不会发数据包,检测不到。与地面站连接后,关闭地面站,打开串口调试助手获取16进制数据,拷贝到文档中搜索查验。
message id="11045" ,转化为16进制 0x2B25,传输使用小端序,搜索
25 2B 00
(24Bits)
- time_unix_usec: 2000 → 00 00 00 00 00 00 07 D0
- time_boot_ms: 1000 → 00 00 03 EB
- voltage_battery:12 → 00 0C
笔者希望通过Wireshark调试新添加协议,但却监测不到,这里挖一坑。
二、使用WireShark调试MAVLink
本小节可了解Lua脚本生成过程,如何导入WireShark协助调试。
2.1 基础使用
- 为 Wireshark生成Lua脚本
- 更新脚本端口
文件的最后几行指定了要监控的端口。
前两个端口是用来监控模拟自动驾驶仪与地面控制站(GCS)和外部API之间的网络流量的正确端口。最后一个端口(18570)可以用来监控在WSL2中运行的模拟。
如果你想监控其他接口,可以修改或添加这些行,然后保存插件文件。这在某些情况下是必要的,比如要监控同伴计算机和飞行控制器之间的流量记录。

- 脚本导入WireShark
- 将Lua脚本复制到 Wireshark 插件目录中。
- On Linux systems this might be:
~/.local/lib/wireshark/plugins
(or~/.wireshark/plugins
for older versions of Wireshark). Note that users will need to be added to thewireshark
group to use the tool.) - On Windows this might be:
Program Files/Wireshark/plugins
. - 打开Wireshark,然后依次点击菜单:帮助 > 关于Wireshark > 插件
应该能在列表中找到刚刚添加的插件。

- 在Wireshark中查看流量
- 选择用于环回流量捕获的适配器(举例说明,实际使用视实际情况选择)。
- 设置过滤器框 mavlink_proto && not icmp


- 使用MAVLin属性进一步过滤
2.2 高级使用
2.2.1 捕获MAVLink流
在Linux上,你可以使用tcpdump在特定接口上捕获流。这可以在你的笔记本电脑或地面计算机上执行:
2.2.2 捕获远程机器tcpdump数据流到本地WireShark
- 远程机器上必须安装tcpdump。
- 若你能够通过SSH访问远程机器时,则可将tcpdump流传输到本地机器。Wireshark可以打开这个流,并使用上面的工具和过滤器显示解码后的MAVLink消息。
2.2.3 使用Wireshark测量MAVLink数据速率
在Wireshark中设置好插件并开始捕获数据流后,你可以使用Wireshark的IO图表来监控整个数据流或特定消息的消息速率。
为此,你需要进入统计信息 > I/O图表,接着会出现一个新窗口。现在你会看到你正在分析的所有数据包的数据速率图。你可以使用普通的Wireshark过滤器,也可以使用LUA脚本引入的新MAVLink过滤器。
建议将y轴更改为比特或字节,并将x轴缩小到10毫秒或更快,以获得有意义的图表。

