PX4 uORB

本文最后更新于 2025年3月25日 上午

uORB 是 PX4 中的一个发布-订阅(publish-subscribe)消息传递系统,它允许不同模块之间进行异步通信。

主要组件

核心组件:

  • uORB.h/cpp - uORB 的主要接口和实现
  • uORBManager.hpp/cpp - uORB 系统的管理器
  • uORBDeviceMaster.hpp/cpp - 设备主控制器
  • uORBDeviceNode.hpp/cpp - 设备节点的实现

发布订阅机制:

  • Publication.hpp - 消息发布相关
  • PublicationMulti.hpp - 多重发布支持
  • Subscription.hpp/cpp - 订阅相关实现
  • SubscriptionCallback.hpp - 订阅回调机制
  • SubscriptionInterval.hpp - 基于时间间隔的订阅
  • SubscriptionBlocking.hpp - 阻塞式订阅
  • SubscriptionMultiArray.hpp - 多重订阅数组

工具和辅助类:

  • uORBUtils.hpp/cpp - 工具函数
  • uORBCommon.hpp - 通用定义
  • uORBTopics.h - 主题定义
  • uORBMessageFields.hpp/cpp - 消息字段处理
  • ORBSet.hpp - ORB 集合实现

测试相关:

  • uORB_tests/ - 测试目录
  • uORBMessageFieldsTest.cpp - 消息字段测试

classDiagram
class Manager {
-static Manager* _Instance
+initialize() bool
+get_instance() Manager*
+get_device_master() DeviceMaster*
+orb_advertise(metadata, data) orb_advert_t
+orb_subscribe(metadata) int
+orb_publish(metadata, handle, data) int
+orb_unsubscribe(handle) int
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
class DeviceMaster {
-DeviceNodeStatisticsData _node_stats[]
-int _node_count
+createAdvertiser(metadata, instance, queue_size) DeviceNode*
+getSubscriberCount(metadata, instance) int32_t
+deviceNodeExists(metadata, instance) bool
+getInstanceCount(metadata) unsigned int
+printStatistics(reset) void
}

class DeviceNode {
-const orb_metadata* _meta
-uint8_t _instance
-uint8_t _queue_size
+publish(data) int
+subscribe() int
+unsubscribe() int
+copy(buffer) int
}

class Publication {
-orb_advert_t _handle
-const orb_metadata* _meta
+publish(data) bool
+is_advertised() bool
}

class Subscription {
-int _handle
-const orb_metadata* _meta
+subscribe(instance) bool
+unsubscribe() void
+copy(data) bool
+check_updated() bool
}

class orb_metadata {
+const char* o_name
+uint16_t o_size
+uint16_t o_size_no_padding
+uint32_t message_hash
+orb_id_size_t o_id
+uint8_t o_queue
}

Manager "1" --> "1" DeviceMaster : manages
DeviceMaster "1" --> "*" DeviceNode : creates/manages
DeviceNode "1" --> "1" orb_metadata : references
Publication --> orb_metadata : references
Subscription --> orb_metadata : references
Publication --> DeviceNode : publishes to
Subscription --> DeviceNode : subscribes to

这个UML图展示了uORB系统中的主要类及其关系:

  1. Manager(管理器)
  • 单例模式实现
  • 管理整个uORB系统
  • 提供主要的发布/订阅接口
  • 管理DeviceMaster实例
  1. DeviceMaster(设备主控)
  • 管理所有DeviceNode实例
  • 负责创建新的发布者
  • 维护统计信息
  • 管理主题实例
  1. DeviceNode(设备节点)
  • 代表一个具体的主题实例
  • 处理数据的发布和订阅
  • 管理数据队列
  • 与具体的orb_metadata关联
  1. Publication(发布类)
  • 提供发布者接口
  • 管理发布句柄
  • 简化发布操作
  1. Subscription(订阅类)
  • 提供订阅者接口
  • 管理订阅句柄
  • 简化订阅操作
  1. orb_metadata(元数据)
  • 定义主题的基本信息
  • 包含主题名称、大小等属性
  • 用于主题的标识和验证

主要关系:
Manager是整个系统的入口点,管理DeviceMaster
DeviceMaster创建和管理多个DeviceNode
DeviceNode与具体的主题元数据(orb_metadata)关联
Publication和Subscription通过DeviceNode进行数据交互
所有组件都依赖orb_metadata进行主题识别和验证

这种设计实现了一个高效的发布-订阅系统,支持:
多发布者-多订阅者模式
主题实例化
数据队列管理
统计信息收集
线程安全的数据交换

topic 自动生成机制


PX4 uORB
https://leelewin.github.io/p/dce3e059d3314266a113059c71f5ceba/
作者
liminglei
发布于
2025年2月25日
许可协议
BY_NC_SA