Px4-使用uORB发布消息

介绍

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

 

 变量内容可自行定义。

进度条已经到底啦>_<

  • 17
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
PX4-Gazebo是指在PX4无人机开发中使用的Gazebo仿真软件。Gazebo是一个能够模拟现实世界的仿真软件,可以在其中运行PX4无人机模型。在PX4的源代码中,已经提供了PX4无人机的Gazebo模型,通过运行相应的launch文件,可以在Gazebo中模拟无人机的行为。\[1\] 在使用PX4-Gazebo时,可能会遇到一些问题。例如,可能会出现内存不足的情况。解决方法可以是为Ubuntu挂载一个8G的swap虚拟内存。具体的操作可以参考相关链接。\[2\] 另外,有时在运行PX4-Gazebo时,可能会遇到没有弹出Gazebo仿真界面的情况。这可能是因为需要使用root权限运行。可以尝试使用sudo命令来运行相应的指令。\[2\] 此外,关于PX4-Gazebo的目录结构建立,可以参考相关链接中的说明。在使用PX4源代码时,需要注意执行git submodule update --init --recursive命令,以获取所需的每个模块的代码。\[3\] 总之,PX4-Gazebo是一个用于模拟PX4无人机行为的仿真软件,使用时需要注意相关的配置和操作步骤。 #### 引用[.reference_title] - *1* [PX4无人机-Gazebo仿真实现移动物体的跟踪](https://blog.csdn.net/qq_44939973/article/details/120965458)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [PX4无人机仿真_Gazebo(1)](https://blog.csdn.net/yanwumuxi/article/details/80097294)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值