uORB(Micro Object Request Broker,微对象请求代理器)是PX4/Pixhawk系统中非常重要且关键的一个模块,它肩负了整个系统的数据传输任务,所有的传感器数据、GPS、PPM信号等都要从芯片获取后通过uORB进行传输到各个模块进行计算处理。实际上uORB是一套跨「进程」 的IPC通讯模块。在Pixhawk中, 所有的功能被独立以进程模块为单位进行实现并工作。而进程间的数据交互就由为重要,必须要能够符合实时、有序的特点。
uORB实际上是多个进程打开同一个设备文件,进程间通过此文件节点进行数据交互和共享。
进程通过命名的「总线」交换的消息称之为「主题」(topic),在Pixhawk 中,一个主题仅包含一种消息类型,通俗点就是数据类型。
每个进程可以「订阅」或者「发布」主题,可以存在多个发布者,或者一个进程可以订阅多个主题,但是一条总线上始终只有一条消息。
应用层中操作基础飞行的应用之间都是隔离的,这样提供了一种安保模式,以确保基础操作独立的高级别系统状态的稳定性。而沟通它们的就是uORB。
Topic:很多主题数据,姿态 位置
Msg:姿态数据结构体message
**程序函数:**int orb_subscribe(const struct orb_metadata *meta)
功能:订阅主题(topic);
参数:
meta:uORB元对象,可以认为是主题id;
返回值:正确返回一个句柄,句柄是你自己定义的,初始化为-1,如int my_topic_sub=-1;
int my_topic_sub = orb_subscribe(ORB_ID(my_topic));
int orb_set_interval(int handle, unsigned interval)
功能:设置订阅的最小时间间隔;
int poll(struct pollfd fds[], nfds_t nfds, int timeout)
功能:监控文件描述符(多个);
fds:struct pollfd结构类型的数组,进程可以同时等待很多个主题数据,当有数据更新时,判断一下是谁
nfds:用于标记数组fds中的结构体元素的总数量;
timeout:是poll函数调用阻塞的时间,单位:毫秒;
返回值:
0:阻塞时间内拿到了数据;
==0:抱歉时间都用完了,也没能拿到数据;
-1:poll函数调用失败;
int orb_check(int handle, bool *updated)
功能:检查一个主题数据有没有更新,更新了updated会被设置为true。但一旦调用ob_copy来接收、处理过后,updated会被自动设置为false,所以这种方式数据只能被第一个人检测到,后面人再检测到时updated已经是false。
int orb_copy(const struct orb_metadata *meta, int handle, void *buffer)
功能:从订阅的主题中获取数据并将数据保存到buffer中。meta消息的ID,handle句柄,哪个句柄,你订阅时返回的句柄,从消息中拷贝数据放到buffer中。buffer是自己消息的数据结构类型自己定义的。例:sensor_combined_s raw ;orb_copy(ORB_ID(sensor_combined), sensor_sub_fd, &raw);
orb_advert_t orb_advertise(const struct orb_metadata *meta, const void *data)
功能:先公告主题,相当于注册,只要一次就行了。meta公告的消息ID,data公告的原始数据。
说明:在发布主题之前是必须的;否则订阅者虽然能订阅,但是得不到数据;
int orb_publish(const struct orb_metadata *meta, orb_advert_t handle, const void *data)
功能:公告之后就可以发布主题数据。meta公告的消息ID,handle公告返回的句柄,这个句柄初始化为null,data发布的数据,要发布什么数据,自己填充。
int orb_unsubscribe(int handle)
功能:取消订阅主题;
参数:
handle:主题句柄;
返回值:
OK表示成功;错误返回ERROR;否则则有根据的去设置errno;
eg:
ret = orb_unsubscribe(handle);
数据传递函数:
1、
void *memset(void *s, int c, size_t n)
作用是在一段内存块中填充某个给定的值,将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 c 替换并返回 s
例子:
memset(&actuator_controls, 0, sizeof(actuator_controls));
表示将actuator_controls的各位置0
2、
FAR void *memcpy(FAR void *dest, FAR const void *src, size_t n)
{
FAR unsigned char pout = (FAR unsigned char)dest;
FAR unsigned char pin = (FAR unsigned char)src;
while (n– > 0) *pout++ = *pin++;
return dest;
}
从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。
例子:
memcpy(val, v, param_size(param));
表示将v中的前n个值复制到val中
3、
uintptr_t param_find(const char *name) //unsigned int pointer
参数:
*name 指针名
功能:
返回指针指向的值
例子:
param_t _param_system_id = param_find(“MAV_SYS_ID”);
PARAM_DEFINE_INT32(MAV_SYS_ID, 1);
表示将MAV_SYS_ID所代表的值1赋给_param_system_id
4、
int param_get(param_t param, void *val)
参数:
param 源参数;
val 目标参数指针
功能:获取param的地址并赋给val
例子:
param_get(_param_system_id, &(status.system_id));
表示将_param_system_id的地址写入status.system_id中
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)