PX4模块设计之二十一:uORB消息管理模块

2023-05-16

PX4模块设计之二十一:uORB消息管理模块

  • 1. uORB模块构建模式
  • 2. uORB消息管理函数
  • 2.1 状态查询
  • 2.2 资源利用
  • 2.3 模块启动
  • 2.4 模块停止
  • 3. uORB消息接口
    • 3.1 消息主题注册
    • 3.2 消息主题去注册
    • 3.3 消息主题发布
    • 3.4 消息主题订阅
    • 3.5 消息主题去订阅
    • 3.6 设置/获取间隔时间
    • 3.7 获取订阅消息
    • 3.8 主题消费检查
    • 3.9 主题存在性检查
  • 4. uORB消息辅助接口
    • 4.1 设备节点存在性检查
    • 4.2 消息主题内部订阅
    • 4.3 消息主题内部去订阅
    • 4.4 获取队列长度
    • 4.5 获取ORB数据
    • 4.6 设备节点注册回调
    • 4.7 设备节点去注册回调
    • 4.8 获取ORB实例
    • 4.9 主题消息更新检查
    • 4.10 主题注册检查
  • 5. uORB类继承关系
  • 6. 参考资料

前面主要给出uORB消息API接口和自定义消息的使用。这里主要来看下uORB消息管理模块是如何对uORB消息进行管理的。

1. uORB模块构建模式

鉴于Nuttx系统有两种构建模式:不同构建模式使用的源文件也有差异。

  • Flat Build
    uORB:${SRCS_COMMON} + ${SRCS_KERNEL}
  • Protected Build
    uORB_kernel:${SRCS_COMMON} + S R C S K E R N E L = = > 内核态 u O R B : {SRCS_KERNEL} ==> 内核态 uORB: SRCSKERNEL==>内核态uORB{SRCS_COMMON} + ${SRCS_USER} ==> 用户态

参考CMakeLists.txt主要差异在于:

  1. 总体声明定义:${SRCS_COMMON}下的uORBManager.hpp
  2. 内核态实现: ${SRCS_KERNEL}下的uORBDeviceMaster.cpp、uORBDeviceNode.cpp、uORBManager.cpp
  3. 用户态实现: ${SRCS_USER} 下的uORBManagerUsr.cpp
  4. Flat编译模式:鉴于全地址访问,所以不需要使用用户态实现
39 set(SRCS_COMMON
40 	ORBSet.hpp
41 	Publication.hpp
42 	PublicationMulti.hpp
43 	Subscription.cpp
44 	Subscription.hpp
45 	SubscriptionCallback.hpp
46 	SubscriptionInterval.hpp
47 	SubscriptionMultiArray.hpp
48 	uORB.cpp
49 	uORB.h
50 	uORBCommon.hpp
51 	uORBCommunicator.hpp
52 	uORBManager.hpp
53 	uORBUtils.cpp
54 	uORBUtils.hpp
55 	uORBDeviceMaster.hpp
56 	uORBDeviceNode.hpp
57 	)
58 
59 set(SRCS_KERNEL
60 	uORBDeviceMaster.cpp
61 	uORBDeviceNode.cpp
62 	uORBManager.cpp
63 	)
64 
65 set(SRCS_USER
66 	uORBManagerUsr.cpp
67 	)
68 
69 if (NOT DEFINED CONFIG_BUILD_FLAT AND "${PX4_PLATFORM}" MATCHES "nuttx")
70 	# Kernel side library in nuttx kernel/protected build
71 	px4_add_library(uORB_kernel
72 		${SRCS_COMMON}
73 		${SRCS_KERNEL}
74 		)
75 	target_link_libraries(uORB_kernel PRIVATE cdev uorb_msgs)
76 	target_compile_options(uORB_kernel PRIVATE ${MAX_CUSTOM_OPT_LEVEL} -D__KERNEL__)
77 
78 	# User side library in nuttx kernel/protected build
79 	px4_add_library(uORB
80 		${SRCS_COMMON}
81 		${SRCS_USER}
82 		)
83 else()
84 
85 	# Library for all other targets (flat build, posix...)
86 	px4_add_library(uORB
87 		${SRCS_COMMON}
88 		${SRCS_KERNEL}
89 		)
90 	target_link_libraries(uORB PRIVATE cdev)
91 endif()

