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

Ubuntu20.04下Px4使用UORB发布消息

1 .msg文件夹定义数据类型及 变量名

文件位置如图,在PX4-Autopilot/msg文件夹下,笔者创建的文件名为gps_msg.msg

gps_msg.msg内容如下 

uint64 timestamp    # 时间戳
float32 latitude     
float32 longitude  

float32 altitude     

同时,在CMakeLists.txt中添加gps_msg.msg 

2 .编译
终端打开PX4-Autopilot,运行命令

make px4_fmu-v3_default

开始编译,用于生成.h头文件

编译结束

 

 一开始用的fmu-v3发现没有生成.h文件 

换成了

make px4_fmu-v4_default

生成的gps_msg.h位置和内容如图

3. 创建新模块

在PX4的src/modules目录下创建一个新文件夹,比如笔者此处命名为alxx 。

在alxx文件夹下创建CMakeList.txt文件,内容如下

px4_add_module(
#下面添加文件夹名字
MODULE examples__alxx
#下面添加线程名字
MAIN x

SRCS
#添加文件夹里面.cpp文件
01gps_msg.cpp

DEPENDS
)

将自己的模块名(笔者的是alxx)添加进default.cmake文件下,笔者使用的是fmu-v4编译的,所以到PX4-Autopilot/boards/px4/fmu-v4里面的default.cmake文件中进行添加

4.cpp文件内容的编写

#include <uORB/uORB.h>
#include <uORB/topics/gps_msg.h> // 引入想要发布的消息类型的头文件
#include <drivers/drv_hrt.h>//包含函数hrt_absolute_time()
#include <uORB/Publication.hpp> //用于创建一个 uORB 发布器
#include <systemlib/mavlink_log.h> //使用mavlink_log_critical()函数

using namespace std;


extern "C" __EXPORT int x_main(int argc, char *argv[]);//主函数  告诉编译器使用 C 语言的方式来处理特定的函数或代码块。
int x_thread(int argc, char *argv[]);//线程

static bool thread_running = false;//线程运行标志
static bool thread_should_exit = false;//线程结束标志
static orb_advert_t mavlink_log_pub = 0;  //使用 &mavlink_log_pub
static int daemon_task;

class main_task01//主函数命名
{
public:
void run();
private:

};



void main_task01::run()
{
// 创建一个 gps_msg_s 结构体并初始化消息数据
gps_msg_s gps_msg{};
gps_msg.timestamp = hrt_absolute_time();
gps_msg.latitude = 37.7749;
gps_msg.longitude = -122.4194;
gps_msg.altitude = 11.0f;

// 创建一个 uORB 发布器,发布 gps_msg 消息
uORB::Publication<gps_msg_s> gps_msg_pub{ORB_ID(gps_msg)};

PX4_INFO("alxx使用C++发布了Uorb消息");//终端打印消息
while (true) {
// 发布消息
gps_msg_pub.publish(gps_msg);
}

}


int x_main(int argc, char *argv[])
{
/*检查传递给程序的命令行参数数量,如果参数数量小于2,使用 mavlink_log_critical 函数向 mavlink_log_pub
发布一条关于“[lxx]mission command”的严重级别日志消息。*/
if (argc < 2) {
mavlink_log_critical(&mavlink_log_pub, "[lxx]mission command");
}
if (!strcmp(argv[1], "start")) {
if (thread_running) {
/*检查 thread_running 是否为真,如果是,它会发布一条关于 "[lxx]already running" 的严重级别日志消息。*/
mavlink_log_critical(&mavlink_log_pub, "[lxx]already running");
}
thread_should_exit = false; //表示线程不应该退出。
thread_running = true; //表示线程正在运行
daemon_task = px4_task_spawn_cmd("x",
SCHED_DEFAULT,
SCHED_PRIORITY_MAX - 5,
3000,
x_thread, //启动一个新任务(x_thread),可能是为了执行特定的线程函数,并传递其他参数。
&argv[2]);
return 0;
}
if (!strcmp(argv[1], "stop")) {
thread_should_exit = true;
}
mavlink_log_critical(&mavlink_log_pub, "unrecognized command");
return 0;
}


