PX4自定义Mavlink消息(一)px4发送

2023-05-16

        用于项目需求,需要在PX4和QGC新增自定义消息用于通信控制,看了很多有关文章,我就不明白,为啥代码都是复制来复制去的,大部分的文章连变量名的起的一样。。。一点帮助都没有,还是决定自己研究,就当作给自己写了个备忘录吧

        首先,第一步先添加一个uORB topic,在源码根目录下的msg文件中,添加.msg文件,用于生成对应的topic的头文件(这里你需要了解px4的uORB通信机制),文件和代码如下:

uint64 timestamp        #time since system start (microseconds)
uint8 data1
uint8 data2

# TOPICS vehicle_zkrt

这里需要特别特别注意,最后一行的#和TOPICS还有vehicle_zkrt之间都是只有一个空格,多了少了都不行,编译的时候会报错,如果对变量定义不清楚,可以参考msg文件夹下其他的.msg文件。做完这步后,在msg文件下的CMakeList.txt文件下添加你的.msg文件,这样编译源码的时候才会根据你的.msg文件自动在Firmware/build/px4_fmu-v5_default/msg/tmp/headers下生成相应的消息同文件,此时,uORB topic添加完毕。如图:

        接下来就是第二步,自定义zkrt_message.xml文件,路径如下:Firmware/mavlink/include/mavlink/v2.0/message_definitions/zkrt_message.xml

这里可以看到我的message id设置的166,网上大多数都是设置的166,但是qgc接收会有一定问题,因为apm固件里面有用到166,只是px4没有用到:

<?xml version="1.0"?>
<mavlink>
    <include>common.xml</include>
    <!-- NOTE: If the included file already contains a version tag, remove the version tag here, else uncomment to enable. -->
    <!--<version>3</version>-->
    <enums>
    </enums>
    <messages>
        <message id="166" name="VEHICLE_ZKRT">
            <description>This message encodes all of the raw rudder sensor data from the USV.</description>
            <field type="uint64_t" name="timestamp">Timestamp in milliseconds since system boot</field>
            <field type="uint8_t" name="data1">start time, unit usec.</field>
            <field type="uint8_t" name="data2">stop time, unit usec.</field>
        </message>
    </messages>
</mavlink>

然后下载mavlink消息生成器:

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

下载完成后如下图:

在控制台敲python3 -m mavgenerate就可以弹出生成器的窗口了,当然,也有可能报错,缺少一些库文件,我这里缺少python3-tk, 直接安装就可以了sudo apt-get install python3-tk,少什么就装什么,一般不会有太大问题,如下图:

XML路径选择你刚才自定义的.xml文件,Out路径则选择Firmware/mavlink/include/mavlink/v2.0,点击Generate后会弹窗,不管他,继续点ok就行。

 上图为生成器自动的生成的文件夹zkrt_message里面的头文件,我们要用到的是mavlink_msg_vehicle_zkrt.h这个头文件里面的mavlink消息打包函数。

在src/modules/mavlink/streams目录下定义VEHICLE_ZKRT.hpp头文件:

#ifndef VEHICLE_ZKRT_HPP
#define VEHICLE_ZKRT_HPP

#include <uORB/topics/vehicle_zkrt.h> //包含uorb消息结构体的头文件
#include <v2.0/zkrt_message/mavlink_msg_vehicle_zkrt.h> //包含生成器生成的头文件
#include <modules/mavlink/mavlink_stream.h> //自定义类继承与MavlinkStream,所以要包含
#include <v2.0/mavlink_types.h>
#include <uORB/topics/vehicle_zkrt.h>
#include <uORB/SubscriptionInterval.hpp>
#include <uORB/uORB.h>

class MavlinkStreamVehicleZkrt: public MavlinkStream
{
public:
    const char *get_name() const
    {
        return MavlinkStreamVehicleZkrt::get_name_static();
    }

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

    static uint16_t get_id_static()
    {
        return MAVLINK_MSG_ID_VEHICLE_ZKRT;
    }

    uint16_t get_id()
    {
        return get_id_static();
    }

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

