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_s及ORB_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中,从b→b,不一样的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;
}
测试结果如下: