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: v2的主板刷写v2的固件

    v2的主板刷写v2的固件 fengxuewei 64 fengxuewei Legion Y7000 2019 PG0 src Firmware changwei rc span class token function make span
  • Mavlink-1-概述介绍

    1 MAVLink简介 MAVLink xff08 Micro Air Vehicle Link xff0c 微型空中飞行器链路通讯协议 xff09 是无人飞行器与地面站 xff08 Ground Control Station xff0c
  • Ubuntu18.04安装PX4踩坑、报错及解决方案整理

    笔者最近需要跑无人机巡检大坝的仿真 xff0c 于是在自己的Ubuntu2018 04中开始安装PX4 xff0c 问过不少之前已经装过PX4的师兄和同学 xff0c 都曾在PX4安装过程中踩过许多坑 xff0c 耗费了不少时间 xff0c
  • Ubuntu20.04+MAVROS+PX4+Gazebo保姆级安装教程

    Ubuntu20 04 43 MAVROS 43 PX4 43 Gazebo 安装PX4步骤安装MAVROS安装QGCPX4仿真 安装PX4步骤 从github上clone源码 span class token function git s
  • PX4无人机 - 键盘控制飞行代码

    PX4无人机 键盘控制飞行代码 仿真效果 实机效果 由于图片限制5M以内 xff0c 只能上传一小段了 xff0c 整段视频请点击链接 Pixhawk 6c 无人机 键盘控制无人机 Offboard模式 核心 xff1a 发布 mavros
  • 初学PX4之环境搭建

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

    文章目录 Mixer 混合控制 作用输入输出装载混控文件MAVROS代码解析总结示例MAINAUX Mixer 混合控制 作用 经过位置控制和姿态控制后 xff0c 控制量通过 actuator controls发布 xff0c 其中 co
  • PX4模块设计之五:自定义MAVLink消息

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

    PX4模块设计之十三 xff1a WorkQueue设计 1 WorkQueue启动2 WorkQueue接口2 1 基本接口2 2 辅助接口2 3 WorkQueue任务函数2 3 1 Flat Build2 3 2 Protected
  • PX4模块设计之二十四:内部ADC模块

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

    PX4模块设计之二十六 xff1a BatteryStatus模块 1 BatteryStatus模块简介2 模块入口函数2 1 主入口battery status main2 2 自定义子命令custom command 3 Batter
  • PX4模块设计之四十三:icm20689模块

    PX4模块设计之四十三 xff1a icm20689模块 1 icm20689模块简介2 模块入口函数2 1 主入口icm20689 main2 2 自定义子命令custom command2 3 模块状态print status 重载 3
  • PX4模块设计之四十六:dataman模块

    PX4模块设计之四十六 xff1a dataman模块 1 dataman模块简介2 模块入口函数dataman main3 dataman模块重要函数3 1 start3 2 stop3 3 status3 4 task main 4 A
  • mavros连接px4失败的usb-ttl原因

    问题描述 xff1a 最近在搞mavros xff0c 以方便协处理器和pixhawk通讯 xff0c 在按照官网教程安装mavros xff0c 设置px4 xff0c 连接硬件之后发现mavros卡在中间下不去 xff1a MAVROS
  • pixhawk px4 commander.cpp

    对于复杂的函数 xff0c 要做的就是看函数的输入是什么 来自哪里 xff0c 经过处理后得到什么 给谁用 xff0c 这样就可以把程序逻辑理清 中间的分析就是看函数如何处理的 span class hljs keyword extern
  • px4下载指定版本的固件、git用法

    https hub fastgit org PX4 PX4 Autopilot git describe tag 查看当前版本号 git tag l 查看所有版本 xff0c 也就是打个tag git checkout v1 9 1 跳转到
  • PX4中自定义MAVLink消息(记录)

    简单记录一下这个过程 一 自定义uORB消息 这一步比较简单 xff0c 首先在msg 中新建ca trajectory msg文件 uint64 timestamp time since system start span class t
  • PX4 OffBoard Control

    终于还是走上了这一步 xff0c 对飞控下手 xff0c 可以说是一张白纸了 记录一下学习的过程方便以后的查阅 目录 一 ubuntu18 04配置px4编译环境及mavros环境 二 PX4的OffBoard控制 1 搭建功能包 2 编写
  • PX4项目学习::(五)模块代码启动流程

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

随机推荐

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

    标签的分类 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