mavlink增加自定义消息

本文详细介绍了如何在开源飞控如PX4和APM中创建自定义MAVLink消息,包括添加debug_vect_one消息的步骤、配置XML文件、生成C语言源文件,以及如何在代码中发送和集成这些自定义消息。重点在于实战指导和关键代码片段。

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

mavlink作为PX4以及APM两大开源飞控的通讯协议,应用非常广泛。在进行开源飞控二次开发时,增加自定义消息非常普遍。比如在offboard模式下,将视觉避障信息或者雷达信息发送给飞控,这时候就需要在mavlink中自定义一些消息了。

  • 创建一个自定义MAVLink消息
    在/msg文件夹下面添加debug_vect_one.msg,添加内容如下

    1

    2

    3

    4

    5

    6

    uint64 timestamp    # time since system start (microseconds)
    float32 x               # x value
    float32 y               # y value
    float32 z               # z value

    先自定义在mavlink/message_definitions/v1.0下创建自定义消息debug_vect_one.xml文件,与debug_vect_one.msg中结构一致,内容如下:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    <?xml version="1.0"?>
    <mavlink>
      <version>3</version>
      <messages>
        <message id="1001" name="DEBUG_VECT_ONE">
          <description>Test all field types</description>
          <field type="uint64_t" name="timestamp">uint64_t</field>
          <field type="float" name="x">float</field>
          <field type="float" name="y">float</field>
          <field type="float" name="z">float</field>
        </message>
      </messages>
    </mavlink>

    注意需要添加一个timestamp的成员,因为在编译时为了记录,会增加一个timestamp的成员。然后使用mavlink generator生成c语言源文件。

  • 1.去git 官网上下载源码

         git clone https://github.com/mavlink/mavlink.git

    2.进入代码目录并更新子模块

         cd mavlink

         git submodule update --init --recursive

    3.编译并运行python脚本

        python -m mavgenerate

    完成以上步骤即可。

    XML文件定位可以直接定位到mavlink/message_definitions/v1.0/debug_vect_one.xml,Out目录定位到mavlink,注意语言选择C,协议选择2.0,如下图所示:

    然后点击Generate即可生成c代码源文件。

  • 发送自定义MAVLink消息
    自定义信息的发送主要通过修改src/modules/mavlink/下的mavlink_messsages.cpp文件来实现。
    • 添加自定义消息的头文件

      1

      2

      #include <uORB/topics/debug_vect_one.h>

      并且在Common.h (\firmware\mavlink\include\mavlink\v2.0\common)   中添加#include "./mavlink_msg_debug_vect_one.h" 

      注意添加到已有包含文件的尾部,否则编译时可能会出现类型为定义的错误。

    • 创建自定义消息对应的类

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      39

      40

      41

      42

      43

      44

      45

      46

      47

      48

      49

      50

      51

      52

      53

      54

      55

      56

      57

      58

      59

      60

      61

      62

      63

      64

      65

      66

      67

      #if 1
      class MavlinkStreamDebugVectOne : public MavlinkStream
      {
      public:
          const char *get_name() const
          {
              return MavlinkStreamDebugVectOne::get_name_static();
          }

          static const char *get_name_static()
          {
              return "DEBUG_VECT_ONE";
          }

          static uint16_t get_id_static()
          {
              return MAVLINK_MSG_ID_DEBUG_VECT_ONE;
          }

          uint16_t get_id()
          {
              return get_id_static();
          }

          static MavlinkStream *new_instance(Mavlink *mavlink)
          {
              return new MavlinkStreamDebugVectOne(mavlink);
          }

          unsigned get_size()
          {
              return (_debug_time > 0) ? MAVLINK_MSG_ID_DEBUG_VECT_ONE_LEN + MAVLINK_NUM_NON_PAYLOAD_BYTES : 0;
          }

      private:
          MavlinkOrbSubscription *_debug_sub;
          uint64_t _debug_time;

          /* do not allow top copying this class */
          MavlinkStreamDebugVectOne(MavlinkStreamDebugVectOne &) = delete;
          MavlinkStreamDebugVectOne &operator = (const MavlinkStreamDebugVectOne &) = delete;

      protected:
          explicit MavlinkStreamDebugVectOne(Mavlink *mavlink) : MavlinkStream(mavlink),
              _debug_sub(_mavlink->add_orb_subscription(ORB_ID(debug_vect_one))),
              _debug_time(0)
          {}

          bool send(const hrt_abstime t)
          {
              struct debug_vect_one_s debug = {};

              if (1) {
                  mavlink_debug_vect_one_t msg = {};

                  msg.timestamp = debug.timestamp;
                  //memcpy(msg.name, debug.name, sizeof(msg.name));
                  /* enforce null termination */
                  //msg.name[sizeof(msg.name) - 1] = '\0';
                  msg.x = 1;
                  msg.y = 2;
                  msg.z = 3;

                  mavlink_msg_debug_vect_one_send_struct(_mavlink->get_channel(), &msg);

                  return true;
              }

              return false;
          }
      };
      #endif

    • 在附加流类中添加该自定义项

      1

      2

      3

      4

      5

      StreamListItem *streams_list[] = {

      ...

      StreamListItem(&MavlinkStreamDebugVectOne::new_instance, &MavlinkStreamDebugVectOne::get_name_static, &MavlinkStreamDebugVectOne::get_id_static)

      };

    • 在mavlink_main.cpp中加入自定义消息的更新频率:

      1

      configure_stream("DEBUG_VECT_ONE", 50.0f);  

  • 通过串口助手查看定义的新消息,其ID为1001

 E9 03即为新加的消息ID。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值