pixhawk自学笔记之uorb学习总结

2023-05-16


注:这是看过好多文章总结出来的,转载了较多人的博客,希望有知道原出处的人把地址留下,我贴上来。在此谢谢各位前辈的总结。(我会在后续笔记中贴出在我自己的程序中对于uorb的使用)


进程与应用程序(传感器应用程序发送传感器数据到姿态过滤应用程序)之间的通讯是pixhawk软件架构的重要组成部分,进程(即所谓的节点)通过命名的总线交换消息称之为“主题”,在pixhawk中,一个主题仅包含一种消息类型,例如:vehicle_attitude主题传输包含姿态结构(翻滚,俯仰和偏航估算)。节点可以在总线,主题上发布一跳消息或者订阅总线,主题。通讯双方之间并不知道在与谁通讯,可以存在多个发布或一条消息有多个订阅者。这种设计模式可以防止锁定的问题。

pixhawk的发布订阅机制是通过“微对象请求代理”(uORB)来实现的。

快速入门:

在深入细节之前,以下是一对简单,完整的发布/订阅模型。发布者发布一条名为“random——integer”的主题并用随机整数更新该主题。订阅者检查并打印这些更新。


topic.h
/* declare the topic */
ORB_DECLARE(random_integer);/* define the data structure that will be published where subscribers can see it */
struct random_integer_data {int r;};

publisher.c
#include <topic.h>/* create topic metadata */
ORB_DEFINE(random_integer);/* file handle that will be used for publishing */
static int topic_handle;
int init(){/* generate the initial data for first publication */
	struct random_integer_data rd = { .r = random(), };/* advertise the topic and make the initial publication */
	topic_handle = orb_advertise(ORB_ID(random_integer), &rd);
}
int update_topic(){/* generate a new random number for publication */
	struct random_integer_data rd = { .r = random(), };/* publish the new data structure */
	orb_publish(ORB_ID(random_integer), topic_handle, &rd);
}

subscriber.c
#include <topic.h>/* file handle that will be used for subscribing */
static int topic_handle;
int init(){/* subscribe to the topic */
	topic_handle = orb_subscribe(ORB_ID(random_integer));
}
void check_topic(){
	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);
		}
}

发布:

    发布分为三个独立但又相关的行为;确定主题,公告主题和发布主题更新。

 

确定主题:

    pixhawk系统为提供部件之前的通用接口定义了许多标准主题,如果发布者想使用标准主题和相关的数据结构不需要做额外的工作。

 

自定义主题

    要定义一个自定义主题,发布者需要提供给订阅者一个头文件(参考上面的topic.h),在这个头文件中必须有:

        1.用主题的名称做作为参数调用ORB_DECLARE()宏来定义一个实例

        2.定义一个结构体,用来描述将要用来发布的数据结构

主题的名称应该要具有描述性,pixhawk的管理使用下划线来分割主题名称为独立的部分并且首选更通用的术语表示元件的名称。

    例如:raw sensor data发布在sensors_raw主题

 

除了头文件,发布者必须要具有使用ORB_DEFINE()宏在源码中定义一个实例,当固件被构建时,他将被编译并且链接到固件。

可选主题:

        如果一个主题通过一个软件组件来发布,那么它属于可选主题,并且可能不会存在于发布后的固件,这种情况下,头文件也可以改用ORB_DECLARE_OPTIONAL()宏来替代,以这种方式声明主题,发布者不需要专门来处理什么。但在下面讨论的也有额外要处理的情况,当处理可选主题时订阅者必须要注意。

 

公告主题:

        在数据被发布到一个主题前,它必须被公告,发布者可以使用下面的API来公告一个新的主题。

    extern int orb_advertise(const struct orb_metadata *meta, const void *data);

    公告也可以发布初始化数据到主题,meta参数是传递给API的一个指针,指向由ORB_DEFINE()宏定义好的数据,通常使用ORB_ID()宏来根据主题名称获取该指针。请注意,虽然主题更新可以从中断处理函数发布,公告主题必须在常规的线程上下文中执行。

多个发布:

        只有一个发布者可以具有发布一次一个主题,但是该主题手柄可以被关闭,因为是文件描述符,可以通过close()函数关闭。 

发布更新:

        一旦公告了一个主题,公告主题后返回的句柄可使用下面的API来发布主题更新。

    extern int orb_publish(const struct orb_metadata *meta, int handle, const void *data);
 U ORB不换冲多个更新,当用户检查一个主题,他们将只能看到最新的更新。