2. uORB消息管理函数

2.1 状态查询

uorb_status
 ├──> [Flat Build]
 │   ├──> <g_dev != nullptr>
 │   │   └──> g_dev->printStatistics();
 │   └──> PX4_INFO("uorb is not running");
 └──> [Protected Build]
     └──> boardctl(ORBIOCDEVMASTERCMD, ORB_DEVMASTER_STATUS);

2.2 资源利用

uorb_top
 ├──> [Flat Build]
 │   ├──> <g_dev != nullptr>
 │   │   └──> g_dev->showTop(topic_filter, num_filters);
 │   └──> <g_dev == nullptr>
 │       └──> PX4_INFO("uorb is not running");
 └──> [Protected Build]
     └──> boardctl(ORBIOCDEVMASTERCMD, ORB_DEVMASTER_TOP);

2.3 模块启动

uorb_start
 ├──> <g_dev != nullptr>
 │   ├──> PX4_WARN("already loaded");
 │   └──> return OK;
 ├──> <!uORB::Manager::initialize()>
 │   ├──> PX4_ERR("uorb manager alloc failed");
 │   └──> return -ENOMEM;
 ├──> [Flat Build]
 │   ├──> g_dev = uORB::Manager::get_instance()->get_device_master();
 │   └──> <g_dev == nullptr>
 │       └──> return -errno;
 └──> return OK;
uORB::Manager::initialize
 ├──> <_Instance == nullptr)>
 │   └──> _Instance = new uORB::Manager();
 ├──> [Protected Build]
 │   └──> _px4_register_boardct_ioctl(_ORBIOCDEVBASE, orb_ioctl);  // boardctl
 └──> return _Instance != nullptr;

注:uORB_kernel+uORB两套实现代码。代码差异px4_register_boardct_ioctl。

2.4 模块停止

该函数实际上在PX4系统内部并未使用。

uORB::Manager::terminate
 ├──> <_Instance != nullptr>
 │   ├──> delete _Instance
 │   ├──> _Instance = nullptr
 │   └──> return true
 └──> return false

注:uORB_kernel+uORB两套实现代码。代码一致。

3. uORB消息接口

注:这里根据uORBManager.hpp列出接口定义(部分在uORBManager.cpp实现,部分在uORBManagerUsr.cpp实现),这里不做代码展开。

3.1 消息主题注册

uORB::Manager::orb_advertise_multi

注:orb_advertise是orb_advertise_multi的精简版本API

3.2 消息主题去注册

uORB::Manager::orb_unadvertise

3.3 消息主题发布

uORB::Manager::orb_publish

3.4 消息主题订阅

uORB::Manager::orb_subscribe
uORB::Manager::orb_subscribe_multi

3.5 消息主题去订阅

uORB::Manager::orb_unsubscribe

3.6 设置/获取间隔时间

uORB::Manager::orb_set_interval
uORB::Manager::orb_get_interval

3.7 获取订阅消息

uORB::Manager::orb_copy

3.8 主题消费检查

uORB::Manager::orb_check

3.9 主题存在性检查

uORB::Manager::orb_exists

4. uORB消息辅助接口

注:这里根据uORBManager.hpp列出接口定义(部分在uORBManager.cpp实现,部分在uORBManagerUsr.cpp实现),这里不做代码展开。

4.1 设备节点存在性检查

uORB::Manager::orb_device_node_exists

4.2 消息主题内部订阅

uORB::Manager::orb_add_internal_subscriber

4.3 消息主题内部去订阅

uORB::Manager::orb_remove_internal_subscriber

4.4 获取队列长度

uORB::Manager::orb_get_queue_size

4.5 获取ORB数据

