Lazy loaded image
三、实战-APM中添加MAVLink消息
Words 1844Read Time 5 min
2025-5-6
📃
本节介绍 ArduPilot 项目中添加MAVLink消息步骤和测试方法,并且演示WireShark网络监控调试工具使用方法。

一、添加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
notion image

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

  1. 仿照 send_battery_status() 添加 send_test_battery() 接口(测试数据采取固定数值)。
    1. 在 libraries/GCS_MAVLink/ap_message.h 中 ap_message 枚举数据末尾添加 MSG_TEST_BATTERY 消息ID(注意这个消息和XML文件定义的<message id="11045" name="Test_Battery"> 不是同一个值
      1. 将 send_test_battery 添加到 try_send_message (返回上一节查看,这里添加到最后一个,default前)
         

        1.3 烧录测试

        烧录固件后,重新插拔(若你使用虚拟机,可以更改USB设备挂载位置,从虚拟机移到PC上)。
        需要将飞控先与mission planner连接,否则一直发应答包,不会发数据包,检测不到。与地面站连接后,关闭地面站,打开串口调试助手获取16进制数据,拷贝到文档中搜索查验。
        message id="11045" ,转化为16进制 0x2B25,传输使用小端序,搜索 25 2B 00 (24Bits)
        notion image
        • 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
         
        新添加消息若要在QGC中查看测试,QGC需要同步更新协议。mission planner修改方法可参考这里,QGC参考这里
        笔者希望通过Wireshark调试新添加协议,但却监测不到,这里挖一坑。

        二、使用WireShark调试MAVLink

        本小节可了解Lua脚本生成过程,如何导入WireShark协助调试。

        2.1 基础使用

        1. 为 Wireshark生成Lua脚本
        1. 更新脚本端口
        文件的最后几行指定了要监控的端口。
        前两个端口是用来监控模拟自动驾驶仪与地面控制站(GCS)和外部API之间的网络流量的正确端口。最后一个端口(18570)可以用来监控在WSL2中运行的模拟。 如果你想监控其他接口,可以修改或添加这些行,然后保存插件文件。这在某些情况下是必要的,比如要监控同伴计算机和飞行控制器之间的流量记录。
        notion image
        1. 脚本导入WireShark
          1. 将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 the wireshark group to use the tool.)
              • On Windows this might be: Program Files/Wireshark/plugins.
          2. 打开Wireshark,然后依次点击菜单:帮助 > 关于Wireshark > 插件
            1. 应该能在列表中找到刚刚添加的插件。
              notion image
        1. 在Wireshark中查看流量
          1. 选择用于环回流量捕获的适配器(举例说明,实际使用视实际情况选择)。
            1. notion image
          2. 设置过滤器框 mavlink_proto && not icmp
            1. notion image
        1. 使用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毫秒或更快,以获得有意义的图表。
          notion image
           
           
          notion image
           

          引用

          1. Adding a new MAVLink Message — Dev documentation (ardupilot.org)(官方教程,操作性差)
            上一篇
            模板设计模式:让你的代码结构更清晰
            下一篇
            Guide to Linux System

            Comments
            Loading...