PX4自定义mavlink消息

2023-05-16

PX4自定义mavlink消息

承接前面UORB发布消息,然后现在要使用mavlink发布消息,然后通过433MHz进行无线传输。这个阶段对我来说异常艰难,我个人傻傻看了2天mavlink配置文件,一遍遍看代码,眼睛都看疼了,最后google看了一篇博客,发现竟然是没有把ID号导入到标准库里面(之前博客都没有这步操作,不知道是不是固件版本问题!)
本博客也是详细参考网络上诸多大神文章整合起来,希望对大伙们有所帮助。
1、打开我写的mavlink_generator生成器安装过程博客,按照我里面写的教程操作,安装完成。
2、在mavlink/message_definitions/v1.0目录下面新建一个名叫mytest.xml文件。
代码如下:

<?xml version="1.0"?>
<mavlink>
  <version>3</version>
  <messages>
    <message id="223" name="READ_UART_SENSOR">
      <description>Test all field types</description>
      <field type="char[10]" name="jingdustr">string</field>
      <field type="char[10]" name="weidustr">string</field>
      <field type="char[10]" name="hangsustr">string</field>
      <field type="char[10]" name="hangxiangstr">string</field>
      <field type="char[10]" name="fengsustr">string</field>
      <field type="char[10]" name="fengxiangstr">string</field>
      <field type="char[10]" name="wendustr">string</field>
      <field type="char[10]" name="shendustr">string</field>
      <field type="float" name="longitude">float</field>
      <field type="float" name="latitude">float</field>
      <field type="float" name="hang_su">float</field>
      <field type="float" name="hang_xiang">float</field>
      <field type="float" name="feng_su">float</field>
      <field type="float" name="feng_xiang">float</field>
      <field type="float" name="wen_du">float</field>
      <field type="float" name="shen_du">float</field>
    </message>
  </messages>
</mavlink>

对应位置如下图所示:
在这里插入图片描述

使用python -m mavgenerate打开mavlink消息生成器导入上面的xml文件,生成如下文件:custom_messages,然后会自动生成.h文件
,生成后的图片如下图:
在这里插入图片描述

将生成的custom_messages文件夹拖到Firmware/mavlink/include/mavlink/v2.0目录下,然后再将里面的mavlink_msg_read_uart_sensor.h文件移动到里面的common目录下面,如下图所示:
在这里插入图片描述

添加mavlink的头文件和uorb消息到mavlink_messages.cpp
在这里插入图片描述

PX4的mavlink.cpp中mavlinkstreamread_uart_sensor内容编写

class MavlinkStreamread_uart_sensor : public MavlinkStream
{
public:
        void update(orb_advert_t *mavlink_log_pub);
        const char *get_name() const
        {
                return MavlinkStreamread_uart_sensor::get_name_static();
        }

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

        static uint16_t get_id_static()
        {
                return MAVLINK_MSG_ID_READ_UART_SENSOR;
        }

        uint16_t get_id()
        {
                return get_id_static();
        }

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

        unsigned get_size()
        {
                return MAVLINK_MSG_ID_READ_UART_SENSOR_LEN + MAVLINK_NUM_NON_PAYLOAD_BYTES;
        }

private:
        MavlinkOrbSubscription *_read_uart_sensor_sub;
        uint64_t _read_uart_sensor_time;

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

protected:
        explicit MavlinkStreamread_uart_sensor(Mavlink *mavlink) : MavlinkStream(mavlink),
                _read_uart_sensor_sub(_mavlink->add_orb_subscription(ORB_ID(read_uart_sensor))),
                _read_uart_sensor_time(0)
        {}
           ~MavlinkStreamread_uart_sensor()
        {}