uORB::Manager::orb_data_copy

4.6 设备节点注册回调

uORB::Manager::register_callback

4.7 设备节点去注册回调

uORB::Manager::unregister_callback

4.8 获取ORB实例

uORB::Manager::orb_get_instance

4.9 主题消息更新检查

uORB::Manager::updates_available

4.10 主题注册检查

uORB::Manager::is_advertised

5. uORB类继承关系

Subscription
 └──> SubscriptionData


SubscriptionMultiArray


SubscriptionInterval, ListNode<SubscriptionCallback *>
 └──> SubscriptionCallback
     ├──> SubscriptionCallbackWorkItem
     └──> SubscriptionBlocking

PublicationBase
 ├──> Publication
 │   └──> PublicationData
 └──> PublicationMulti
     └──> PublicationMultiData

6. 参考资料

【1】PX4开源软件框架简明简介
【2】PX4模块设计之二:uORB消息代理
【3】PX4模块设计之三:自定义uORB消息

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

PX4模块设计之二十一:uORB消息管理模块 的相关文章

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

    警告 xff1a 请先在仿真环境下进行测试 xff0c 能达到预期效果后在进行实际飞行测试 xff0c 以免发生意外 本篇文章只是用作学习交流 xff0c 实际飞行时如出现意外情况作者不予以负责 所需材料 1 PIXhawk或者Pixrac
  • 关于PX4中的高度若干问题

    飞行的高度是如何测量的 xff1f 地面的高度和海平面的高度差别很大 xff0c 飞控又是如何有效判别进行降落的 xff1f 这是我脑子里的疑问 搜索的一圈发现很少有人讨论这方面的问题 xff0c 于是本次我就直接看一下源代码 xff0c
  • [pixhawk笔记]6-uORB流程及关键函数解析

    本文中将结合代码 文档及注释 xff0c 给出uORB执行流程及关键函数的解析 xff0c 由于uORB的机制实现较为复杂 xff0c 所以本文主要学习如何使用uORB的接口来实现通信 回到上一篇笔记中的代码 xff1a include l
  • 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+Offboard模式+代码控制无人机起飞(Gazebo)

    参考PX4自动驾驶用户指南 https docs px4 io main zh ros mavros offboard cpp html 我的另一篇博客写了 键盘控制PX4无人机飞行 PX4无人机 键盘控制飞行代码 可以先借鉴本篇博客 xf
  • PX4 Bootloader下载及编译过程中的问题解决

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

    文章转自 xff1a http www jianshu com p 36dac548106b 前言 前段时间linux崩溃了 xff0c 桌面进去后只有背景 xff0c 折腾好久没搞定 xff0c 为了节省时间索性重装了系统 xff0c 同
  • 从Simulink到PX4——Simulink-PX4插件安装与环境搭建

    从Simulink到PX4 Simulink PX4插件安装与环境搭建 前言0 准备工作1 安装WSL2 Setting up the PX4 Toolchain on Windows3 Setting up the PX4 Tool Ch
  • PX4模块设计之一:SITL & HITL模拟框架

    PX4模块设计之一 xff1a SITL amp HITL模拟框架 1 模拟框架1 1 SITL模拟框架1 2 HITL模拟框架 2 模拟器类型3 MAVLink API4 总结 基于PX4开源软件框架简明简介的框架设计 xff0c 逐步分
  • PX4模块设计之四:MAVLink简介

    PX4模块设计之四 xff1a MAVLink简介 1 MAVLink PX4 应用简介2 MAVLink v2 0新特性3 MAVLink协议版本4 MAVLink通信协议帧4 1 MAVLink v1 0 帧格式4 2 MAVLink
  • PX4模块设计之五:自定义MAVLink消息

    PX4模块设计之五 xff1a 自定义MAVLink消息 1 MAVLink Dialects1 1 PX4 Dialects1 2 Paprazzi Dialects1 3 MAVLink XML File Format 2 添加自定义M
  • PX4模块设计之六:PX4-Fast RTPS(DDS)简介

    64 TOC PX4模块设计之六 xff1a PX4 Fast RTPS DDS 简介 基于PX4开源软件框架简明简介的框架设计 xff0c 逐步分析内部模块功能设计 PX4 Fast RTPS DDS 具有实时发布 订阅uORB消息接口
  • PX4模块设计之十一:Built-In框架

    PX4模块设计之十一 xff1a Built In框架 1 Nuttx Built In框架2 PX4 Built In框架2 1 NSH Built In关联文件2 2 NSH Built In关联文件生成2 3 NSH Built In
  • PX4模块设计之三十一:ManualControl模块

    PX4模块设计之三十一 xff1a ManualControl模块 1 ManualControl模块简介2 模块入口函数2 1 主入口manual control main2 2 自定义子命令custom command 3 Manual
  • PX4模块设计之三十六:MulticopterPositionControl模块

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

    PX4模块设计之四十五 xff1a param模块 1 param模块简介2 模块入口函数param main3 重要函数列表4 总结5 参考资料 1 param模块简介 Description Command to access and
  • Px4源码框架结构图

    此篇blog的目的是对px4工程有一个整体认识 xff0c 对各个信号的流向有个了解 xff0c 以及控制算法采用的控制框架 PX4自动驾驶仪软件 可分为三大部分 xff1a 实时操作系统 中间件和飞行控制栈 1 NuttX实时操作系统 提
  • pixhawk px4 commander.cpp

    对于复杂的函数 xff0c 要做的就是看函数的输入是什么 来自哪里 xff0c 经过处理后得到什么 给谁用 xff0c 这样就可以把程序逻辑理清 中间的分析就是看函数如何处理的 span class hljs keyword extern
  • PX4——Range Finder 篇

    Range Finder 此处选用的是 Benewake 下的 Lidar 参数设置 General Configuration 除了官方的参数设置外 xff0c 我在 EKF2 中还找到了 EKF2 RNG AID 参数 xff0c 用来
  • 大神浅谈无人机飞控软件设计 系统性总结

    写在前面 深感自己对飞控软件 算法的知识点过于杂乱 很久没有进行系统的总结了 因此决定写几篇文章记录一些飞控开发过程的知识点 主要是针对一些软件 算法部分进行讨论 如内容有错误 欢迎指出 1 飞控软件的基本模块 无人机能够飞行主要是依靠传感

