没有合适的资源?快使用搜索试试~ 我知道了~
PX4之uORB深入懂得和应用
5星 · 超过95%的资源 需积分: 20 52 下载量 141 浏览量
2016-08-24
10:34:20
上传
评论 1
收藏 1.32MB PDF 举报
温馨提示
试读
19页
详细讲解uORB机制的原理与应用
资源推荐
资源详情
资源评论
The Instructions of uORB
『PX4/Pixhawk』 『软件体系结构』 『uORB』 『主题发布』 『主题订阅』
1 简介
1.1 PX4/Pixhawk 的软件体系结构
PX4/Pixhawk 的软件体系结构主要被分为四个层次,这可以让我们更好的理解
PX4/Pixhawk 的软件架构和运作:
应用程序的 API:这个接口提供给应用程序开发人员,此 API 旨在尽可能的精简、扁平及隐
藏其复杂性。
应用程序框架: 这是为操作基础飞行控制的默认程序集(节点)。
库: 这一层包含了所有的系统库和基本交通控制的函数。
操作系统: 最后一层提供硬件驱动程序,网络,UAVCAN 和故障安全系统
uORB(Micro Object Request Broker,微对象请求代理器)是 PX4/Pixhawk 系统中非常重要
且关键的一个模块,它肩负了整个系统的数据传输任务,所有的传感器数据、GPS、PPM 信
号等都要从芯片获取后通过 uORB 进行传输到各个模块进行计算处理。实际上 uORB 是一
套跨「进程」 的 IPC 通讯模块。在 Pixhawk 中, 所有的功能被独立以进程模块为单位进
行实现并工作。而进程间的数据交互就由为重要,必须要能够符合实时、有序的特点。
Pixhawk 使用的是 NuttX 实时 ARM 系统,uORB 实际上是多个进程打开同一个设备文
件,进程间通过此文件节点进行数据交互和共享。进程通过命名的「总线」交换的消息称之
为「主题」(topic),在 Pixhawk 中,一个主题仅包含一种消息类型,通俗点就是数据类型。
每个进程可以「订阅」或者「发布」主题,可以存在多个发布者,或者一个进程可以订阅多
个主题,但是一条总线上始终只有一条消息。
1.2 PX4/Pixhawk 应用程序框架
应用层中操作基础飞行的应用之间都是隔离的,这样提供了一种安保模式,以确保基础
操作独立的高级别系统状态的稳定性。而沟通它们的就是 uORB。
2 uORB 文件夹说明
2.1 uORB 文件夹结构
2.2 文件/目录说明
topics : 系统通用接口定义的标准主题,比如电池电量转态、GPS 的位置参数等
module.mk : uORB 模块 makefile 文件
objects_common.cpp: 通用接口标准主题定义集合,如添加新主题在这里定义
ORBMap.hpp : 对象请求器节点链表管理(驱动节点)
ORBSet.hpp : 对象请求器节点管理(非驱动节点)
Publication.cpp : 在不同的发布中遍历使用
Publication.hpp : 在不同的发布中遍历使用
Subscription.cpp : 在不同的订阅中遍历使用
Subscription.hpp : 在不同的订阅中遍历使用
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 :
3 常用函数功能解析
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;
剩余18页未读,继续阅读
资源评论
- 良非2022-03-23写的很好
- 丐帮帮主乔峰2019-04-11该文档的内容翔实,绝对的货真价实
平行交叉
- 粉丝: 17
- 资源: 9
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功