    unsigned get_size()
    {
        return MAVLINK_MSG_ID_VEHICLE_ZKRT_LEN + MAVLINK_NUM_NON_PAYLOAD_BYTES;
    }

private:

    explicit MavlinkStreamVehicleZkrt(Mavlink *mavlink) : MavlinkStream(mavlink) {}

    bool send() override //用于PX4真正发送的函数
    {
        struct vehicle_zkrt_s _vehicle_zkrt;    //定义uorb消息结构体

        if (true) {

		//int sensor_sub_fd = orb_subscribe(ORB_ID(vehicle_zkrt));//订阅
		//orb_copy(ORB_ID(vehicle_zkrt), sensor_sub_fd, &_vehicle_zkrt);//获取消息数据

                uORB::Subscription _zkrt_sub{ORB_ID(vehicle_zkrt)};//订阅
			    _zkrt_sub.copy(&_vehicle_zkrt);//获取消息数据

           	    mavlink_vehicle_zkrt_t msg;//定义mavlink消息结构体

            	msg.timestamp = _vehicle_zkrt.timestamp;//这里uorb数据赋值到mavlink结构体上
            	msg.data1 = _vehicle_zkrt.data1;
            	msg.data2  = _vehicle_zkrt.data2;

           	 mavlink_msg_vehicle_zkrt_send_struct(_mavlink->get_channel(), &msg);//利用生成器生成的mavlink_msg_vehicle_zkrt.h头文件里面的这个函数将msg(mavlink结构体)封装成mavlink消息帧并发送;
            	return true;
        }
        return false;
    }
};
#endif

这个VEHICLE_ZKRT.hpp非常重要,建议不要复制粘贴,因为根据px4固件版本的不同,此代码会有所不用,所以一定要理解他再去修改此段代码,否则编译肯定会报错。

我们自定义的MavlinkStreamVehicleZkrt类是继承了MavlinkStream类,这个类里写了很多虚函数,其中send函数就是虚函数,我们这里需要重写send函数,此函数就是用于给px4发送自定义mavlink消息的函数,建议打开一个streams目录下其他.hpp头文件,模仿他的写法,自己写一个。

接下来就比较简单了,在mavlink_messages.cpp下添加:(记得添加头文件)

//添加头文件
#include"streams/VEHICLE_ZKRT.hpp"