        bool send(const hrt_abstime t)
        {

                    read_uart_sensor_s orbtest = {};
            if(  _read_uart_sensor_sub->update(&_read_uart_sensor_time,&orbtest))
                   {__mavlink_read_uart_sensor_t msg = {};
                        msg.latitude  = orbtest.latitude;
                        msg.longitude = orbtest.longitude;
                        msg.hang_su   = orbtest.hang_su;
                        msg.hang_xiang= orbtest.hang_xiang;
                        msg.feng_su   = orbtest.feng_su;
                        msg.feng_xiang= orbtest.feng_xiang;
                        msg.wen_du    = orbtest.wen_du;
                        msg.shen_du   = orbtest.shen_du;
                        double a = msg.latitude;
                        double b = msg.longitude;
                        double c = msg.hang_su;
                        double d = msg.hang_xiang;
                        double e = msg.feng_su;
                        double f = msg.feng_xiang;
                        double g = msg.wen_du;
                        double h = msg.shen_du;
                        char a1[10];
                        char b1[10];
                        char c1[10];
                        char d1[10];
                        char e1[10];
                        char f1[10];
                        char g1[10];
                        char h1[10];
                        sprintf(a1,"%f",a);
                        sprintf(b1,"%f",b);
                        sprintf(c1,"%f",c);
                        sprintf(d1,"%f",d);
                        sprintf(e1,"%f",e);
                        sprintf(f1,"%f",f);
                        sprintf(g1,"%f",g);
                        sprintf(h1,"%f",h);
                        mavlink_log_info(&_pub,a1);
                        mavlink_log_info(&_pub,b1);
                        mavlink_log_info(&_pub,c1);
                        mavlink_log_info(&_pub,d1);
                        mavlink_log_info(&_pub,e1);
                        mavlink_log_info(&_pub,f1);
                        mavlink_log_info(&_pub,g1);
                        mavlink_log_info(&_pub,h1);
                        mavlink_msg_read_uart_sensor_send_struct(_mavlink->get_channel(), &msg);
                        return true;
                  }
         return false;
        }
};

附加流类streams_list的到mavlink_messages.cpp底部
在这里插入图片描述

最后在mavlink_main.cpp加入自定义的消息以及期望的更新频率,然后make_px4fmu-v2_default,就应该编译可以成功
在这里插入图片描述

这样你可以编译通过,但是会发生一件事情,在QGC的nsh中断中输入ls obj(不过要先写read_uart_sensor start,后面教自启动方法),始终不会出现mavlink对应的ID号。我试了很久,眼睛都看疼了,始终以为配置mavlink消息有误,最后通过google解决了这个问题。
1、先打开按照下面路径的文件的standard.h
2、再打开mytest.h在这里插入图片描述

打开之后接下来按照如下配置:
1、找到如下图mytest.h文件下MAVLINK_MESSAGE_CRCS号,然后复制出来
2、进入standard.h文件,然后按下图粘贴进去,把你里面重复的那个数字删除一个
在这里插入图片描述

然后配置自启动:
进入如下图所示的位置,看清楚左边代码行数对应位置加上read_uart_sensor start
在这里插入图片描述

这样就可以成功了,然后在QGC地面站的nsh终端输入ls obj,如果出现你所定义的对应ID号的名字那就意味着成功了!
在这里插入图片描述

成功之后可以用串口助手去读取mavlink消息

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

