无人机PX4飞控 | PX4源码添加自定义uORB消息并保存到日志

PX4源码添加自定义uORB消息并保存到日志

0 前言

PX4的内部通信机制主要依赖于uORB(Micro Object Request Broker),这是一种跨进程的通信机制,一种轻量级的中间件,用于在PX4飞控系统的各个模块之间进行高效的数据交换,它通过发布-订阅(publish/subscribe)模式,实现了不同模块之间的异步通信。
在这里插入图片描述

uORB还允许开发者自定义新话题,首先需要创建一个新的.msg文件,将文件名添加到msg/CMakeLists.txt中,之后进行编译,来生成成对应的C++代码及.h头文件,然后在使用该话题的地方包含该头文件即可。

本篇文章介绍添加uORB消息具体方法,并将该消息记录与日志中。

1 添加uORB消息方法

第一步:添加对应的msg文件

PX4原定义好的msg文件都在PX4-Autopilot/msg 文件夹下面,已经有非常多
在这里插入图片描述
打开飞机的位置消息文件 vehicle_local_position.msg ,作为参考,可以看到里面有很多的内容,作为总结如下

定义的变量类型 有:

  • bool
  • char
  • float32 / float64
  • uint8 / uint16 / uint64
  • int8 /int16 /int32

相关的类型定义在 px_generate_uorb_topic_helper.py 文件中

在这里插入图片描述

[!NOTE]

也可以定义对应类型的向量,例如: float32[3]

msg文件最后两行还可以定义本msg的ID

例如vehicle_local_position.msg的 设置ID如下

在这里插入图片描述

[!NOTE]

一个uORB消息类型可以定义多个不同名字的msg ID ,但是不同的uORB消息类型不可以定义相同名字的msg ID。


第二步:将msg文件名添加到CMakeLists.txt 文件中

在编写好 **.msg 文件后,需要将该文件的名字添加到PX4-Autopilot/msg/CMakeLists.txt 文件中

这样系统就将**.msg文件

自动编译生成对应的**.h文件了

添加到39行那个set函数里,一般加到最下面一个
在这里插入图片描述


第三步:引用头文件

在需要引用的头文件中加入uORB相关的头文件

通常一般需要引用的有下面几个

#include <uORB/Publication.hpp>
#include <uORB/Subscription.hpp>
#include <uORB/SubscriptionCallback.hpp>

然后就是头文件引用对应msg生成的头文件 ,前面的路径一般是uORB/topics/ 。例如:

#include <uORB/topics/**.h>

至此添加一个uORB消息类型即完成了!下面则是使用uORB消息的方法。

第四步:uORB消息的订阅

订阅的声明举个例子 如下:

uORB::Subscription _vehicle_land_detected_sub{ORB_ID(vehicle_land_detected)};
  • uORB::Subscription 就是声明一个uORB订阅类型
  • _vehicle_land_detected_sub 订阅变量的名字
  • ORB_ID(vehicle_land_detected) 订阅的uORB的ID,如果在msg文件中没有定义ID,那么msg文件的名字就是ID,也可以通过#TOPICS 来设置对应的ID ,一个msg可以设置多个不同的ID

获取最新的已订阅的uORB消息,伪代码如下:

vehicle_land_detected_s 变量名a
if(_vehicle_land_detected_sub.update(&变量名a))
{具体操作
}

第五步:uORB消息的发布

发布的声明举个例子 如下:

uORB::PublicationData<takeoff_status_s>  _takeoff_status_pub{ORB_ID(takeoff_status)};
  • uORB::PublicationData ——声明一个uORB发布类型
  • <takeoff_status_s> ——发布消息的结构体,一般结构体的名字就是msg文件的名字
  • _takeoff_status_pub ——uORB发布类型的变量名称
  • ORB_ID(takeoff_status) ——发布的订阅的uORB的ID

发布指定的uORB消息,伪代码如下:

takeoff_status_s 变量名a
变量名a 各成员变量赋值
_takeoff_status_pub.publish(变量名a);

第六步:将uORB消息记录在日志中

如果希望将该消息记录在日志中

那么需要打开 PX4-Autopilot/src/modules/logger/logged_topics.cpp 文件

文件中的 void LoggedTopics::add_default_topics() 函数就是 添加记录日志的topic的