static const StreamListItem streams_list[] = {

//添加代码
#if defined(VEHICLE_ZKRT_HPP)
create_stream_list_item<MavlinkStreamVehicleZkrt>(),
#endif // VEHICLE_ZKRT_HPP


#if defined(HEARTBEAT_HPP)
	create_stream_list_item<MavlinkStreamHeartbeat>(),
#endif // HEARTBEAT_HPP
#if defined(STATUSTEXT_HPP)
	create_stream_list_item<MavlinkStreamStatustext>(),
#endif // STATUSTEXT_HPP
#if defined(COMMAND_LONG_HPP)
	create_stream_list_item<MavlinkStreamCommandLong>(),
#endif // COMMAND_LONG_HPP

 在mavlink_main.cpp中添加configure_stream_local("VEHICLE_ZKRT", 30.0f); 这里设置是30hz,也就是一秒钟发送三十次,建议一开始设置频率高一点,因为px4发送mavlink消息很多,如果你设置低了,很难找到自定义的消息,我是在MAVLINK_MODE_CONFIG模式下定义,因为我是用的usb调试的,大家可以试试这样在数传电台中可不可以传输。

case MAVLINK_MODE_CUSTOM:
		//stream nothing
		break;

	case MAVLINK_MODE_CONFIG: // USB 
		// Note: streams requiring low latency come first

		configure_stream_local("VEHICLE_ZKRT", 30.0f);//这里我是在config模式下定义
		configure_stream_local("TIMESYNC", 10.0f);
		configure_stream_local("CAMERA_TRIGGER", unlimited_rate);
		configure_stream_local("LOCAL_POSITION_NED", 30.0f);
		configure_stream_local("DISTANCE_SENSOR", 10.0f);
		configure_stream_local("MOUNT_ORIENTATION", 10.0f);
		configure_stream_local("ODOMETRY", 30.0f);

接下来,编译烧录,px4就会以30hz的频率发送自定义消息帧,可以拿串口助手去接收一下,但是并不太方便,我就自己用qt写了个串口日志记录:

 

根据mavlink1.0的消息结构,大家随便找一帧数据包,发现sys_id和comp_id为固定的01 01,每个人可能不一样噢,那我的msg_id为166,16进制就为a6,就可以检索01 01 a6,这样就能找到px4发送的自定义消息帧了,到这里就成功了一半了,不过我的消息发出来会乱码,目前还没搞清楚是什么原因,按道理来说playload数据应该全是0才对。之后再去找原因吧,先用qgc接收了再说!

        先这样吧!qgc接收和处理另起篇章吧。

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

PX4自定义Mavlink消息(一)px4发送 的相关文章

  • PX4位置控制offboard模式说明

    offboard模式的开发及应用 一 px4固件的模式 px4固件支持10几种飞行模式 xff0c 从代码结构上分析 xff0c 分为基本模式 自定义模式和自定义子模式 1 基本模式 基本模式又分为 xff0c 位置控制模式 自稳模式 手动
  • PX4 GAZEBO无人机添加相机并进行图像识别

    PX4 GAZEBO无人机添加摄像头并进行图像识别 在之前完成了ROS的安装和PX4的安装 xff0c 并可以通过roslaunch启动软件仿真 接下来为无人及添加相机 xff0c 并将图像用python函数读取 xff0c 用于后续操作
  • PX4 Bootloader下载及编译过程中的问题解决

    买来的雷迅的板子都是Bootloader已经烧进去了 xff0c Fireware也已经刷进去了 如果是自制的板子 xff0c 上位机根本没法识别板子 xff0c 必须先烧写下载Bootloader后编译好的bin文件 这篇记一下自己下载及
  • 初学PX4之环境搭建

    文章转自 xff1a http www jianshu com p 36dac548106b 前言 前段时间linux崩溃了 xff0c 桌面进去后只有背景 xff0c 折腾好久没搞定 xff0c 为了节省时间索性重装了系统 xff0c 同
  • 从Simulink到PX4——Simulink-PX4插件安装与环境搭建

    从Simulink到PX4 Simulink PX4插件安装与环境搭建 前言0 准备工作1 安装WSL2 Setting up the PX4 Toolchain on Windows3 Setting up the PX4 Tool Ch
  • PX4模块设计之十七:ModuleBase模块

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

    PX4模块设计之二十四 xff1a 内部ADC模块 1 内部ADC模块简介2 模块入口函数2 1 主入口board adc main2 2 自定义子命令custom command 3 内部ADC模块重要函数3 1 task spawn3
  • PX4模块设计之三十:Hysteresis类

    PX4模块设计之三十 xff1a Hysteresis类 1 Hysteresis类简介2 Hysteresis类成员变量介绍3 Hysteresis类迟滞逻辑4 Hysteresis类重要方法4 1 Hysteresis bool ini
  • PX4模块设计之三十九:Commander模块

    PX4模块设计之三十九 xff1a Commander模块 1 Commander模块简介2 模块入口函数2 1 主入口commander main2 2 自定义子命令custom command 3 Commander模块重要函数3 1
  • PX4模块设计之四十五:param模块

    PX4模块设计之四十五 xff1a param模块 1 param模块简介2 模块入口函数param main3 重要函数列表4 总结5 参考资料 1 param模块简介 Description Command to access and
  • mavlink解析

    之前看了mavlink协议 xff0c 网上关于mavlink的资料不多 本系列共三篇 xff0c 这是第一篇 本文大概总结了下对mavlink协议的理解 以下如不说明都是说mavlink v1 0版本 首先附上mavlink的各个消息的简
  • uORB和MAVLink通讯例程

    uORB uORB 是一种异步 publish subscribe 的消息传递 API xff0c 用于进程或者线程间通信 IPC 添加新的Topic xff08 主题 xff09 在msg 目录下创建一个新的 msg文件 xff0c 并将
  • PX4-4-任务调度

    PX4所有的功能都封装在独立的模块中 xff0c uORB是任务间数据交互和同步的工具 xff0c 而管理和调度每个任务 xff0c PX4也提供了一套很好的机制 xff0c 这一篇我们分享PX4的任务调度机制 我们以PX4 1 11 3版
  • PX4 OffBoard Control

    终于还是走上了这一步 xff0c 对飞控下手 xff0c 可以说是一张白纸了 记录一下学习的过程方便以后的查阅 目录 一 ubuntu18 04配置px4编译环境及mavros环境 二 PX4的OffBoard控制 1 搭建功能包 2 编写
  • PX4飞控的PPM接收机

    xff08 一 xff09 原理图 xff1a PX4飞控的PPM输入捕获由协处理器完成 xff0c 接在A8引脚 xff0c 对应Timer1的通道1 xff08 二 xff09 PPM协议 xff1a PPM的每一帧数据间隔为20ms
  • 【PX4 飞控剖析】06 树莓派加载安装ROS,Mavros以及PX4固件

    PX4 飞控剖析 06 树莓派加载安装Mavros以及PX4固件 1 树莓派 刷镜像1 1 用Win32DiskImager刷入ubuntu mate 16 04 2 desktop armhf raspberry pi的镜像 1 2 开机
  • PX4项目学习::(七)飞控栈:commander

    PX4的飞行控制程序通过模块来实现 xff0c 与飞控相关的模块主要有commander xff0c navigator xff0c pos control xff0c att control这几个 xff0c 分别可以在src modul
  • PX4项目学习::(五)模块代码启动流程

    54条消息 PX4 模块代码启动流程 zhao23333的博客 CSDN博客
  • mavlink模块中接收offboard模式下的mavlink消息流

  • PX4:Policy “CMP0097“ is not known to this version of CMake.

    make px4 fmu v3 时报的错 CMake版本的问题 由https blog csdn net zhizhengguan article details 118380965推测 xff0c 删除cmake policy也没事 ma

随机推荐

  • 用户标签有哪些类型,如何进行科学分类?

    标签的分类 xff0c 是理解用户标签 理解用户画像的基础 优秀的标签分类 xff0c 将使得标签画像系统易于用户的使用 本篇文章和大家简单介绍一下标签数据的分类 按照不同的分类方法 xff0c 标签的分类也自然不同 本文主要介绍几种最常规
  • Python字符串查找函数find

    Python字符串查找函数find 比较简单 xff0c 直接上代码 总结下规则 xff0c 结果数字说明 按字符串索引下标查询 xff0c 索引从0开始 xff0c 空格会占位并且有下标结果 1 xff0c 代表没有查找到英文区分大小写
  • 闲着看看jquery.ajax源码

    框架的作用就是简化我们做的事情 xff0c 却又不失灵活性 jquery是js框架中的中流砥柱 xff0c 灵活并且强大 jquery中对ajax的封装很完美 xff0c 且不说底层的ajax函数的强大 xff0c 但是其上层的get xf
  • java 转json 报错处理机制 案例 .

    JSON lib这个Java类包用于把bean map和XML转换成JSON并能够把JSON转回成bean和DynaBean http kingpingping iteye com blog 1157771 报错处理机制 commons b
  • 关于jquery对象的remove参数中出现伪位置类选择器,出现非预期结果的研究

    记得前几天有人在论坛发帖问了一个关于jquery删除节点的问题 原帖是这样的 xff08 原帖的地址是 xff1a 原帖 xff09 lt ul gt lt li gt 1 lt li gt lt li title 61 34 a 34 g
  • linux源码阅读利器-GNU GLOBAL Source Code Tag System

    学习浏览linux源码 xff0c 如果自己用自带的文本编辑器就太麻烦了 xff0c 但是如果安装强大的lxr那就太麻烦了 xff08 对于非debian用户来说 xff09 xff0c 找了很久找到了一个用起来很不错的源码浏览工具 xff
  • android 4.0.1源码编译,学习错误解决

    主机是fedora 14 linux内核2 6 35 6 swapon交换分区1 5G make version 3 81 官方指定的make版本 xff09 jdk 1 6 磁盘预留空间大概需要大于13G 具体的编译步骤可参考 Fedor
  • android webApp 调试问题解决

    前不久做了个webapp xff0c 在pc上chrome调试都是可以的 但是手机上显示却有点问题 xff0c 所以一直是想在手机浏览器上调试 xff0c 但是一直没有相关支持 xff0c 后来google终于出了chrome beta版
  • android系统源代码分析 书评

    其实接触android应用开发差不多两年了 xff0c 但是实际上并没与多少拿得出手的作品 因为在很长一段时间里我都在问自己android是什么 xff0c 内部怎么运行的 xff0c 为什么我的java代码就可以在linux上运行 xff
  • Fedora18博通430g电信无线拨号上网

    回家折腾了有两三天 xff0c 想让fedora18 也能蹭上网 首当其冲的问题就是fedora 没有为无线网卡安装驱动 xff0c 只能自己慢慢找驱动 费了好久找到上传了驱动下载 xff0c 满心欢喜按照README 编译 xff0c 结
  • VR技术的发展趋势,未来有哪些展望?

    虚拟现实技术Virtual Reality xff0c 缩写为VR xff0c 是一项全新的实用技术 虚拟现实技术包含计算机 电子信息 仿真技术于一体 xff0c 其基本实现方式是计算机模拟虚拟环境从而给人以环境沉浸感 目前来看 xff0c
  • APM2.8 Rover 自动巡航车设计(超声波和红外测距仪的安装和设置)

    xff08 转载 xff09 4 1 ROVER自动巡航车自主壁障的设置 APM2 8的飞控驾驶仪的传感器接入支持超声波 xff0c 电压传感器 xff0c 电流传感器 xff0c 光流传感器 xff0c 红外传感器 其中超声波和红外传感器
  • 学习笔记(一)-古月ROS机器视觉开发入门 -摄像头参数标定

    我们做图像处理为的就是要得到图像的数据 xff0c 在得到这些数据之后怎么对这些数据进行处理 xff0c 这才是我们主要关心的问题 但是 xff0c 在此之前 xff0c 我们还需要做一个非常主要的步骤 对摄像头的参数进行参数标定 安装标定
  • 卸载ROS的方法

    1 卸载全部ros span class token variable sudo span span class token variable apt get span span class token variable remove sp
  • Json String to Java Bean

    34 version 34 1 34 consentId 34 34 b618924f 8a6c 42bc 8553 99e3a8a0fec4 34 34 domain 34 34 cd site15294072534021 com 34
  • 实战PyQt5: 097-键盘事件

    在一个GUI桌面应用中 xff0c 用户和程序之间的交互一般通过键盘和鼠标来完成 xff0c 处理有关键盘和鼠标的事件是一个GUI程序几乎不可或缺的部分 xff0c 下面介绍在Qt中处理输入焦点和键盘事件的相关知识 设置控件的输入焦点 在一
  • 线性代数之——特征值和特征向量

    线性方程 A x 61 b Ax 61 b A x 61 b 是稳定状态的问题 xff0c 特征值在动态问题中有着巨大的重要性
  • Px4源码框架结构图

    此篇blog的目的是对px4工程有一个整体认识 xff0c 对各个信号的流向有个了解 xff0c 以及控制算法采用的控制框架 PX4自动驾驶仪软件 可分为三大部分 xff1a 实时操作系统 中间件和飞行控制栈 1 NuttX实时操作系统 提
  • aruco marker 的使用

    安装aruco 教程 xff1a make make install
  • PX4自定义Mavlink消息(一)px4发送

    用于项目需求 xff0c 需要在PX4和QGC新增自定义消息用于通信控制 xff0c 看了很多有关文章 xff0c 我就不明白 xff0c 为啥代码都是复制来复制去的 xff0c 大部分的文章连变量名的起的一样 一点帮助都没有 xff0c