PX4自定义mavlink消息 的相关文章

  • 【2020-8-9】APM,PX4,GAZEBO,MAVLINK,MAVROS,ROS之间的关系以及科研设备选型

    0 概述 无人机自主飞行平台可以分为四个部分 xff1a 动力平台 xff0c 飞行控制器 xff0c 机载电脑和模拟平台 动力平台 xff1a 负责执行飞行任务 xff0c 包括螺旋桨 电机 机架等 xff0c 用于科研的一般都是F380
  • px4: v2的主板刷写v2的固件

    v2的主板刷写v2的固件 fengxuewei 64 fengxuewei Legion Y7000 2019 PG0 src Firmware changwei rc span class token function make span
  • PX4位置控制offboard模式说明

    offboard模式的开发及应用 一 px4固件的模式 px4固件支持10几种飞行模式 xff0c 从代码结构上分析 xff0c 分为基本模式 自定义模式和自定义子模式 1 基本模式 基本模式又分为 xff0c 位置控制模式 自稳模式 手动
  • QGC二次开发---自定义MAVLink消息

    MAVLink库下载 下载网站https github com mavlink mavlink 可以通过git工具 xff0c 在存放文件夹下打开git工具 xff0c 输入命令 xff1a git clone https github c
  • PX4代码学习系列博客(6)——offboard模式位置控制代码分析

    分析offboard模式的代码需要用到以下几个模块 local position estimator mavlink mc pos control mc att control mixer 程序数据走向 mavlink 一般的offboar
  • px4源码编译指南

    px4源码编译指南 强烈推荐大家去看官网的英文文档 xff0c 国内的博客杂七杂八 xff0c 官网的中文也很久没有更新 xff0c 这几天自己踩了很多坑 xff0c 写个教程希望能帮助到大家 xff08 本文选用平台是pixhawk1 1
  • PX4源代码下载编译

    sudo git clone https github com PX4 PX4 Autopilot git recursivegit submodule update init recursivegit submodule update r
  • 初学PX4之环境搭建

    文章转自 xff1a http www jianshu com p 36dac548106b 前言 前段时间linux崩溃了 xff0c 桌面进去后只有背景 xff0c 折腾好久没搞定 xff0c 为了节省时间索性重装了系统 xff0c 同
  • PX4 ---- Indoor Flight

    文章目录 室内飞行ROS amp PX4Pose Data 飞机配置MAVROS 基于工训赛 VIO 飞行总结 室内飞行 ROS amp PX4 Pose Data 飞机配置 VIO 参考此处 xff0c 采用 T265 配置 相机与飞控机
  • PX4模块设计之一:SITL & HITL模拟框架

    PX4模块设计之一 xff1a SITL amp HITL模拟框架 1 模拟框架1 1 SITL模拟框架1 2 HITL模拟框架 2 模拟器类型3 MAVLink API4 总结 基于PX4开源软件框架简明简介的框架设计 xff0c 逐步分
  • PX4模块设计之三:自定义uORB消息

    PX4模块设计之三 xff1a 自定义uORB消息 1 新增自定义uORB消息步骤2 应用ext hello world消息示例3 编译执行结果4 参考资料 基于PX4开源软件框架简明简介和PX4模块设计之二 xff1a uORB消息代理
  • PX4模块设计之五:自定义MAVLink消息

    PX4模块设计之五 xff1a 自定义MAVLink消息 1 MAVLink Dialects1 1 PX4 Dialects1 2 Paprazzi Dialects1 3 MAVLink XML File Format 2 添加自定义M
  • PX4模块设计之十七:ModuleBase模块

    PX4模块设计之十七 xff1a ModuleBase模块 1 ModuleBase模块介绍2 ModuleBase类介绍3 ModuleBase类功能介绍3 1 模块入口3 2 模块启动3 3 模块停止3 4 状态查询3 5 任务回调3
  • PX4模块设计之三十四:ControlAllocator模块

    PX4模块设计之三十四 xff1a ControlAllocator模块 1 ControlAllocator模块简介2 模块入口函数2 1 主入口control allocator main2 2 自定义子命令custom command
  • PX4模块设计之三十六:MulticopterPositionControl模块

    PX4模块设计之三十六 xff1a MulticopterPositionControl模块 1 MulticopterPositionControl模块简介2 模块入口函数2 1 主入口mc pos control main2 2 自定义
  • px4无人机常识介绍(固件,px4等)

    专业名词解释 aircraft 任何可以飞或者可以携带物品还是搭载旅客的飞行器统称为飞机 航空器 uav 无人驾驶飞机 vehicle 飞行器 airplane plane aero plane 有机翼和一个或多个引擎的飞行器统称为飞机 D
  • PX4飞控之自主返航(RTL)控制逻辑

    本文基于PX4飞控1 5 5版本 xff0c 分析导航模块中自护返航模式的控制逻辑和算法 自主返航模式和导航中的其他模式一样 xff0c 在Navigator main函数中一旦触发case vehicle status s NAVIGAT
  • PX4中自定义MAVLink消息(记录)

    简单记录一下这个过程 一 自定义uORB消息 这一步比较简单 xff0c 首先在msg 中新建ca trajectory msg文件 uint64 timestamp time since system start span class t
  • 【PX4 飞控剖析】06 树莓派加载安装ROS,Mavros以及PX4固件

    PX4 飞控剖析 06 树莓派加载安装Mavros以及PX4固件 1 树莓派 刷镜像1 1 用Win32DiskImager刷入ubuntu mate 16 04 2 desktop armhf raspberry pi的镜像 1 2 开机
  • 四、无人机知识笔记(初级:基本运动原理)

    笔记来源于 沈阳无距科技 工业级无人机的中国名片 编程外星人 目录 一 多旋翼直升机 二 基本飞行姿态 三 多旋翼飞行原理 四 反扭力与偏航运动 五 螺旋桨 六 有刷电机和无刷电机 七 电调与PWM信号 八 动力电池 九 遥控器 十 机架设