int x_thread(int argc, char *argv[])
{
main_task01 x;
x.run();
return 0;
}

 

终端打开PX4-Autopilot,再编译

make px4_fmu-v4_default

5.运行

运行仿真语句

make px4_sitl_default jmavsim

 报错,因为make前面多打了空格

重新输入后

可以打开仿真

 鼠标光标定位到终端最下方,输入“help”

 

还有PX4-Autopilot/boards/px4/sitl里面的default.cmake 也要添加alxx

再编译

make px4_fmu-v4_default 

启动仿真

make px4_sitl_default jmavsim

运行

help  

 笔者定义的线程是x,在最后

运行

x start 

输出.msg文件里定义的数据

listener gps_msg

6.添加自启动 

文件所在位置:PX4-Autopilot/ROMFS/px4fmu_common/init.d 

 

打开文件 rc.mc_apps

翻至最下方,在最下方添加  自己的线程名 start  ,笔者定义的线程是x,所以在最下方添加的内容如下

保存文件。终端打开px4源码,先清空之前编译的内容。

        在Linux中,make clean 是一个常用于管理源代码编译过程的命令。这个命令通常定义在Makefile文件中,是make工具的一个标准目标。make clean的主要作用是清除之前编译过程中产生的所有编译和链接产物,比如对象文件(.o文件)、编译生成的可执行文件以及其他中间文件。这样做的目的是为了确保下一次编译是从一个干净的状态开始,避免由于旧的编译产物导致的潜在问题。

        在进行源代码的编译时,尤其是在进行多次编译或者修改了源代码后,使用make clean可以保证新的编译不会受到之前编译产物的影响,从而减少编译错误和问题。然而,需要注意的是,执行make clean后,之前编译生成的所有文件都会被删除,所以在执行这个命令之前要确保不再需要这些文件。

make clean

编译

make px4_fmu-v4_defaulr

 

启动仿真

make px4_sitl_default jmavsim

 线程已经启动了,打印了消息

观察数据

listener gps_msg 

 

结束

http://www.xdnf.cn/news/17853.html

相关文章:

  • OpenCV-循环读取视频帧,对每一帧进行处理
  • Qt——常用Widget(控件)
  • 【swift】SwiftUI动画卡顿全解:GeometryReader滥用检测与Canvas绘制替代方案
  • 有红帽认证证书可以0元置换华为openEuler-HCIA/HCIP认证
  • 醋酸镧:看不见的科技助力
  • 介绍TCP的拥塞控制
  • Oracle EBS R12.2 adlnkoh.sh执行报错
  • windows系统创建FTP服务
  • ar / let / const 以及不同写法的区别一
  • Vue 侦听器(watch 与 watchEffect)全解析2
  • [Chat-LangChain] 前端用户界面 | 核心交互组件 | 会话流管理
  • NY232NY236美光固态闪存NY240NY241
  • 责任链模式C++
  • 当云手机出现卡顿怎么办?
  • 第五天~提取Arxml中描述信息New_CanCluster--Expert
  • SpatialVLM和SpatialRGPT论文解读
  • 【进阶】Java技术栈八股文学习资料整理
  • Python 常用库速查手册
  • 如何使用亚马逊云科技EC2服务部署语音转写系统
  • 【算法专题训练】13、回文字符串
  • webrtc编译arm/arm64
  • STM32 - Embedded IDE - GCC - 显著减少固件的体积
  • 鸿蒙任务调度机制深度解析:优先级、时间片、多核与分布式的流畅秘密
  • 【开发语言】Groovy语言:Java生态中的动态力量
  • 【Cuda 编程思想】LinearQaunt-分块量化矩阵乘法计算过程
  • 从零到一:发布你的第一个 npm 开源库(2025 终极指南)
  • Shortest Routes II(Floyd最短路)
  • 数据结构初阶(15)排序算法—交换排序(快速排序)(动图演示)
  • Docker 缓存优化:通过 cpolar 内网穿透服务远程管理 Redis
  • C语言零基础第17讲:数据在内存中的存储