mavlink增加自定义消息

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。

  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用`node-mavlink`库解析Mavlink消息,您可以按照以下步骤进行操作: 1. 首先,确保已经安装了`node-mavlink`库。可以使用以下命令通过npm进行安装: ```shell npm install node-mavlink ``` 2. 在您的代码文件中,导入`node-mavlink`库: ```typescript import { MavLinkPacketParser, MavLinkPacket, MavLinkMessage } from 'node-mavlink'; ``` 3. 创建一个`MavLinkPacketParser`实例: ```typescript const parser = new MavLinkPacketParser(); ``` 4. 将收到的Mavlink数据包传递给`parser.parseBuffer`方法进行解析,并获取解析后的消息: ```typescript const buffer = Buffer.from(receivedPacketData); // 替换为您收到的Mavlink数据包 const packets: MavLinkPacket[] = parser.parseBuffer(buffer); ``` 5. 对于每个解析出来的数据包,您可以通过`packet.payload`属性获取消息的有效负载,并将其转换为特定的Mavlink消息类型: ```typescript for (const packet of packets) { const message: MavLinkMessage = packet.payload; // 根据具体的消息类型进行处理 switch (message.messageId) { case 1: // 根据消息ID进行处理 // 处理消息类型为1的消息 break; case 2: // 处理消息类型为2的消息 break; // 其他消息类型的处理... } } ``` 请注意,上述示例代码只是一个基本的模板,您需要根据您的实际需求和消息类型进行适当的处理。您可以参考`node-mavlink`库的文档以获取更多关于消息解析和处理的详细信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值