随机推荐

  • Android中的枚举

    在ARouter源码中发现使用到了枚举 xff0c 说明枚举并不是不常见的 xff0c 刚好枚举在我的视野中处于盲区 xff0c 于是打算周末加班给拿下 xff0c 扩展视野 了解枚举之前首先说一下什么是常量和变量 常量 声明后无法改变的量
  • PX4开源工程结构简明介绍

    PX4开源工程结构简明介绍 Step1 获取开源代码1 1 开源代码版本1 2 克隆开源代码 Step2 了解工程情况2 1 支持模型类型2 2 支持特性 amp 功能2 3 安装 amp 文档链接2 4 配置工具下载2 5 其他介绍 xf
  • PX4开源软件框架简明简介

    PX4开源软件框架简明简介 1 PX4系统构架1 1 飞控 43 地面站 RC控制1 2 飞控 43 伴飞电脑 43 地面站 集成RC控制 2 PX4软件构架2 1 设计概念2 2 软件构架2 1 中间件2 2 飞控代码 3 PX4运行环境
  • PX4模块设计之一:SITL & HITL模拟框架

    PX4模块设计之一 xff1a SITL amp HITL模拟框架 1 模拟框架1 1 SITL模拟框架1 2 HITL模拟框架 2 模拟器类型3 MAVLink API4 总结 基于PX4开源软件框架简明简介的框架设计 xff0c 逐步分
  • PX4模块设计之二:uORB消息代理

    PX4模块设计之二 xff1a uORB消息代理 1 uORB模块接口1 1 uORB服务接口1 2 uORB消息注册 去注册接口1 3 uORB消息发布接口1 4 uORB消息订阅 去订阅接口1 5 uORB辅助功能接口2 Hello W
  • PX4模块设计之三:自定义uORB消息

    PX4模块设计之三 xff1a 自定义uORB消息 1 新增自定义uORB消息步骤2 应用ext hello world消息示例3 编译执行结果4 参考资料 基于PX4开源软件框架简明简介和PX4模块设计之二 xff1a uORB消息代理
  • PX4模块设计之四:MAVLink简介

    PX4模块设计之四 xff1a MAVLink简介 1 MAVLink PX4 应用简介2 MAVLink v2 0新特性3 MAVLink协议版本4 MAVLink通信协议帧4 1 MAVLink v1 0 帧格式4 2 MAVLink
  • PX4模块设计之五:自定义MAVLink消息

    PX4模块设计之五 xff1a 自定义MAVLink消息 1 MAVLink Dialects1 1 PX4 Dialects1 2 Paprazzi Dialects1 3 MAVLink XML File Format 2 添加自定义M
  • PX4模块设计之六:PX4-Fast RTPS(DDS)简介

    64 TOC PX4模块设计之六 xff1a PX4 Fast RTPS DDS 简介 基于PX4开源软件框架简明简介的框架设计 xff0c 逐步分析内部模块功能设计 PX4 Fast RTPS DDS 具有实时发布 订阅uORB消息接口
  • 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模块设计之十:PX4启动过程

    PX4模块设计之十 xff1a PX4启动过程 1 硬件 飞控硬件上电2 硬件 飞控硬件初始化3 硬件 43 软件 飞控bootloader初始化4 硬件 43 软件 飞控系统初始化5 软件 飞控应用初始化6 配置 SD卡配置文件6 1 e
  • atop安装和使用

    atop就是一款用于监控Linux系统资源与进程的工具 xff0c 它以一定的频率记录系统的运行状态 xff0c 所采集的数据包含系统资源 CPU 内存 磁盘和网络 使用情况和进程运行情况 xff0c 并能以日志文件的方式保存在磁盘中 at
  • PX4模块设计之十一:Built-In框架

    PX4模块设计之十一 xff1a Built In框架 1 Nuttx Built In框架2 PX4 Built In框架2 1 NSH Built In关联文件2 2 NSH Built In关联文件生成2 3 NSH Built In
  • PX4模块设计之十二:High Resolution Timer设计

    PX4模块设计之十二 xff1a High Resolution Timer设计 1 HRT模块特性2 HRT模块基本功能2 1 循环触发接口2 2 延迟触发接口2 3 定时触发接口2 4 其他功能 3 HRT模块精度3 1 精度粒度3 2
  • PX4模块设计之十三:WorkQueue设计

    PX4模块设计之十三 xff1a WorkQueue设计 1 WorkQueue启动2 WorkQueue接口2 1 基本接口2 2 辅助接口2 3 WorkQueue任务函数2 3 1 Flat Build2 3 2 Protected
  • 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模块设计之十八:Logger模块

    PX4模块设计之十八 xff1a Logger模块 1 Logger模块简介2 模块入口函数2 1 主入口logger main2 2 自定义子命令Logger custom command2 3 日志主题uORB注册 3 重要实现函数3
  • PX4模块设计之二十:PX4应用平台初始化

    PX4模块设计之二十 xff1a PX4应用平台初始化 1 PX4应用平台介绍2 PX4应用平台初始化实现3 讨论和思考4 参考资料 在PX4启动过程章节的基础上 xff0c 可以深入分析下PX4应用平台 xff08 框架 xff09 的实
  • PX4模块设计之二十一:uORB消息管理模块

    PX4模块设计之二十一 xff1a uORB消息管理模块 1 uORB模块构建模式2 uORB消息管理函数2 1 状态查询2 2 资源利用2 3 模块启动2 4 模块停止3 uORB消息接口3 1 消息主题注册3 2 消息主题去注册3 3