订阅者:

        订阅主题的要求如下:

                1.调用ORB_DEFINE()或ORB_DEFINE_OPTIONAL()宏(在订阅者的头文件中包含他们)

                2.发布到主题的数据结构定义(通常与发布者使用同一头文件)

        如果满足上面的条件后,订阅者可以使用下面的api来订阅一个主题:

    extern int orb_subscribe(const struct orb_metadata *meta);


 如果可选主题不存在于固件之中,订阅到可选的主题将会失败,但其他主题即便发布者没有进行公告也会订阅成功,这样可大大降低系统对启动顺序的安排。

        这里没有专门来限制一个任务的最大订阅数。

        要取消订阅一个主题,可以用下面的API:

    extern int orb_unsubscribe(int handle);

拷贝数据到主题:

        订阅者不能引用ORB中存储的数据或其他订阅共享的数据,而是在订阅者请求时从ORB拷贝数据到订阅者的临时缓冲区。副本拷贝的方式可以避免锁定ORB的问题,并保持两者之间(发布者,订阅者)的API接口简单。它也允许订阅者在必要的时候直接修改拷贝副本的数据供自己使用。

        当订阅者想要把主题中的最新数据拷贝一份全新的副本,可以使用:

    extern int orb_copy(const struct orb_metadata *meta, int handle, void *buffer);  

 拷贝是以原子操作进行的,所以可以保证获取到发布者最新的数据。

检查更新:

        订阅者可以使用下面的API来检查一个主题在发布者最后更新后,有没有人调用过orb_copy来接收,处理:

    extern int orb_check(int handle, bool *updated);      

   如果主题在被公告前就有人订阅,那么这个API将返回“not-updated”直到主题被公告。

发布时间戳:

        订阅者可以使用下面的API来检查一个主题最后发布的时间。

    extern int orb_stat(int handle, uint64_t *time);
需要注意的是,要小心的使用这个调用,因为不能保证再调用返回后不久主题就不会被发布(调用返回后不久,主题可能马上又被发布,导致最后更新时间错误)



uORB的管理罗辑是通过创建线程后台运行方式实现。

uORB深入探索

        uORB是pixhawk系统中非常重要的一个模块,它肩负了整个系统的数据传输任务,所有的传感器数据,GPS,ppm信号等都要从芯片获取后通过uORB进行传输到各个模块进行计算处理。

        1.uORB的架构简述:

         uORB是一套跨进程的IPC通讯模块。在pixhawk中,所有的功能被独立以进程模块为单位进行实现并工作。而进城间的数据交互尤为重要,必须要能够符号实时,有序的特点。

        pixhawk使用nuttx实时ARM系统,而uORB对于nuttx而言,它仅仅是一个普通的文件设备对象,这个设备支持open,close,read,write,ioctl以及poll机制。通过这些接口的实现,uORB提供了一套“点对多”的跨进程广播通讯机制。“点”指的是通讯消息的“源”,“多”指的是一个源可以有多个用户来接受,处理。而源和用户的关系在于,源不需要去考虑用户是否课余i收到某条被广播的消息或什么时候收到这条消息。它只是需要单纯的把要广播的数据推送到uORB的消息总线上,对于用户而言,源推送了多少次的小心也不重要,重要的是取回最新的这条消息。

 

        2.uORB的实现位于固件源码的src/modules/uORB/uORB.cpp文件,它通过重载CDev基类来组织一个uORB的设备实例。并且完成Read/Write等功能的重载。uORB的入口点是uorb_main函数,在这里它检查uORB的启动参数来完成对应的功能,uORB支持start/test/status这3条启动参数,在pixhawk的rcS启动脚本中,使用start参数来进行初始化,其他2个参数分别用来进行uORB功能的自检和列出uORB的当前状态。

        在rcS中使用start参数启动后,uORB会创建并初始化它的设备实例,其中的实现大部分都在CDev基类完成。这个过程类似于Linux设备驱动中的Probe函数,通过init调用完成设备的创建,节点注册以及派遣例程的设置等。

 

        源码解读:(最新版本的uORB)

        uORB文件夹说明

        1.uORB文件夹结构