可以看到原本的有这样几个功能函数:
在这里插入图片描述

它们用于控制日志记录中的主题的功能区别是:

  • add_topic —— 函数用于将指定的uORB主题添加到日志记录中。这意味着每当该主题的数据更新时,都会被记录到日志文件中。带间隔参数:add_topic(topic_name, interval_ms),其中 interval_ms 指定记录间隔(毫秒),例如,add_topic("demo_uorb", 100) 表示每100毫秒记录一次该主题的数据;
  • add_optional_topic——函数用于添加一个可选的主题。与 add_topic() 不同,该函数允许用户选择是否启用该主题的日志记录。用户可以根据需要手动开启或关闭该主题的日志记录。
  • add_optional_topic_multi ——与 add_optional_topic() 类似,但允许同时添加多个主题。这使得可以一次性配置多个可选主题的日志记录。

2 实践

2.1 代码实现

PX4-Autopilot/msg 文件夹下面,新建一个文件,文件命名为:jone_demo.msg

在 jone_demo.msg 文件中定义四个参数:

uint64 timestamp			# time since system start (microseconds)bool            enable
float32         acc_norm
float32[3]      acc

编写好jone_demo.msg文件后,

将 jone_demo.msg 文件的名字添加到PX4-Autopilot/msg/CMakeLists.txt 文件中,这样系统就将jone_demo.msg文件自动编译生成对应的jone_demo.h文件了

添加到39行那个set函数里,一般加到最下面一个

在这里插入图片描述

先编译一下

make px4_sitl_default

这样就生成了对应的jone_demo.h ,路径是:build/px4_sitil_default/uORB/topics

在这里插入图片描述

在之前添加的模块jone_demo中的JoneDemo.hpp 头文件中加入uORB相关的头文件

通常一般需要引用的有下面几个

#include <uORB/Publication.hpp>
#include <uORB/Subscription.hpp>
#include <uORB/SubscriptionCallback.hpp>

jone_demo.msg 生成的头文件为:jone_demo.h

#include <uORB/topics/jone_demo.h>

下面订阅sensor_combined的uORB消息,获取其中的三轴加速度信息

在JoneDemo.hpp 中类的私有变量区加入

uORB::Subscription _sensor_combined_sub{ORB_ID(sensor_combined)};

去订阅传感器信息的uORB消息,所以前面要加上该消息的引用

#include <uORB/topics/sensor_combined.h>

在JoneDemo.hpp 中类的私有变量区加入

uORB::PublicationData<jone_demo_s>  _jone_demo_pub{ORB_ID(jone_demo)};

可以打开jone_demo.h文件,看下jone_demo_s 结构体的定义
在这里插入图片描述

下面在cpp文件中进行具体的uORB消息订阅与发布操作

