Pixhawk---在cmake编译方式下新建一个自定义主题

本文介绍如何在PX4飞行控制系统中创建自定义uORB主题,包括定义消息格式、生成主题头文件、编写测试模块并发布与订阅数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、C:\px4\Firmware\msg中添加mytopic.msg,在文件里声明你的存放数据的结构体成员变量(注意:仅仅是成员变量。如结构体为structmyuorb_test_s{uint16 r};,那么.msg文件中就写uint16 r 就可以了)。

好吧那我们就写uint16 b;// rand()需要无符号整形

2、文件写好了在当前文件夹中的CMakeList.txt编译脚本文件中添加我们的msg,还是打开虚拟机在里面写吧。(要怎么备份是个问题,直接副本好了ps:win10还没去设置改后缀名的鬼东西,差点把txt当成msg)注册后,在编译固件时会自动生成myuorb_test.h文件,该文件里定义了数据结构体mytopic_sORB_DECLARE

3要在代码中使用主题,首先添加头文件:

#include <uORB/topics/topic_name.h>


①在/Firmware/src/modules中创建文件夹mytopic_test,打开,里面新建CMakeLists.txt

参照px4_simple_app的写法:

px4_add_module(

    MODULEmodules__mytopic_test

    MAIN mytopic_test

    STACK_MAIN2000

COMPILE_FLAGS

           -Os    //这个我看别的module有我就加了,还是去掉吧

    SRCS

        mytopic_test.cpp    //我们新建的源文件

    DEPENDS

        platforms__common

    )

②新建mytopic_test.cpp,从px4_simple_app.c里面copy过来一些东西,改一些东西:

//包含头文件

#include <px4_config.h>

#include <px4_tasks.h>

#include <px4_posix.h>

#include <unistd.h>

#include <stdio.h>

#include <poll.h>

#include <string.h>

 

#include <uORB/uORB.h>

#include <uORB/topics/mytopic.h>  //这是我们定义的主题

 

//这里要加extern "C",不然编译的时候会说你没有声明这个main函数,但是px4_simple_app里面是没有的。郁闷

extern "C"__EXPORT int mytopic_test_main(int argc, char *argv[]);

 

int mytopic_test_main(int argc, char *argv[]) //主函数

{

       PX4_INFO("Hello Sky!This is my topic test!!!");  //打印

       

//publish data

  //先订阅获取句柄mytopic_sub→与ID关联

        intmytopic_sub = orb_subscribe(ORB_ID(mytopic));

        structmytopic_s rd; //定义类型为mytopic_s的结构体变量rd

 

       rd.b=rand()%100;// 0~100取随机数,然后赋值给结构体rd中的成员变量b

                        // 之前的 uint16 b

 

//调用公告接口定义orb_advert_t类型的 mytopic_pub句柄与ID关联

       orb_advert_t mytopic_pub = orb_advertise(ORB_ID(mytopic), &rd);

       orb_publish(ORB_ID(mytopic), mytopic_pub, &rd);//publish

 

       PX4_WARN("the new data is: \t%d",rd.b);//把此时生成的随机数b打印

                                              //rd的b

 

        boolupdated;

        structmytopic_s rdreceive;//定义结构体类型为mytopic_s的结构体变量

 

       orb_check(mytopic_sub,&updated); //检查有没有更新,

//有更新返回updated为ture

       if(updated)

            {

                //把更新的数据返回到rdreceive中,从bb,不一样的b

                orb_copy(ORB_ID(mytopic),mytopic_sub,&rdreceive);

//打印从我们的topic获取的数据b, rdreceive的b

               PX4_WARN("the updated data is: \t%d",rdreceive.b);

            }

            else

            {

               PX4_WARN("data is not updated");

            }

 

       PX4_INFO("exiting");

        return0;

}

测试结果如下:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值