美文网首页
UORB的理解与应用

UORB的理解与应用

作者: 7b8c8241cc82 | 来源:发表于2020-01-08 17:55 被阅读0次
image.png

文件目录说明

topics:系统能用接口定义的标准主题,比如电池电量状态,GPS的位置参数等;
module.mk:UORB模块的makefile文件;
objects_common.cpp:通用接口标准主题定义集合,如添加新主题在这里定义;
ORBMap.hpp:对象请求器节点链表管理(驱动节点);
ORBSet.hpp:对象请求器节点管理(非驱动节点);
Publication.cpp:在不同的发布中遍历使用;
Publication.hpp:在不同的发布中遍历使用;Publication:发布,出版
Subscription.cpp:在不同的订阅中遍历使用;
Subscription.hpp:在不同的订阅中遍历使用;Subscription:订阅
uORB.cpp:uORB的实现;
uORB.h:uORB头文件;
uORBCommon.hpp:uORB公共部分变量定义实现;
uORBCommunicator.hpp:远程订阅接口实现,实现了对不同的通信通道管理,如添加/移除订阅者,可以基于TCP/IP或者fastRPC;传递给通信链路的实现,以提供在信道上接收消息的回调;
uORBDevices.hpp:
uORBDevices_nuttx.cpp:节点操作,close,open,read,write
uORBDevices_nuttx.hpp:
uORBDevices_posix.cpp:
uORBDevices_posix.hpp:
uORBMain.cpp:uORB入口;
uORBManager.hpp:uORB功能函数实现头文件;
uORBManager_nuttx.cpp:uORB功能函数实现(Nuttx);
uORBManager_posix.cpp:uORB功能函数实现(Posix);
uORBTest_UnitTest,cpp:uORB测试;
uORBTest_UnitTest.hpp:uORB测试头文件,包括主题定义和声明等;
uORBUtiles.cpp:
uORBUtiles.hpp:

常用函数解析:

int poll(struct pollfd fds[], nfds_t nfds, int timeout)

功能:监控文件描述符(多个);
说明:timeout=0,poll()函数立即返回而不阻塞;timeout=INFTIM(-1),poll()会一直阻塞 下去,直到检测到return>0;
参数:
fds:struct pollfd结构类型的数组;
nfds:用于标记数组fds中的结构元素的总数量;
timeout:是poll函数调用阻塞的时间,单位:毫秒;
返回值:
>0数组fds中准备好读、写或出错状态的那些socket描述符的总数量;
==0:poll()函数会阻塞timeout所指定的毫秒时间长度之后返回;
-1:poll函数调用失败;同时会自动设置全局变量errno;

int orb_subscribe(const struct orb_metadata *meta)

功能:订阅主题(topic);
说明:即使订阅的主题没有被公告,但是也能订阅成功;但是在这种情况下,却得不到数据,直到主题被公告;
参数:
meta:uORB元对象,可以认为是主题id,一般是通过ORB_ID(主题名)来赋值;
返回值:
错误则返回ERROR;成功则返回一个可以读取数据、更新话题的句柄;如果待订阅的主题没有定义或声明则会返回-1,然后会将errno赋值为ENOENT;
eg:
int fd = orb_subscribe(ORB_ID(topicName));

int orb_copy(const struct orb_metaaadata *meta, int handle, void *buffer)

功能:从订阅的主题中获取数据并将数据保存到buffer中;
参数:
meta:uORB元对象,可以认为是主题id,一般是通过ORB_ID(主题名)来赋值;
handle:订阅主题返回的句柄;
buffer:从主题中获取的数据;
返回值:
返回OK表示获取数据成功,错误返回ERROR;否则则有根据的去设置errno;
eg:
struct sensor_combined_s raw;
orb_copy(ORB_ID(sensor_combined), sensor_sub_fd, &raw);

orb_advert_t orb_advertise(cost struct orb_metadata *meta, const void *data)

功能:公告发布者的主题;
说明:在发布主题之前是必须的;否则订阅者虽然能订阅,但是得不到数据;
参数:
meta:uORB元对象,可以认为是主题id,一般是通过ORB_ID(主题名)来赋值;
data:指向一个已被初始化,发布者要发布的数据存储变量的指针;
返回值:错误则返回ERROR;成功则返回一个可以发布主题的句柄;如果待发布的主题没有定义或声明则会返回-1,然后会将errno赋值为ENOENT;
eg:
struct vehicle_attitude_s att;
memset(&att, 0, sizeof(att));
int att_pub_fd = orb_advertise(ORB_ID(vehicle_attitude), &att);

int orb_publish(const struct orb_metadata *meta,orb_advert_t handle, const void *data)

功能:发布新数据到主题;
参数:
meta:uORB元对象,可以认为是主题id,一般是通过ORB_ID(主题名)来赋值;
handle:orb_advertise函数返回的句柄;
data:指向待发布数据的指针;
返回值:OK表示成功;错误返回ERROR;否则则有根据的去设置errno;
eg:
orb_publish(ORB_ID(vehicle_attitude), att_pub_fd, &att);

int orb_set_interval(int hande, unsigned interval)

功能:设置订阅的最小时间间隔;
说明:如果设置了,则在这间隔内发布的数据将订阅不到;需要注意的是,设置后,第一次的数据订阅还是由起初设置的频率来获取,
参数:
handle:orb_subscribe函数返回的句柄;
interval:间隔时间,单位ms;
返回值:OK表示成功;错误返回ERROR;否则则有根据的去设置errno;
eg:
orb_set_interval(sensor_sub_fd, 1000);

orb_advert_t orb_advertise_multi(const struct orb_metadata *meta,const void *data,int *instance, int priority)