2.文件/目录说明

            objects_common.cpp:通用接口标准主题定义集合,如添加新主题就在这里定义。

            uORBMap.hpp:对象请求节点链表管理(驱动节点)

            uORBSet.hpp:对象请求节点链表管理(非驱动节点)

           Publication.cpp/ Publication.hpp:在不同的发布中遍历使用

           Subscription.cpp/ Subscription.hpp:在不同的发布中遍历使用

            uORB.cpp:uORB的实现

            uORB.h:uORB的头文件

            uORBCommon.hpp:uORB公共部分变量定义实现

            uORBCommunicator.hpp:远程订阅的接口实现,实现了对不同的通信通道管理,如添加、移除订阅者,可以基于TCP/IP或者fastRPC;传递给通信链路的实现,以提供在信道上接收信息的回调。

            uORBDevices_nuttx.cpp:节点操作,close,open,read,write等

            uORbMain.cpp:uORB入口

            uORBManager.hpp:uORB功能函数实现的头文件

            uORBManager_nuttx.cpp:uORB功能函数的实现(Nuttx)

           uORBManager_posix.cpp:uORB功能函数的实现(Posix)

           uORBTest_UnitTest.cpp:uORB测试

            uORBTest_UnitTest.hpp:uORB测试头文件,包括主题定义和声明等






本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pixhawk自学笔记之uorb学习总结 的相关文章

  • XTDrone学习笔记二:在Fedora运行ORB_SLAM2+PX4的仿真

    对应肖老师的内容 xff1a 视觉SLAM ORB SLAM2针对Fedora上使用的修改已提交到github上 在Fedora上的仿真环境搭建请参考 xff1a XTDrone学习笔记一 xff1a ROS 43 PX4仿真平台基础配置
  • 数据清洗的一些梳理

    xff08 欢迎转载到个人朋友圈 xff0c 转载时请带原文链接 xff0c 公众号和其他媒体转载前请私信联系本人获取授权 xff09 首先对 64 MayaG表示感谢 xff0c 这篇文章是被你提的问题激发出的灵感 xff0c 非常感谢
  • Conda install package遇到CondaHTTPError: HTTP 000 Connection Failed问题

    新安装的anaconda xff0c 在使用conda install时候会遇到错误信息 xff1a SSLError MaxRetryError 39 HTTPSConnectionPool host 61 39 repo anacond
  • 通过Node-Red将西门子PLC数据上传至阿里云物联网平台并进行可视化显示

    本篇基于我之前的文章 利用Node Red读写西门子PLC并将数据上传至云服务器 xff0c Node Red搭建及读写PLC部分请参考该文章 首先在阿里云物联网平台开通公共实例 xff0c 开通成功后在公共实例的设备管理 产品处点击创建产
  • C++笔记--关于string, char*, char[]中的‘\0’问题(2-3)

    0 问题 const char 字符串 以 0 结尾char 字符串 以 0 结尾string 字符串 不以 0 结尾char n 61 34 string 34 当string 长度 43 0 gt n时 xff0c 会因空间不足出错st
  • 经典C++笔试题目--100(C++面向对象的特性(38-61))

    C 43 43 面向对象的特性 38 61 38 是不是一个父类写了一个virtual 函数 xff0c 如果子类覆盖它的函数不加virtual 也能实现多态 参考答案 virtual修饰符会被隐形继承的 virtual可加可不加 子类的空
  • 经典C++笔试题目--100(编程练习(比C要难)(91-100))

    编程练习 比C要难 91 100 91 请编写一个 C 函数 xff0c 该函数给出一个字节中被置 1 的位的个数 参考答案 unsigned int TestAsOne0 char log int i unsigned int num 6
  • 小四轴调试笔记

    9 22 使用dmp进行姿态解算时 由于小四轴尺寸很小 电机和6050的距离略近 电机对MPU6050的影响就会很大当然 这种情况仅发生在尺寸很小的小四轴并且使用DMP时 图为电机转速增到最大时6050的值 可见加速度和角速度都发生了剧烈变
  • [STM32]开源光流定点 四轴 PIX

    废话不多说先上图 xff1a 硬件配置 xff1a STM32F407VET6 MPU6050 VL53L0X 光流的概念是Gibson在1950年首先提出来的 它是空间运动物体在观察成像平面上的像素运动的瞬时速度 xff0c 是利用图像序
  • svn status详解

    svn 是在提交前查看本地文本和版本库里面的文件的区别 返回值有许多种具体含义如下 xff1a url 61 L abc c svn已经在 svn目录锁定了abc c M bar c bar c的内容已经在本地修改过了 M baz c ba
  • 如何应对软件需求不明确、需求频繁更改和需求的无底洞

    入职以来一直会遇到这种问题 xff0c 也许是软件行业的死穴 xff0c 任何项目如果处理不好解决不了这些问题 xff0c 就相当于得了慢性绝症 xff0c 不但项目的结局是死路 xff0c 经手项目的每 个开发人员到管理者都在经受挑战人体
  • Ubuntu 20.04换国内源 清华源 阿里源 中科大源 163源

    Ubuntu 20 04 是 Ubuntu 的第 8 个 LTS 版本 xff0c 其重大更新和改进将在 2030 年前终止 xff0c 计划于2020年 4 月 23 日发布 国内有很多Ubuntu的镜像源 xff0c 包括阿里的 网易的
  • 详解100行c11线程池 ThreadPool.h

    介绍 这个大神的100行实现c11线程池 xff0c 真的是相当简洁给力 xff0c 偶尔会在项目里面使用 xff0c 但是老实说一直是迷迷糊糊 xff0c 并不清楚具体实现细节 xff0c 现在有空学习了一波 xff0c 记录一下 xff
  • ORB特征提取匹配opencv3代码实现

    span class hljs preprocessor include lt iostream gt span span class hljs preprocessor include lt opencv2 core core hpp g
  • 利用ZeroMQ传输图片

    待传输的数据 cv Mat mat 订阅端 xff08 sub xff09 import cv2 import zmq sub port 61 span class hljs number 6666 span context 61 zmq
  • OpenStack部署工具总结

    目前感觉比较简单直观的部署工具有RDO devstack Fuel等 xff1a 1 RDO https OpenStack redhat com Quickstart REDHAT出品 xff0c 支持Redhat CentOS等系统 R
  • Python中的函数与变量讲解

    不知道大家在学习Python的时候 xff0c 有没有发现一个问题 xff0c 函数里边的变量和脚本里边的变量好像是无关的 本文今天要讲的就是Python中的函数与变量 xff0c 如果大家对于这个方面的内容有困惑 xff0c 不妨来一起学
  • Python+OpenCV静态图像读取与显示_Haar模型实现简单的人脸识别

    目的 xff1a 1 主要是熟悉一下静态图像的读取与显示 xff1b 2 然后了解下基于OpenCV安装目录下haar特征识别人脸区域 人脸特征数据 基于 tengxing007 的博客 xff1a Python 43 OpenCV 实现简
  • 富斯FS-T6 APM飞控四种飞行模式设置方法_MIX混控设置

    来源于5iMX论坛的这篇帖子 富斯FS T6 APM飞控两种飞行模式设置方法点击打开链接 但是我按照作者的设置MIX的方法 xff0c 怎么都只有三种通道 先上图吧 xff1a 1 我的混控设置 xff1a OFFSET是偏移量 xff0c
  • Netfilter笔记-02

    Netfilter说白了就是针对不同的协议 xff08 协议类型和hook节点我们上一章已经讲过 xff09 在kernel中放置了不同的hook节点 xff0c 等数据包sk buff xff0c 到来的时候 xff0c 要给hook节点

