px4开源飞控uORB学习笔记

2023-12-18 05:48

本文主要是介绍px4开源飞控uORB学习笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这下面最重要的我觉得是这个图

摘自:https://www.cnblogs.com/kinson/p/12108591.html

px4开源飞控uORB学习笔记

1、uORB是什么,起什么作用?

uORB(Micro Object Request Broker,微对象请求代理器)是PX4/Pixhawk系统中非常重要且关键的一个模块,它肩负了整个系统的数据传输任务,所有的传感器数据、GPS、PPM信号等都要从芯片获取后通过uORB进行传输到各个模块进行计算处理。实际上uORB是一套跨「进程」 的IPC通讯模块。在Pixhawk中, 所有的功能被独立以进程模块为单位进行实现并工作。而进程间的数据交互就由为重要,必须要能够符合实时、有序的特点。在PX4中,uorb是用于无人机模块间通信的协议机制。

 

Pixhawk 使用的是 NuttX 实时 ARM 系统,uORB 实际上是多个进程打开同一个设备文件,进程间通过此文件节点进行数据交互和共享。进程通过命名的「总线」交换的消息称之为「主题」(topic),在 Pixhawk 中,一个主题仅包含一种消息类型,通俗点就是数据类型。每个进程可以「订阅」或者「发布」主题,可以存在多个发布者,或者一个进程可以订阅多个主题,但是一条总线上始终只有一条消息。

 

2、uORB运行机制

首先,我们可以将uorb的通信机制了解一下。它的设计理念很有趣,它可以实现不同模块中的数据快速通讯,并且以异步通讯为基本原则,也就是说在通讯过程中发送者只负责发送数据,而并不关心数据由谁接收,也不关心接收者是否能将所有的数据都接收到;而对于接收者来说并不关心数据是由谁发送的,也不关心在接收过程中是否将所有数据都接收到。

      uORB在在数据发布与接收过程中并不保证发送者的所有数据都可以被接收者收到,而只保证接收者在想要接收时能收到最新的数据。而发送与接收的分离可以使飞程中各个模块相互独立,互不干扰。实际上一个uORB可以由多个发送者发布,也可以被多个接收者接收,也就是说他们之间是多对多的关系。发布者以一定频率更新发布数据到uorb平台上,不关心谁来接收。订阅者可以随时来获取数据。
 

通俗例子:

有一个教室编号208,里面的黑板上可以写上一些文字内容,有一个同学名叫小强,他每隔1个小时就会来到208教室,先将黑板上原来的文字擦除,然后在黑板上写下一段新文字,之后离开208教室。而另外有一个同学叫小朋,他每隔3个小时就会来到208教室,将黑板上的文字抄写到自己的笔记本上,然后离开。我们可以用下列图例来说明一下这个过程:
 

 

我们可以看到,小强每次发布数据之后就会离开208教室,至于有没有人或是谁来读取他留下的文字,小强自己并不关心,也不再乎自己发布的数据是否有人收到了。而对于小朋来说,他每隔3小时来读取一次数据,至于这些数据是谁发布的他也不关心。他每隔3小时来读黑板上的文字时,其实小强已经在黑板上留言3次了,前两次的文字已经被小强擦除了,小朋看到的永远是小强留下最新的内容。

 

PX4/Pixhawk 应用程序框架

 

 

应用层中操作基础飞行的应用之间都是隔离的,这样提供了一种安保模式,以确保基础操作独立的高级别系统状态的稳定性。而沟通它们的就是 uORB。

 

  3、uorb常见函数的使用

3.1 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));

 

3.2 int orb_set_interval(int handle, unsigned interval)

功能:设置订阅的最小时间间隔;

说明:如果设置了,则在这间隔内发布的数据将订阅不到;需要注意的是,设置后,第一次

的数据订阅还是由起初设置的频率来获取,

参数:

handle:orb_subscribe 函数返回的句柄;

interval:间隔时间,单位 ms;

返回值:OK 表示成功;错误返回 ERROR;否则则有根据的去设置 errno;

eg:

orb_set_interval(sensor_sub_fd, 1000);

 

3.3 int orb_copy(const struct orb_metadata *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);

 

3.4 orb_advert_t orb_advertise(const 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);

 

3.5 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);

 

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

功能:监控文件描述符(多个);

说明:timemout=0,poll()函数立即返回而不阻塞;timeout=INFTIM(-1),poll()会一直阻塞下去,

直到检测到 return > 0;

参数:

fds:struct pollfd 结构类型的数组;

nfds:用于标记数组 fds 中的结构体元素的总数量;

timeout:是 poll 函数调用阻塞的时间,单位:毫秒;

返回值:

>0:数组 fds 中准备好读、写或出错状态的那些 socket 描述符的总数量;

==0:poll()函数会阻塞 timeout 所指定的毫秒时间长度之后返回;

-1:poll 函数调用失败;同时会自动设置全局变量 errno;

 

3.7 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);

 

3.8 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);

 

3.9 int orb_unsubscribe(int handle)

功能:取消订阅主题;

参数:

handle:主题句柄;

返回值:

OK 表示成功;错误返回 ERROR;否则则有根据的去设置 errno;

eg:

ret = orb_unsubscribe(handle);

 

 

 

这篇关于px4开源飞控uORB学习笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/507250

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

金融业开源技术 术语

金融业开源技术  术语 1  范围 本文件界定了金融业开源技术的常用术语。 本文件适用于金融业中涉及开源技术的相关标准及规范性文件制定和信息沟通等活动。

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

安全管理体系化的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上进行简单的操作,就可以实现全视频的接入及布控。摄像头管理模块用于多种终端设备、智能设备的接入及管理。平台支持包括摄像头等终端感知设备接入,为整个平台提