当前位置: 首页 > news >正文

无人机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

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

对应的数据曲线

在这里插入图片描述

相关文章:

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

PX4源码添加自定义uORB消息并保存到日志 0 前言 PX4的内部通信机制主要依赖于uORB&#xff08;Micro Object Request Broker&#xff09;&#xff0c;这是一种跨进程的通信机制&#xff0c;一种轻量级的中间件&#xff0c;用于在PX4飞控系统的各个模块之间进行高效的数据交换…...

HTMLCSS :下雪了

这段代码创建了一个动态的雪花飘落加载动画&#xff0c;通过 CSS 技术实现了雪花的下落和消失效果&#xff0c;为页面添加了视觉吸引力和动态感。 大家复制代码时&#xff0c;可能会因格式转换出现错乱&#xff0c;导致样式失效。建议先少量复制代码进行测试&#xff0c;若未能…...

如何处理 Typecho Joe 主题被抄袭或盗版的问题

在开源社区中&#xff0c;版权保护是一个非常重要的话题。如果你发现自己的主题&#xff08;如 Joe 主题&#xff09;被其他主题&#xff08;如子比主题&#xff09;抄袭或盗版&#xff0c;你可以采取以下措施来维护自己的权益。 一、确认侵权行为 在采取任何行动之前&#xf…...

利用Vue和javascript分别编写一个“Hello World”的定时更新

目录 一、利用Vue编写一个“Hello World”的定时更新&#xff08;1&#xff09;vue编码在Html文件中&#xff08;2&#xff09;vue编码在js文件中 二、利用javascript编写一个“Hello World”的定时更新 一、利用Vue编写一个“Hello World”的定时更新 &#xff08;1&#xff…...

volatile变量需要减少读取次数吗

问题说明 本人在前期读Netty源码时看到这样一段源码和注释&#xff1a; private boolean invokeHandler() {// Store in local variable to reduce volatile reads.int handlerState this.handlerState;return handlerState ADD_COMPLETE || (!ordered && handlerS…...

bootstrap.yml文件未自动加载问题解决方案

在添加bootstrap.yml文件后,程序未自动扫描到,即图标是这样的: 查了一些资料,是缺少bootstrap相关依赖,虽然已经添加了spring-cloud-context依赖,但是这个依赖并未引入bootstrap依赖,可能是版本问题,需要手动引入 <dependency><groupId>org.springframework.cloud&…...

编程AI深度实战:AI编程工具哪个好? Copilot vs Cursor vs Cody vs Supermaven vs Aider

​ 系列文章: 编程AI深度实战:私有模型deep seek r1,必会ollama-CSDN博客 编程AI深度实战:自己的AI,必会LangChain-CSDN博客 编程AI深度实战:给vim装上AI-CSDN博客 编程AI深度实战:火的编程AI,都在用语法树(AST)-CSDN博客 编程AI深度实战:让verilog不再是 AI …...

前端知识速记--CSS篇:display

前端知识速记–CSS篇&#xff1a;display 一、什么是 display 属性&#xff1f; display 属性用于指定一个元素如何被显示在网页上。它不仅影响元素的显示形式&#xff0c;还对元素的布局、结构以及与其他元素之间的关系产生重要影响。 二、常用 display 属性值 1. block …...

51单片机 01 LED

一、点亮一个LED 在STC-ISP中单片机型号选择 STC89C52RC/LE52RC&#xff1b;如果没有找到hex文件&#xff08;在objects文件夹下&#xff09;&#xff0c;在keil中options for target-output- 勾选 create hex file。 如果要修改编程 &#xff1a;重新编译-下载/编程-单片机重…...

WPF进阶 | WPF 动画特效揭秘:实现炫酷的界面交互效果

WPF进阶 | WPF 动画特效揭秘&#xff1a;实现炫酷的界面交互效果 前言一、WPF 动画基础概念1.1 什么是 WPF 动画1.2 动画的基本类型1.3 动画的核心元素 二、线性动画详解2.1 DoubleAnimation 的使用2.2 ColorAnimation 实现颜色渐变 三、关键帧动画深入3.1 DoubleAnimationUsin…...

分页按钮功能

前言 在前端开发中&#xff0c;分页功能是一个常见的需求&#xff0c;特别是当需要展示大量数据时&#xff0c;它能有效提升用户体验。该文章结合运用了HTML&#xff0c;CSS&#xff0c;JS实现网页的分页按钮功能&#xff0c;并且可以选择每页显示的条数试试更新总页数及显示当…...

数据分析系列--⑦RapidMiner模型评价(基于泰坦尼克号案例含数据集)

一、前提 二、模型评估 1.改造⑥ 2.Cross Validation算子说明 2.1Cross Validation 的作用 2.1.1 模型评估 2.1.2 减少过拟合 2.1.3 数据利用 2.2 Cross Validation 的工作原理 2.2.1 数据分割 2.2.2 迭代训练与测试 ​​​​​​​ 2.2.3 结果汇总 ​​​​​​​ …...

集合通讯概览

集合通信概览 &#xff08;1&#xff09;通信的算法 是根据通讯的链路组成的 &#xff08;2&#xff09;因为通信链路 跟硬件强相关&#xff0c;所以每个CCL的库都不一样 芯片与芯片、不同U之间是怎么通信的 多卡训练&#xff1a;多维并行&#xff08;xxx并行在上一期已经讲述…...

【FreeRTOS 教程 八】直达任务通知

目录 一、FreeRTOS 直达任务通知&#xff1a; &#xff08;1&#xff09;直达任务通知基本介绍&#xff1a; &#xff08;2&#xff09;更新目标通知的值&#xff1a; &#xff08;3&#xff09;性能优势和使用限制&#xff1a; 二、直达任务通知 API&#xff1a; &#…...

Ubuntu 18.04安装Emacs 26.2问题解决

个人博客地址&#xff1a;Ubuntu 18.04安装Emacs 26.2问题解决 | 一张假钞的真实世界 no X development libraries were found checking for X... no checking for X... true configure: error: You seem to be running X, but no X development libraries were found. You …...

nodejs:js-mdict 的下载、安装、测试、build

js-mdict 项目的目录结构&#xff1a;js-mdict 项目教程 js-mdict 下载地址: js-mdict-master.zip 先解压到 D:\Source\ js-mdict 6.0.2 用了 ts (TypeScript) 和 Jest&#xff0c;增加了应用开发的难度&#xff0c;因为先要了解 ts 和 Jest。 参阅&#xff1a;测试与开发&a…...

CSS关系选择器详解

CSS关系选择器详解 学习前提什么是关系选择器&#xff1f;后代选择器&#xff08;Descendant Combinator&#xff09;语法示例注意事项 子代选择器&#xff08;Child Combinator&#xff09;语法示例注意事项 邻接兄弟选择器&#xff08;Adjacent Sibling Combinator&#xff0…...

Python在线编辑器

from flask import Flask, render_template, request, jsonify import sys from io import StringIO import contextlib import subprocess import importlib import threading import time import ast import reapp Flask(__name__)RESTRICTED_PACKAGES {tkinter: 抱歉&…...

蓝桥杯备考:高精度算法之除法

我们除法的高精度其实也不完全是高精度&#xff0c;而是一个高精度作被除数除以一个低精度 模拟我们的小学除法 由于题目中我们的除数最大是1e9&#xff0c;当它真正是1e9的时候&#xff0c;t是有可能超过1e9的&#xff0c;所以要用long long...

笔试-业务逻辑4

应用 小明在玩一个数字加减游戏&#xff0c;输入4个正整数&#xff1a;s、t、a、b&#xff0c;其中s>1&#xff0c;b<105&#xff0c;a!b。只使用加法或者减法&#xff0c;使得st。 每回合&#xff0c;小明用当前的数字&#xff0c;加上或减去一个数字&#xff1b;目前有…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...