功能:设备/驱动器的多个实例实现公告,利用此函数可以注册多个类似的驱动程序;
说明:例如在飞行器中有多个相同的传感器,那他们的数据类型则类似,不必要注册几个不同的话题;
参数:
meta:uORB元对象,可以认为是主题id,一般是通过ORB_ID(主题名)来赋值;
data:指向一个已被初始化,发布者要发布的数据存储变量的指针;
instance:整型指针,指向实例的ID(从0开始);
priority:实例的优先级。如果用户订阅多个实例,优先级的设定可以使用户使用优先级高的最优数据源;
返回值:
错误则返回ERROR;成功则返回一个可以发布主题的句柄;如果待发布的主题没有定义或声明则会返回-1,然后会将errno赋值为ENOENT;
eg:
struct orb_test t;
t.val = 0;
int instance0;
orb_advert_t pfd0 = orb_advertise_multi(ORB_ID(orb_multitest), &t, &instance0, ORB_PRIO_MAX);

int orb_subscribe_multi(const struct orb_metadata *meta, unsigned instance)

功能:订阅主题(topic);
说明:通过实例的ID索引来确定是主题的哪个实例;
参数:
meta:uORB元对象,可以认为是主题id,一般是通过ORB_ID(主题名)来赋值;
instance:主题实例ID;实例ID=0与orb_subscribe()实现相同;
返回值:
错误则返回ERROR;成功则返回一个可以读取数据、更新话题的句柄;如果待订阅的主题没有定义或声明则会返回-1,然后会将errno赋值为ENOENT;
eg:
int sfd1 = orb_subscribe_multi(ORB_ID(orb_multitest), 1);

int orb_unsubscribe(int handle)

功能:取消订阅主题;
参数:
handle:主题句柄;
返回值:
OK表示成功;错误返回ERROR;否则则有根据的去设置errno;
eg:
ret = orb_unsubscribe(handle);

int orb_check(int handle, bool *updated)

功能:订阅者可以用来检查一个主题在发布者上一次更新数据后,有没有订阅者调用过ob_copy来接收、处理过;
说明:如果主题在在被公告前就有人订阅,那么这个API将返回“not-updated”直到主题被公告。可以不用poll,只用这个函数实现数据的获取。
参数:
handle:主题句柄;
updated:如果当最后一次更新的数据被获取了,检测到并设置updated为ture;
返回值:
OK表示检测成功;错误返回ERROR;否则则有根据的去设置errno;
eg:
if (PX4_OK != orb_check(sfd, &updated)) {
return printf("check(1) failed");
}
if (updated) {
return printf("spurious updated flag");
}

// or

bool updated;
struct random_integer_data rd;

/* check to see whether the topic has updated since the last time we read it */
orb_check(topic_handle, &updated);

if (updated) {
/*make a local copy of the updated data structure */
orb_copy(ORB_ID(random_integer), topic_handle, &rd);
printf("Random integer is now %d\n", rd.r);
}

int orb_stat(int handle, uint64_t *time)

功能:订阅者可以用来检查一个主题最后的发布时间;
参数:
handle:主题句柄;
time:存放主题最后发布的时间;0表示该主题没有发布或公告;
返回值:
OK表示检测成功;错误返回ERROR;否则则有根据的去设置errno;
eg:
ret = orb_stat(handle,time);

int orb_exists(const struct orb_metadata *meta, int instance)

功能:检测一个主题是否存在;
参数:
meta:uORB元对象,可以认为是主题id,一般是通过ORB_ID(主题名)来赋值;
instance:ORB 实例ID;
返回值:
OK表示检测成功;错误返回ERROR;否则则有根据的去设置errno;
eg:
ret = orb_exists(ORB_ID(vehicle_attitude),0);

int orb_priority(int handle, int *priority)

功能:获取主题优先级别;
参数:
handle:主题句柄;
priority:存放获取的优先级别;
返回值:
OK表示检测成功;错误返回ERROR;否则则有根据的去设置errno;
eg:
ret = orb_priority(handle,&priority);

相关文章

  • UORB的理解与应用

    文件目录说明 topics:系统能用接口定义的标准主题,比如电池电量状态,GPS的位置参数等;module.mk:...

  • Pixhawk--uORB 消息

    uORB[https://docs.px4.io/v1.12/zh/middleware/uorb.html]...

  • PX4 QGC透明串口转发三--自定义uORB消息实现,实现P

    3. 自定义uORB消息实现,实现PX4模块间数据传递 uORB官方说明 设计构想 上一节实现了 QGC <--m...

  • 理解与应用的距离

    一直以为,数学知识只要能理解,就能熟练应用,达到举一反三的效果。今天教孩子们学习《除数是两位数的笔算除法》才发现,...

  • GCD的理解与应用

    一. GCD应用中主要分为函数和队列函数分为:同步函数,异步函数同步函数 dispatch_sync(dispat...

  • NSInvocation应用与理解

    源文在此IOS中有一个类型是SEL,它的作用很相似与函数指针,通过performSelector:withObje...

  • NSInvocation应用与理解

    NSMethodSignature 顾名思义应该就是“方法签名”,类似于C++中的编译器时的函数签名。苹果官方定义...

  • vuex 理解与应用

    第一章 初识vuex vuex有什么用? 比如, vue做了一个音乐app, 里面的播放组件, 这组件应该是在所有...

  • RunLoop理解与应用

    什么是RunLoop 简单的来说就是运行循环、跑圈。 保持着程序的持续运行并接受用户输入 处理APP中的各种事件(...

  • ThreadLocal 理解与应用

    ThreadLocal 理解与应用 在并发编程中,我们主要考虑的问题是多个线程对于共享数据的访问,并在访问共享数据...

网友评论

      本文标题:UORB的理解与应用

      本文链接:https://www.haomeiwen.com/subject/npysactx.html