mavlink增加自定义消息

2023-05-16

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。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mavlink增加自定义消息 的相关文章

  • 化繁为简,一张图看懂梯度、散度、旋度、Jacobian、Hessian和Laplacian

    点击上方 计算机视觉工坊 xff0c 选择 星标 干货第一时间送达 作者 xff5c 王赟 Maigo 64 知乎 xff08 已授权 xff09 来源 xff5c https zhuanlan zhihu com p 35323714 编
  • 一文详解PnP算法原理

    PnP Perspective n Point 问题的几何结构如图1所示 xff0c 给定3D点的坐标 对应2D点坐标以及内参矩阵 xff0c 求解相机的位姿 数学语言描述如下 xff1a 图1 PnP几何结构 1 直接线性变换法 Dire
  • 多传感器数据标定融合完整教程:时间同步+空间同步(Camera+Lidar+IMU+Radar)

    多传感器融合是一项结合多传感器数据的综合性前沿内容 xff0c 主要包括Camera 激光雷达 IMU 毫米波雷达等传感器的融合 xff0c 在自动驾驶 移动机器人的感知和定位领域中占有非常重要的地位 xff1b 随着AI技术的大规模落地
  • 机器人抓取—— 相机参数与标定 camera_calibration

    点击上方 计算机视觉工坊 xff0c 选择 星标 干货第一时间送达 整理丨古月居 相机的参数 参考 xff1a https blog csdn net weixin 43206570 article details 84797361 摄像机
  • ROS下面调用自定义的头文件和.cpp/.so文件(亲测有效)

    前言 ROS下面使用已经编译好的ROS package是很方便的 xff0c 但是大多数我们可能自己定义了一些头文件 xff0c 想去直接引用 xff0c 那么如何在ROS下面调用自己的定义的函数呢 xff1f ROS下调用自定义的头文件
  • catkin_make和cmake

    catkin make是ROS下面的一种编译方式 xff0c 基于cmake xff0c 但是又不同于cmake cmake只能编译指定的package xff0c 但是不同package之间的关系没办法链接 xff0c 而且cmake只能
  • UNIX date命令简介

    date 命令 参数含义 xff1a a xff1a 显示星期简写 Sun Sat A xff1a 显示完整星期 Sunday Saturday b xff1a 显示月份简写 Jan Dec B xff1a 显示完整月份 January D
  • NVIDIA JETSON XAVIER NX烧录(emmc版本)

    目录 0 前言 1 安装虚拟机 2 安装SDKManager 3 使用SDK Manager开始烧录 4 配置系统 5 开发环境的安装 xff08 CUDA xff09 6 遇到问题记录 xff08 如果有其它问题可以留言我补充 xff09
  • NVIDIA JETSON XAVIER NX烧录(sd版本)

    0 前言 本文主要补充上文提到的sd卡版本烧录Jetson Xavier Nx系统的 xff0c 需要准备的东西 一张空白SD卡balenaEtcher工具 JETSON XAVIER NX 开发者套件的SD镜像 xff08 官网下载 xf
  • NVIDIA JETSON XAVIER NX 从SSD盘启动

    0 前言 本文主要补充上文提到的Jetson Xavier Nx系统从ssd盘启动 xff0c 需要准备的东西 xff1a 提前把ssd卡装上Jetson Xavier Nx套件上 xff0c 如下图 1 格式化为GPT 打开ubuntu的
  • 在linux虚拟机上安装docker

    1 简介 Docker是一个开源的应用容器引擎 xff1b 是一个轻量级容器技术 xff1b Docker支持将软件编译成一个镜像 xff1b 然后在镜像中各种软件做好配置 xff0c 将镜像发布出去 xff0c 其他使用者可以直接使用这个
  • win11虚拟机如何安装 Windows11虚拟机安装步骤教程

    想要体验下最新的win11系统 但是又不想在实体机上安装 担心出现系统故障问题怎么办 我们可以通过虚拟机安装win11系统实现 下面小编就教下大家虚拟机如何安装win11系统 更多Windows11系统教程可以参考小白一键网 1 下载安装好
  • Win11如何开启移动热点?Win11开启移动热点的方法

    在Win10系统之后就有了一个移动热点功能 xff0c 这在Win11系统也不例外 xff0c 不过很多小伙伴并不清楚Win11系统中的移动热点功能如何开启 xff0c 那么下面就和小编一起来看看Win11开启移动热点的方法 xff0c 有
  • 交换机组建局域网

    说来惭愧 xff0c 今天才搞明白用交换机组建局域网的原理 xff0c 这里介绍方法 xff1a 平时使用的路由器有交换机的功能 xff0c 单纯使用交换机还是第一次 xff1a 1 将所有电bai脑连到同一台交换机上 xff0c du即将
  • mavros 使用经验记录

    我用的飞控硬件板是pixhawk xff0c 用missionplanner刷的fight stack是apm的最新版本3 4 amp对mavros支持不是特别好 xff0c 如果合适还是用px4的flight stack 比较好 xff0
  • ros catkin_make 出现add_custom_target cannot create target 错误

    今天用catkin make编译ros包出现如下错误 CMake Error at home liwei work catkin ws land build mycommbase cmake mycommbase genmsg cmake
  • mavros使用经验记录二

    项目是一个无人机视觉追踪功能 xff0c 无人机上的协从计算机通过串口连接到飞控的tel2 接收mavlink消息流 xff0c 协计算机将此mavlink流进行udp转发到地面站 xff0c 同时协计算机实时的进行图像处理 xff0c 将
  • Unix Shell中单引号、双引号字符、反斜杠、反引号的使用

    在执行shell脚本的时候 xff0c shell将会对脚本中的行进行解释 xff0c 然后执行 xff1b 对于一些特殊处理的句子 xff0c 我们可以使用引号或者反斜线来避免shell解释执行之 如下 xff0c 当在命令行中输入 xf
  • TX2 Ubuntu 系统默认root用户登录 (永久权限)

    操作简单 xff0c 亲测可行 xff0c 不需要写啥脚本 https jingyan baidu com article 6181c3e0780131152ef153ff html
  • nginx部署多个vue项目的2种方法

    第一种 同一个域名或者ip 相同端口号 部署多个项目 通过斜线访问 http 10 16 xx 23 student http 10 16 xx 23 先看这2种配置 查找nginx 和配置文件 whereis nginx 查看配置文件 v

随机推荐