随机推荐

  • wwid和uuid的区别

    转载于 xff1a https blog csdn net zwjzqqb article details 80321348 1 wwid 每个SCSI磁盘都有一个WWID xff0c 类似于网卡的MAC地址 xff0c 是独一无二的 可以
  • Sm2记录介绍

    SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥密码算法 xff0c SM2采用的就是ECC 256位的一种 1 签名验签 SSWINAPI SGD UINT32 DEVAPI SKF ECCSignData SGD HDL
  • xshell之for循环

    转载于 xff1a shell while read line 与for循环的区别 冥想心灵 博客园 cnblogs com 例子 xff1a while read line 是一次性将文件信息读入并赋值给变量line xff0c whil
  • virtualbox安装虚拟增强功能

    1 分配光驱 xff0c 选择windows的光驱 2 会发现出现了CD驱动器VBoxGuestAdditions 双击进去 xff0c 发现目录如下 xff1a 3 双击执行VBoxGuestAdditions exe
  • #蓝桥杯嵌入式组#历年客观题解析

    文章目录 第八届初赛第八届决赛第九届初赛第九届决赛第十届初赛第十届决赛 第八届初赛 C D 线与功能 xff1a 两个或多个输出信号连接在一起可以实现逻辑 与 的功能 OC门 xff0c 即 集电极开路 xff0c 实际上只是一个NPN型三
  • Git在vscode中简单使用

    Git在vscode中简单使用 一 Git安装与配置 1 Git安装 xff08 官网地址 xff1a https git scm com xff09 2 Git配置 xff08 1 xff09 安装好后 xff0c 桌面右键 Git Ba
  • 小程序云开发入门

    文章目录 前言一 开通云开发二 使用云开发1 直接创建云开发项目2 修改配置文件引入云开发 三 云数据库1 介绍2 使用 四 云函数1 介绍2 使用 五 云存储1 介绍2 使用 总结 前言 一个小程序在开发时 xff0c 除了考虑界面功能逻
  • 小程序Mpx框架入门

    文章目录 简介一 Mpx的特点1 使用原因2 设计思路3 与其他框架的区别 二 安装使用1 相关命令2 项目创建演示 三 Mpx在vscode中的相关插件四 学习Mpx框架开发1 Mpx具有的功能特性2 学习的资源 总结 简介 Mpx是一款
  • 小程序云函数调用云函数

    文章目录 前言一 案例说明二 功能实现1 云函数1 xff1a getdata2 云函数2 xff1a deldata 总结 前言 小程序云开发提供了云函数 xff0c 云函数是运行在服务端的代码 xff0c 执行速度快 通常一些复杂的功能
  • Vue项目打包后不能正常显示页面

    项目场景 xff1a 通过 Vue CLI 创建的 vue 项目 xff0c 编写完项目后 xff0c 通过 npm run bulid 对项目进行打包 xff0c 再把打包得到的内容 xff08 dist文件夹 xff09 交给后端部署到
  • element-ui二次封装实现全局回到顶部组件

    文章目录 前言一 实现方法1 创建 BackTop 组件2 全局注册组件3 使用组件 二 组件效果总结 前言 在开发 vue 项目时 xff0c 我们都可能用到 element ui xff0c 但是有时 element ui 提供的组件太
  • element-ui二次封装实现普通登录组件

    文章目录 前言一 实现方法1 创建 AccountLogin 组件2 全局注册组件3 使用组件 二 组件效果总结 前言 在开发 vue 项目时 xff0c 我们都可能用到 element ui xff0c 但是有时 element ui 提
  • CFCA预置证书

    1 单一证书 2 导入数字证书流程 3 加密证书私钥结构
  • element-ui二次封装实现短信验证码登录组件

    文章目录 前言一 实现方法1 创建 PhoneLogin 组件2 全局注册组件3 使用组件 二 组件效果总结 前言 在开发 vue 项目时 xff0c 我们都可能用到 element ui xff0c 但是有时 element ui 提供的
  • C++之make、cmake和makefile的区别

    make cmake和makefile的区别 make 此工具类似于批处理工具 xff0c 可以对多个源文件进行批量地编译和链接makefile 是一个文本文件 xff0c 其中包含了make工具在执行时所要遵循的一系列规则Cmake xf
  • Ubuntu系统下搭建PX4环境

    Ubuntu系统下搭建PX4环境 首先我是从一个小白开始的 xff0c 完全不懂linux系统 xff0c 完全不懂PX4 xff0c PX4固件是Pixhawk飞行控制器的官方固件 xff0c Pixhawk官网也给出了Linux win
  • mavlink_generator生成器安装过程

    mavlink generator生成器安装过程 从官网下载mavlink xff08 git clonhttps github com mavlink mavlink git 然后进入mavlink 目录执行 git submodule
  • linux系统下QGC地面站和串口助手cutecom 安装教程

    linux系统下QGC地面站和串口助手cutecom 安装教程 解除权限 xff1a sudo usermod a G dialout USER sudo apt get remove modemmanager y sudo apt ins
  • PX4中通过串口读取STM32F4串口发送过来消息并发布UORB主题

    PX4中通过串口读取STM32F4串口发送过来消息并发布UORB主题 本次小项目是通过PX4读取STM32F4发过来的数据 xff0c 之前博客介绍了我做的STM32端项目 xff0c 再稍微啰嗦一下 xff1a 解析AIRMAR和测深仪数
  • PX4自定义mavlink消息

    PX4自定义mavlink消息 承接前面UORB发布消息 xff0c 然后现在要使用mavlink发布消息 xff0c 然后通过433MHz进行无线传输 这个阶段对我来说异常艰难 xff0c 我个人傻傻看了2天mavlink配置文件 xff