介绍
UORB是PX4飞控中用于发布和订阅消息的通信机制,用于传输飞行控制系统中各个组件之间的数据。
Ubuntu18.04
一 .msg文件夹定义数据类型及 变量名
笔者创建的msg文件为gps_msg.msg
uint64 timestamp # 时间戳
float32 latitude
float32 longitude
float32 altitude
二 .编译
终端运行
make px4_fmu-v4_default
编译,生成.h头文件
编译完成
msg文件和.h头文件位置如图
生成的gps_msg.h内容如图
三. 创建新模块
在PX4的src/modules
目录下创建一个新文件夹,比如笔者此处命名为alxx 。
在alxx文件夹下创建CMakeList.txt文件,内容如下以及要运行的cpp文件,笔者此处创建的是01gps_msg.cpp,内容在后面
代码:
px4_add_module(
#下面添加文件夹名字
MODULE examples__alxx
#下面添加线程名字
MAIN alxx
SRCS
#添加文件夹里面.cpp文件
01gps_msg.cpp
DEPENDS
)
---------------------------------------------------------------------------------------------------------------------------
将自己的模块名(笔者的是alxx)添加进该路径的default.cmake文件下
还有PX4-Autopilot/boards/px4/sitl里面的default.cmake也需要添加alxx
----------------------------------------------------------------------------------------------------------------------------
四.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_task
{
public:
void run();
private:
};
void main_task::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_task x;
x.run();
return 0;
}
终端打开px4,编译
make px4_fmu-v5_default
编译完成如下图
五.运行
运行仿真语句:
make px4_sitl_default jmavsim
运行后如图
输入help,按Enter键运行获取可运行的线程,
笔者定义的是 x
笔者输入 x start,Enter键即可运行刚才的01gps_msg.cpp程序
可以看到终端打印了刚才在cpp文件里定义的内容,程序可以运行。
终端输入程序获取自定义msg文件变量内容,笔者定义的msg文件为gps_msg.msg,所以运行程序如下:
listerner gps_msg
运行结果如图
成功使用uORB发布,向师兄及同门请教了好多问题>_<
六.添加自启动脚本
文件所在位置:
PX4-Autopilot/ROMFS/px4fmu_common/init.d
所在位置如图
打开文件 rc.mc_apps
翻至最下方,在最下方添加 自己的线程名 start ,笔者定义的线程是x,所以在最下方添加的内容如下
x start
添加前:
添加后:
保存文件。终端打开px4源码,先清空之前编译的内容。
在Linux中,make clean
是一个常用于管理源代码编译过程的命令。这个命令通常定义在Makefile
文件中,是make
工具的一个标准目标。make clean
的主要作用是清除之前编译过程中产生的所有编译和链接产物,比如对象文件(.o
文件)、编译生成的可执行文件以及其他中间文件。这样做的目的是为了确保下一次编译是从一个干净的状态开始,避免由于旧的编译产物导致的潜在问题。
在进行源代码的编译时,尤其是在进行多次编译或者修改了源代码后,使用make clean
可以保证新的编译不会受到之前编译产物的影响,从而减少编译错误和问题。然而,需要注意的是,执行make clean
后,之前编译生成的所有文件都会被删除,所以在执行这个命令之前要确保不再需要这些文件。
清空之前的编译内容后,与之前一样,编译,启动仿真
编译代码
make px4_fmu-v5_default
编译好后,运行仿真代码
make px4_sitl_default jmavsim
观察终端
这次不用手动输入 x start,终端已经运行线程 x ,并且打印了01gps_msg.cpp中写的内容
查看gps_msg.msg中的变量内容
listener gps_msg
变量内容可自行定义。
进度条已经到底啦>_<