随机推荐

  • 如何做在短时间内搞定VR交互的核心技能?

    转 http 36kr com p 5056703 html ktm source 61 feed amp from 61 timeline 从平面到空间 xff0c 虚拟现实正在开启一场全新的交互方式的变迁 xff0c 更或者 xff0c
  • 单目视觉的运动目标跟踪定位

    转 http www leiphone com news 201704 z87wjT8j9s94tMnG html 市场上空间定位的技术方案分为单目 双目以及激光雷达三大阵营 xff0c 其中激光雷达由于成本高昂市场接受度较低 xff0c
  • 关于IP地址、网络号、主机号、子网掩码之间的关系

    IP地址类似于我们的身份证号码 国家为了唯一确定我们每个人的身份 xff0c 会为我们每个人分配一个唯一确定身份的号码 xff0c 同理 xff1a 为了确切地标识Internet xff08 互联网 xff09 中的每一台主机和路由器 x
  • Android原生编解码接口 MediaCodec 之——踩坑

    关键帧 MediaCodec 有两种方式触发输出关键帧 xff0c 一是由配置时设置的 KEY FRAME RATE 和KEY I FRAME INTERVAL参数自动触发 xff0c 二是运行过程中通过 setParameters 手动触
  • [xshell6过期解决方案]xshell6评估过期 如何继续使用(亲测有效) 100%成功

    过完年来上班第一天打开xshell提示评估过期了 很是尴尬 搞了老半天才弄好 下面来分享一下我的解决过程 大家严格按照下面的流程走就可以了 基本都可以成功 如果没成功 那一定是你的姿势不对 1 我之前下载的是evaluation版本 xff
  • # Ubuntu 配置自带vnc桌面共享

    Ubuntu 配置自带桌面共享 1 在setting gt gt shareing gt gt remote 选择on 如果用ubunutu直接远程连接的话已经可以了 xff0c 2 在ubuntu下使用系统自带的remmina连接 vnc
  • netconf学习-安装ncclient客户端提示'install_requires'错误

    环境说明 xff08 1 xff09 操作系统 xff1a centos7 7 xff08 2 xff09 python版本 xff1a 2 7 5 问题描述 在学习netconf的时候需要编写netconf自动化 xff0c 此时就需要用
  • Baumer工业相机堡盟工业相机使用BGAPI SDK将图像数据转换为Bitmap的几种方式(C#)(Mono)

    Baumer工业相机堡盟工业相机使用BGAPI SDK将图像数据转换为Bitmap的几种方式 xff08 C xff09 Baumer工业相机Baumer工业相机图像数据转为Bitmap的技术背景Baumer工业相机使用BGAPISDK将图
  • OpenStack版本

    OpenStack的每个主版本系列以字母表顺序 xff08 A Z xff09 命名 xff0c 以年份及当年内的排序做版本号 xff0c 从第一版的Austin xff08 2010 1 xff09 到目前最新的稳定版Liberty xf
  • PX4FLOW光流模块DIY(含部分代码讲解)

    暑假有时间整理一下以前做的东西 xff0c 发发博客 xff0c 既给网友们学习也方便自己交流 今天讲讲我两年前从github学习的PX4FLOW光流模块 光流是视觉导航的重要部分 在运动检测和许多slam技术都使用到了光流 xff0c 但
  • 一路(16)相随,一起(17)前行

    2016年对于楼主来说 xff0c 是艰难的一年 xff0c 也是幸运的一年 xff0c 我想把我的故事说给你听 xff01 迈入IT行业已经快一年了 xff0c 但是实际上真正练习的时间只有仅仅的四个多月 xff0c 之前的专业是电子方面
  • 英文突然间隔变大

    之前总是遇到一个尴尬的问题 xff0c 就是写文档的时候间距突然变大 xff0c 调整段落间距并未没有效果 xff0c 例如这种 xff1a 解决办法 xff1a Shift 43 空格
  • JAVA从入门到精通(2)

    一 Java中的关键字 1 关键字 xff1a 具有一些特殊用途的词 2 注 xff1a 在程序中应用关键词需要慎重 xff01 3 常用的关键词 xff08 举例说明 xff09 interface xff1a 接口 class 类 pu
  • myeclipse闪退的问题

    之前遇到myeclipse的闪退 xff0c 探索了之后 xff0c 找到了方法 xff0c 今天早上又遇到这种问题 xff0c 按照上次的方法尝试是没有问题的 决定和大家分享 删除 workspace xff08 工作空间 xff09 m
  • 【损失函数系列】softmax loss损失函数详解

    1 损失函数 xff1a 损失函数 xff08 loss function xff09 是用来评测模型的预测值f x 与真实值Y的相似程度 xff0c 损失函数越小 xff0c 就代表模型的鲁棒性越好 xff0c 损失函数指导模型学习 根据
  • JAVA从入门到精通(14)-- 包装类

    一 包装类 1 基本数据类型是不具备对象的特征的 xff0c 比如基本数据类型不能调用方法 功能简单 xff0c 为了让基本数据类型具备对象的特性 xff0c Java为每个基本数据类型提供了一个包装类 2 3 包装类主要提供了两大类方法
  • JAVA从入门到精通(16)-- Java版JSON入门

    一 JSON课程介绍 1 JSON是行业内使用最为广泛的数据传输格式 定义 xff1a JSON是一种与开发语言无关的 轻量级的数据格式 全称是JavaScript Object Notation 优点 xff1a 易于人的阅读和编写 xf
  • JAVA从入门到精通(17)-- GSON

    一 GSON介绍 1 介绍 xff1a GSON最早由Google提出的开源的项目 xff0c 主页在github上 xff0c 解析json 二 GSON生成JSON数据 1 加入依赖 xff0c 创建包和类 2 创建Gson对象 Man
  • JAVA从入门到精通(18)-- Servlet

    一 Servlet定义 1 现有JSP还是先有Servlet xff1f 先有的Servlet xff0c 因为JSP的前身就是Servlet 2 定义 xff1a Servlet是在服务器上运行的小程序 一个Servlet就是一个Java
  • pixhawk自学笔记之uorb学习总结

    注 xff1a 这是看过好多文章总结出来的 xff0c 转载了较多人的博客 xff0c 希望有知道原出处的人把地址留下 xff0c 我贴上来 在此谢谢各位前辈的总结 xff08 我会在后续笔记中贴出在我自己的程序中对于uorb的使用 xff