PX4:【uORB通讯机制】

2023-05-16

uORB: (Micro Object Request Broker )

[PX4进程间的通讯机制:多对多的信息发布与订阅方式]

在这里插入图片描述

发布消息:

1. 公告 advertise:

相当于初始化,在发布消息之前需要对主题(topic)进行公告,一个topic只公告一次
创建一个主题(uORB上创建一个消息源)
驱动程序通过以下接口公告一个主题:

orb_advert_t  orb_advertise( const struct orb_metadata *meta, const void *data )
meta:为发布数据的ID
data:为发布数据的初始内容

2. 发布 publish:

当消息源产生一个新数据时,可通过已公告的主题向uORB发布消息

消息源通过以下接口发布消息:

int  orb_publish(const struct orb_metadata * meta, orb_advert_t handle,  const void *data)
{ return uORB::Manager::get_instance()->orb_publish(meta, handle, deta ); }
meta:为发布数据的ID
handle:为发布数据的句柄(文件描述符),初始化为null
data:为发布数据的内容

订阅消息:

1. 订阅 2. 检查更新 3. 拷贝数据

1.订阅 subscribe:
订阅主题,当主题发生更新后,会收到来自uORB的通知
应用程序可通过以下接口来订阅主题:

 int orb_subscribe(const struct orb_metadata *meta)
{ return uORB::Manager::get_instance()->orb_subscribe(meta);  }
meta:订阅发布数据的ID
返回一个int型的句柄

2. 1检查更新:方式一【非关键数据】
每隔一段时间,检测主题数据是否更新

 int orb_check(int handle, bool *updated)
{   return uORB::Manager::get_instance()->orb_check(handle, updated);  }
检测handle句柄是否更新,若更新,updated会被设置为true。
一旦调用orb_copy来接受处理后,update会被自动设置为false,因此该方式下数据仅能被一个用户检测到。

2.2 检查更新:方式二【数据很重要】
阻塞等待数据更新,设置等待时间上限,等待数据更新。

 int poll( struct pollfd *fds,  nfds_t nfds,  int timeout);
fds:已经订阅的主题数据
timeout:最大阻塞时间 ms
返回值: >0[ 阻塞时间内拿到了数据 ]
         -1[  函数调用失败]
        ==0[ 时间用完还没拿到数据 ]

3. 拷贝数据
通过以上方式检测到数据更新之后,将数据拷贝到buffer中

int  orb_copy(const struct orb_metadata *meta, int handle, void *buffer);
meta:要拷贝数据的ID
handle:要拷贝数据数据的句柄
buffer:储存位置

如何订阅一个数据

/* 1. 订阅 */  
         int  sensor_sub_fd = orb_subscribe( ORB_ID( sensor_combine )) ; 
        //订阅一个sensor_combine 的主题
                                                                                                             //返回 int 型句柄  sensor_sub_fd 
         orb_set_interval(sensor_sub_fd, 200);    //设置更新频率 5Hz
        //sensor_combine 的msg数据类型中:包含了 陀螺仪和加速度计的各项数据
         struct fds[ ] = {  {.fd = sensor_sub_fd,  .event = POLLIN }};
                   // fd 与 event 是结构体中的成员,此处只等待一个主题,也可以等待多个主题
                   // 句柄:sensor_sub_fd  
/* 2. 检测  */
        if( 循环条件 ){
             int poll_ret = poll ( fds, 1 ,1000 );  //阻塞等待: 消息的句柄,等待消息的个数,最大等待时间(ms)
             //处理poll返回的结果
             if( poll_ret == 0)  //表示:时间溢出,最大等待时间时间内还没拿到数据
                     PX4_ERR("Got no data within a second");
             else if ( poll_ret < 0 )   //表示:调用发生错误,记录错误发生的次数
             {   
                  if (error_counter < 10 || error_counter % 50 == 0)  
                  { 
			          /* use a counter to prevent flooding (and slowing us down) */
				      PX4_ERR("ERROR return value from poll(): %d", poll_ret);     
				   } 
                  error_counter++;
                  
              } else {  
               //  poll_ret > 0 的情况,表示:最大等待时间内拿到了订阅的数据,可以开始进行下一步骤
/* 3. 拷贝订阅数据  */
                    //判断一下,是哪个数据发生了更新
                     if ( fds[0].revents & POLLIN ) { //fds[0].revents:文件描述符的flag
                           struct sensor_combined_s  raw;  
                          //拷贝数据(数据id,数据句柄,拷贝到buffer)
			              orb_copy(ORB_ID(sensor_combined), sensor_sub_fd, &raw); 
			              PX4_INFO("Accelerometer:\t%8.4f\t%8.4f\t%8.4f", 
					      (double)raw.accelerometer_m_s2[0],
					      (double)raw.accelerometer_m_s2[1],
					      (double)raw.accelerometer_m_s2[2]);
                     }
                       //若订阅多个topic,可以继续   if ( fds[1....n].revents & POLLIN ) { ...  }
               } 
            } //循环结束

如何发布一个数据

    /*1. advertise attitude topic 主题发布前需要进行初始化公告 ,公告attitude 主题,仅一次 */

	struct vehicle_attitude_s att;
	memset(&att, 0, sizeof(att));
	orb_advert_t att_pub = orb_advertise(ORB_ID(vehicle_attitude), &att);

    /*2. 将得到的数据赋值给att,并发布数据,提供给其他的应用 */

     att.q[0] = raw.accelerometer_m_s2[0]; 
	 att.q[1] = raw.accelerometer_m_s2[1]; 
	 att.q[2] = raw.accelerometer_m_s2[2];

	 orb_publish(ORB_ID(vehicle_attitude), att_pub, &att);

       //ORB_ID(vehicle_attitude) 为发布数据的ID
       //att_pub :为发布数据的句柄(文件描述符)
       // &att:为发布数据的内容
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PX4:【uORB通讯机制】 的相关文章

  • PX4 Offboard Control with MAVROS--Takeoff(一键起飞)

    警告 xff1a 请先在仿真环境下进行测试 xff0c 能达到预期效果后在进行实际飞行测试 xff0c 以免发生意外 本篇文章只是用作学习交流 xff0c 实际飞行时如出现意外情况作者不予以负责 所需材料 1 PIXhawk或者Pixrac
  • PX4/Pixhawk---uORB深入理解和应用

    The Instructions of uORB PX4 Pixhawk 软件体系结构 uORB 主题发布 主题订阅 1 简介 1 1 PX4 Pixhawk的软件体系结构 PX4 Pixhawk的软件体系结构主要被分为四个层次 xff0c
  • 飞行机器人(七)仿真平台XTDrone + PX4编译

    0 编译PX4固件 参考仿真平台基础配置教程 xff08 中文详细教程 xff09 仿真平台基础配置 语雀 yuque com https www yuque com xtdrone manual cn basic config 按照教程
  • UORB

    转载地址 xff1a http blog arm so armteg pixhawk 183 0503 html Pixhawk 飞控 系统是基于ARM的四轴以上飞行器的飞行控制器 xff0c 它的前身是PX4 IMU xff0c Pixh
  • Ubuntu20.04+MAVROS+PX4+Gazebo保姆级安装教程

    Ubuntu20 04 43 MAVROS 43 PX4 43 Gazebo 安装PX4步骤安装MAVROS安装QGCPX4仿真 安装PX4步骤 从github上clone源码 span class token function git s
  • PX4代码学习系列博客(5)——在px4中添加自己的模块

    怎么在px4中添加自己的模块 在 px4固件目录结构和代码风格 这一节 xff0c 曾经说过NuttX是一个实时的嵌入式系统 xff0c 上面可以像windows那样运行程序 那既然是应用程序 xff0c 那我们应该也能写一些可以在Nutt
  • PX4 Bootloader下载及编译过程中的问题解决

    买来的雷迅的板子都是Bootloader已经烧进去了 xff0c Fireware也已经刷进去了 如果是自制的板子 xff0c 上位机根本没法识别板子 xff0c 必须先烧写下载Bootloader后编译好的bin文件 这篇记一下自己下载及
  • PX4源代码下载编译

    sudo git clone https github com PX4 PX4 Autopilot git recursivegit submodule update init recursivegit submodule update r
  • PX4 ---- Mixer

    文章目录 Mixer 混合控制 作用输入输出装载混控文件MAVROS代码解析总结示例MAINAUX Mixer 混合控制 作用 经过位置控制和姿态控制后 xff0c 控制量通过 actuator controls发布 xff0c 其中 co
  • PX4模块设计之九:PX4飞行模式简介

    PX4模块设计之九 xff1a PX4飞行模式简介 关于模式的探讨1 需求角度1 1 多旋翼 MC multi copter 1 1 1 RC控制模式1 1 1 1 Position Mode1 1 1 2 Altitude Mode1 1
  • PX4模块设计之十六:Hardfault模块

    PX4模块设计之十六 xff1a Hardfault模块 1 Hardfault模块初始化2 Hardfault模块主程序3 Hardfault命令3 1 hardfault check status3 2 hardfault rearm3
  • PX4模块设计之十七:ModuleBase模块

    PX4模块设计之十七 xff1a ModuleBase模块 1 ModuleBase模块介绍2 ModuleBase类介绍3 ModuleBase类功能介绍3 1 模块入口3 2 模块启动3 3 模块停止3 4 状态查询3 5 任务回调3
  • PX4模块设计之三十六:MulticopterPositionControl模块

    PX4模块设计之三十六 xff1a MulticopterPositionControl模块 1 MulticopterPositionControl模块简介2 模块入口函数2 1 主入口mc pos control main2 2 自定义
  • PX4模块设计之四十三:icm20689模块

    PX4模块设计之四十三 xff1a icm20689模块 1 icm20689模块简介2 模块入口函数2 1 主入口icm20689 main2 2 自定义子命令custom command2 3 模块状态print status 重载 3
  • PX4模块设计之四十五:param模块

    PX4模块设计之四十五 xff1a param模块 1 param模块简介2 模块入口函数param main3 重要函数列表4 总结5 参考资料 1 param模块简介 Description Command to access and
  • px4_simple_example和uorb机制

    px4 simple app PX4 Autopilot src exampes px4 simple app xff0c 这个程序是用c语言调用orb API和poll机制订阅和发布通讯数据 xff0c 但是这个例子并不是既有接收又有发送
  • px4下载指定版本的固件、git用法

    https hub fastgit org PX4 PX4 Autopilot git describe tag 查看当前版本号 git tag l 查看所有版本 xff0c 也就是打个tag git checkout v1 9 1 跳转到
  • PX4之常用函数解读

    PX4Firmware 经常有人将Pixhawk PX4 APM还有ArduPilot弄混 这里首先还是简要说明一下 xff1a Pixhawk是飞控硬件平台 xff0c PX4和ArduPilot都是开源的可以烧写到Pixhawk飞控中的
  • PX4项目学习::(五)模块代码启动流程

    54条消息 PX4 模块代码启动流程 zhao23333的博客 CSDN博客
  • 无人机PX4使用动捕系统mocap的位置实现控制+MAVROS

    动捕系统Optitrack xff0c 有很高的定位精度 xff0c 能够给无人机提供比较精确的位置信息 xff0c 因此如果实验室有条件 xff0c 都可以买一套动捕系统 动捕系统的原理 xff1a 光学式动作捕捉依靠一整套精密而复杂的光

随机推荐

  • 1.2 安装 docker 容器并配置镜像加速器

    1 2 1 实验环境准备 实验环境 xff1a CENTOS7 9 64 位 主机名 xff1a hou 主机 ip 10 0 8 120 xff08 这个 ip 大家可以根据自己所在环境去配置 xff0c 配置成静态 IP xff09 4
  • 弯管参数计算及编程实现

    船舶软件建立三维管道模型后 xff0c 需要自动生成管子加工信息 xff0c 这样就提高了设计效率 其中弯管参数主要是下料长度 xff0c 弯角和转角 下料长度是由各管段实长 xff0c 即管子中心线长度 xff0c 减去弯管部分切线长再加
  • 完整版数据库系统概论(第五版)-课后答案-免费网盘自提

    包含全部的课后答案与复习笔记 xff01 大家伙不挂科不被刷 xff0c 一起冲 xff01 虽然这个我也是找的别人的 xff0c 但是真的好用 xff01 百度网盘 https pan baidu com s 1Ux07PWvPb k3l
  • 踩坑笔记:安装Gazebo11

    安装环境 xff1a ubuntu18 04 在我上一篇博客中 xff0c 我们安装了ROS Melodic amp amp Ros2 Dashing 在我想要安装Gazebo11时候出现了错误 一 依赖错误 安装Gazebo11 xff1
  • 在keil5中调试串口遇到的问题

    1 问题 在keil5中调试stm32串口实验时 xff0c 向单片机的串口1发送数据 xff0c 观察串口1的寄存器 xff0c 此时串口1的中断服务函数会遇到无法进入下图if 的情况 xff0c 此时观察串口1寄存器 RXEN 的值 由
  • 树莓派在上电后一直重启进入不了系统桌面

    问题描述 树莓派在上电后一直重启进入不了系统桌面 xff0c 在检查了各种接口没问题后解决办法 原因分析与解决方案 xff1a 用了键盘 鼠标 显示器后5v 1A的插头不行 xff0c 换了ipad用的5V 2A的充电器后就可以开启了 xf
  • 树莓派连接“手机热点“或“WiFi“ 后无法上网,以及连接“手机热点“或“WiFi“时VNC连接失败问题

    问题描述 之前一直在开热点 xff0c 通过电脑端VNC控制树莓派拍摄照片 xff0c 今天突然发现树莓派上不去网 xff0c 所以就试着尝试解决了一下 xff0c 心路历程如下 xff1a 要么就是树莓派连不上网 xff0c 要么就是连上
  • 相机标定和双目相机标定标定原理推导及效果展示

    文章目录 前言一 相机标定1 相机的四个坐标系2 相机的畸变 二 张正友标定法1 求解内参矩阵与外参矩阵的积2 求解内参矩阵3 求解外参矩阵4 标定相机的畸变参数5 双目标定6 极线矫正 xff08 立体校正 xff09 三 视差图与深度图
  • keras:tensor从全连接层输出到卷积层

    一 tensor从卷积层输出到全连接层 用过keras的都知道 xff0c 想从卷积层输出tensor到全连接层 xff0c 只需加一层 xff1a model add Flatten shape就不会出现错误 二 但是如果从全连接层输出t
  • 保研面试复习之数据结构篇

    数据项 数据元素和数据结构的概念 数据项是组成数据元素的 xff0c 有独立含义的 xff0c 不可分割的最小单位 数据元素是数据的基本单位 数据结构是带结构的数据元素的集合 数据结构包括逻辑结构和存储结构两个层次 数据结构的三要素是逻辑结
  • 视觉里程计的重定位问题1——SVO的重定位部分

    SVO的重定位部分代码解析与分析 SVO的重定位功能体现在 xff1a 运动跟踪丢失后通过与上一关键帧匹配以及地图点投影 xff0c 找回当前相机位姿 由于没有后端和回环 xff0c SVO的重定位并不是回环校正后的重定位 代码部分被放在运
  • 组合导航(一):定位技术分类与介绍

    组合导航 xff08 一 xff09 xff1a 导航定位技术分类与介绍 一 定位技术分类1 1 基于相对测量的定位 xff08 航位推算 xff09 1 2 基于绝对测量的定位1 3 组合定位 一 定位技术分类 1 1 基于相对测量的定位
  • git bash可以正常commit,但是 VSCode 里不能正常commit使用的解决方法

    问题描述 同一路径下的源码 xff0c 使用git bash可以正常commit xff0c 但是使用vscode提交commit就会一直卡住 xff0c 转圈圈 参考方案链接 xff1a VS CODE GIT 500 问题处理 pudn
  • 组合导航(四):惯性导航系统

    1 惯性导航系统的物理平台2 惯性测量单元IMU3 惯性传感器的测量值3 1静止状态下的加速度测量3 2静止与运动状态下的角速度测量 4 惯性传感器误差4 1 系统误差 xff08 可通过实验进行校正 xff09 4 2 随机误差4 3 惯
  • 组合导航(七):卡尔曼滤波

    Kalman滤波1 离散卡尔曼滤波2 卡尔曼滤波的流程2 1 预测与时间更新2 2 测量更新与校正 3 卡尔曼滤波 算法步骤4 非线性卡尔曼滤波4 1 线性化kalman滤波4 2 扩展kalman滤波 5 卡尔曼滤波发散控制5 1 KF过
  • 组合导航(八):INS/GPS组合导航

    INS GPS组合导航1 误差反馈1 1 开环INS GPS架构1 2 闭环INS GPS架构 2 组合导航的类型2 1 松耦合 的INS GPS组合导航2 2 紧耦合 的INS GPS组合导航2 3 深度耦合的 INS GPS组合导航 3
  • 组合导航(九):三维简化的INS/GPS组合导航系统

    简化INS与GPS组合系统在三维路面上的导航1 MEMS级IMU的三维定位的性能分析2 解决MEMS级IMU在路面导航中存在的问题3 三维简化的惯性传感器系统3 1 3D RISS概述3 2 xff08 轮式车辆 xff09 采用3D RI
  • PX4安装与编译

    第一步 xff1a 下载源码 下载方式一 xff1a git clone https github com PX4 Firmware git recursive 默认下载版本为master 下载时间比较长 xff0c 包含各种包以及依赖工具
  • PX4:【系统架构】

    PX4系统架构 由两个层组成 xff1a 一是飞行控制栈 xff08 flight stack xff09 二是中间件 xff08 middleware xff09 flight stack xff1a 集成了各种自主无人机的制导 导航以及
  • PX4:【uORB通讯机制】

    uORB xff1a Micro Object Request Broker PX4进程间的通讯机制 xff1a 多对多的信息发布与订阅方式 发布消息 xff1a 1 公告 advertise xff1a 相当于初始化 xff0c 在发布消