在JoneDemo.cpp 的Run()函数中加入

	sensor_combined_s imu;if(_sensor_combined_sub.update(&imu)){jone_demo_s jone;jone.timestamp = hrt_absolute_time();//获得系统的绝对时间jone.enable = true;jone.acc[0] = accelerometer_m_s2[0];jone.acc[1] = accelerometer_m_s2[1];jone.acc[2] = accelerometer_m_s2[2];jone.acc_norm = sqrtf(jone.acc[0]*jone.acc[0]+jone.acc[1]*jone.acc[1]+jone.acc[2]*jone.acc[2]);_jone_demo_pub.publish(jone);}

通过上面的代码,在检测到sensor_combined_s消息更新时,那么就会在jone_demo_s 变量中 赋值加速度三轴的值,并且计算模长,然后发布jone_demo_s变量的uORB消息。

将jone_demo消息添加在日志记录中

打开 PX4-Autopilot/src/modules/logger/logged_topics.cpp 文件

文件中的 void LoggedTopics::add_default_topics() 函数就是 添加记录日志的topic的

在add_default_topics() 函数里加入:

add_topic("jone_demo");

2.2 测试

编译下看有没有问题

make px4 default_sitl_default

没问题则可以运行下

make px4 default_sitl_default gazebo

控制飞机起飞,飞一小段时间

下载日志

点QGC的这个图标

在这里插入图片描述

在弹窗选择分析工具
在这里插入图片描述

选择日志下载界面

在这里插入图片描述

一开始没有日志,需要点击刷新

在这里插入图片描述

找到对应的日期日志,点击下载即可

在这里插入图片描述

完成后,则在对应的选择的路径下面,生成了需要的日志文件

在这里插入图片描述

log_5说明下载的ID 5 的日志,然后是时间

下面通过plotjudge数据分析工具,来看日志里记录的uORB消息

在里面找到我们记录的对应的uORB消息的ID:jone_demo

点开是我们声明的对应的消息体
在这里插入图片描述

对应的数据曲线

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/68898.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

XCCL、NCCL、HCCL通信库

XCCL提供的基本能力 XCCL提供的基本能力 不同的XCCL 针对不同的网络拓扑&#xff0c;实现的是不同的优化算法的&#xff08;不同CCL库最大的区别就是这&#xff09; 不同CCL库还会根据自己的硬件、系统&#xff0c;在底层上面对一些相对应的改动&#xff1b; 但是对上的API接口…

AI大模型开发原理篇-5:循环神经网络RNN

神经概率语言模型NPLM也存在一些明显的不足之处:模型结构简单&#xff0c;窗口大小固定&#xff0c;缺乏长距离依赖捕捉&#xff0c;训练效率低&#xff0c;词汇表固定等。为了解决这些问题&#xff0c;研究人员提出了一些更先进的神经网络语言模型&#xff0c;如循环神经网络、…

Docker快速部署高效照片管理系统LibrePhotos搭建私有云相册

文章目录 前言1.关于LibrePhotos2.本地部署LibrePhotos3.LibrePhotos简单使用4. 安装内网穿透5.配置LibrePhotos公网地址6. 配置固定公网地址 前言 想象一下这样的场景&#xff1a;你有一大堆珍贵的回忆照片&#xff0c;但又不想使用各种网盘来管理。怎么办&#xff1f;别担心…

【Java计算机毕业设计】基于Springboot的物业信息管理系统【源代码+数据库+LW文档+开题报告+答辩稿+部署教程+代码讲解】

源代码数据库LW文档&#xff08;1万字以上&#xff09;开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统&#xff1a;Window操作系统 2、开发工具&#xff1a;IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

深入解析Python机器学习库Scikit-Learn的应用实例

深入解析Python机器学习库Scikit-Learn的应用实例 随着人工智能和数据科学领域的迅速发展&#xff0c;机器学习成为了当下最炙手可热的技术之一。而在机器学习领域&#xff0c;Python作为一种功能强大且易于上手的编程语言&#xff0c;拥有庞大的生态系统和丰富的机器学习库。其…

高斯光束介绍及光斑处理

常规激光器的光斑为高斯光斑&#xff0c;即中心能量集中&#xff0c;边缘能量较低。一般定义光强的处为高斯光束的半径。高斯光斑的传输由光斑半径、远场发散角、波长等决定。 其中为位置z处的光斑半径&#xff0c;w(z), k2pi/λ为波矢&#xff0c;λ为光波长&#xff0c;R为高…

C++哈希(链地址法)(二)详解

文章目录 1.开放地址法1.1key不能取模的问题1.1.1将字符串转为整型1.1.2将日期类转为整型 2.哈希函数2.1乘法散列法&#xff08;了解&#xff09;2.2全域散列法&#xff08;了解&#xff09; 3.处理哈希冲突3.1线性探测&#xff08;挨着找&#xff09;3.2二次探测&#xff08;跳…

【Redis】List 类型的介绍和常用命令

1. 介绍 Redis 中的 list 相当于顺序表&#xff0c;并且内部更接近于“双端队列”&#xff0c;所以也支持头插和尾插的操作&#xff0c;可以当做队列或者栈来使用&#xff0c;同时也存在下标的概念&#xff0c;不过和 Java 中的下标不同&#xff0c;Redis 支持负数下标&#x…

携程Java开发面试题及参考答案 (200道-上)

说说四层模型、七层模型。 七层模型(OSI 参考模型) 七层模型,即 OSI(Open System Interconnection)参考模型,是一种概念模型,用于描述网络通信的架构。它将计算机网络从下到上分为七层,各层的功能和作用如下: 物理层:物理层是计算机网络的最底层,主要负责传输比特流…

【信息系统项目管理师-选择真题】2021上半年综合知识答案和详解

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 【第1题】【第2题】【第3题】【第4题】【第5题】【第6题】【第7题】【第8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18题】【第19题】【第20题】【第…

IM 即时通讯系统-51-MPush开源实时消息推送系统

IM 开源系列 IM 即时通讯系统-41-开源 野火IM 专注于即时通讯实时音视频技术&#xff0c;提供优质可控的IMRTC能力 IM 即时通讯系统-42-基于netty实现的IM服务端,提供客户端jar包,可集成自己的登录系统 IM 即时通讯系统-43-简单的仿QQ聊天安卓APP IM 即时通讯系统-44-仿QQ即…

C#面试常考随笔7:什么是匿名⽅法?还有Lambda表达式?

匿名方法本质上是一种没有显式名称的方法&#xff0c;它可以作为参数传递给需要委托类型的方法&#xff0c;常用于事件处理、回调函数等场景&#xff0c;能够让代码更加简洁和紧凑。 使用场景 事件处理&#xff1a;在处理事件时&#xff0c;不需要为每个事件处理程序单独定义…

第二篇:多模态技术突破——DeepSeek如何重构AI的感知与认知边界

——从跨模态对齐到因果推理的工程化实践 在AI技术从单一模态向多模态跃迁的关键阶段&#xff0c;DeepSeek通过自研的多模态融合框架&#xff0c;在视觉-语言-语音的联合理解与生成领域实现系统性突破。本文将从技术实现层面&#xff0c;解构其跨模态表征学习、动态融合机制与…

AlexNet论文代码阅读

论文标题&#xff1a; ImageNet Classification with Deep Convolutional Neural Networks 论文链接&#xff1a; https://volctracer.com/w/BX18q92F 代码链接&#xff1a; https://github.com/dansuh17/alexnet-pytorch 内容概述 训练了一个大型的深度卷积神经网络&#xf…

扩散模型(三)

相关阅读&#xff1a; 扩散模型&#xff08;一&#xff09; 扩散模型&#xff08;二&#xff09; Latent Variable Space 潜在扩散模型&#xff08;LDM&#xff1b;龙巴赫、布拉特曼等人&#xff0c;2022 年&#xff09;在潜在空间而非像素空间中运行扩散过程&#xff0c;这…

git基础使用--4---git分支和使用

文章目录 git基础使用--4---git分支和使用1. 按顺序看2. 什么是分支3. 分支的基本操作4. 分支的基本操作4.1 查看分支4.2 创建分支4.3 切换分支4.4 合并冲突 git基础使用–4—git分支和使用 1. 按顺序看 -git基础使用–1–版本控制的基本概念 -git基础使用–2–gti的基本概念…

8.攻防世界Web_php_wrong_nginx_config

进入题目页面如下 尝试弱口令密码登录 一直显示网站建设中&#xff0c;尝试无果&#xff0c;查看源码也没有什么特别漏洞存在 用Kali中的dirsearch扫描根目录试试 命令&#xff1a; dirsearch -u http://61.147.171.105:53736/ -e* 登录文件便是刚才登录的界面打开robots.txt…

【漫话机器学习系列】076.合页损失函数(Hinge Loss)

Hinge Loss损失函数 Hinge Loss&#xff08;合页损失&#xff09;&#xff0c;也叫做合页损失函数&#xff0c;广泛用于支持向量机&#xff08;SVM&#xff09;等分类模型的训练过程中。它主要用于二分类问题&#xff0c;尤其是支持向量机中的优化目标函数。 定义与公式 对于…

Vue.js 使用 `teleport` 实现全局挂载

Vue.js 使用 teleport 实现全局挂载 今天我们来聊聊 Vue 3 中的一个实用功能&#xff1a;<Teleport> 组件。如果你曾在项目中需要将组件的部分内容渲染到全局位置&#xff0c;比如将模态框、通知等元素挂载到 body 下&#xff0c;那么 <Teleport> 将是你的好帮手。…

python算法和数据结构刷题[5]:动态规划

动态规划&#xff08;Dynamic Programming, DP&#xff09;是一种算法思想&#xff0c;用于解决具有最优子结构的问题。它通过将大问题分解为小问题&#xff0c;并找到这些小问题的最优解&#xff0c;从而得到整个问题的最优解。动态规划与分治法相似&#xff0c;但区别在于动态…