uORB 消息
简介
uORB 是一种异步的 publish()
(发布)/ subscribe()
(订阅)消息传递 API,用于线程间/进程间通信。
查看 教程 以了解如何在 C++ 中使用它。
作为很多应用程序依赖的uORB,很早便会在启动过程中自动启动。 它通过 uorb start
启动。单元测试可以通过 uorb_tests
启动。
添加新 Topic(主题)
新的uORB主题可以通过在主PX4/Firmware 存储库中添加,也能通过在树外(out-of-tree)消息定义中添加。 有关添加树外 uORB 消息定义的信息,请参阅 此部分。
要添加新主题,你需要在 msg/
目录中创建一个新的 .msg 文件,并将文件名添加到 msg/CMakeLists.txt
列表中。 这样,将自动生成所需的 C/C++ 代码。
查看现有的 msg
文件以了解支持的类型。 消息还可以在其他消息中嵌套使用。
对于每个生成的 C/C++ 结构体,将添加一个字段 uint64_t timestamp
。 这用于记录日志,因此请确保在发布时填充数据。
若要在代码中使用该主题,请包含头文件:
#include <uORB/topics/topic_name.h>
通过在 .msg
文件中添加如下一行内容,单个消息定义可用于多个独立主题:
# TOPICS mission offboard_mission onboard_mission
然后在代码中,将它们用作主题 ID:ORB_ID(offboard_mission)
。
发布
可以在系统中的任何位置发布主题,包括中断上下文(由 hrt_call
API 调用的函数)。 但是,在可以在中断上下文中发布主题之前,该主题需要在中断上下文之外进行通告并发布(至少一次)。
主题列表和监听(Listener)
INFO
listener
命令仅在 Pixracer(FMUv4)以及 Linux / OS X 上可用。
列出所有主题,列出文件句柄:
ls /obj
要监听一个主题内容中五条信息,运行监听器:
listener sensor_accel 5
输出是n次主题正文:
TOPIC: sensor_accel #3
timestamp: 84978861
integral_dt: 4044
error_count: 0
x: -1
y: 2
z: 100
x_integral: -0
y_integral: 0
z_integral: 0
temperature: 46
range_m_s2: 78
scaling: 0
TOPIC: sensor_accel #4
timestamp: 85010833
integral_dt: 3980
error_count: 0
x: -1
y: 2
z: 100
x_integral: -0
y_integral: 0
z_integral: 0
temperature: 46
range_m_s2: 78
scaling: 0
TIP
在基于 NuttX 的系统(Pixhawk、Pixracer 等)上,可以从 QGroundControl MAVLink 控制台中调用 listener
命令,以检查传感器和其他主题的值。 这是一个非常实用的调试工具,因为它可以在 QGC 通过无线连接的时候使用(例如,当机体在飞行中)。 有关更多信息,请参阅:传感器/主题调试。
uorb top 命令
uorb top
命令可实时显示每个主题的发布频率:
update: 1s, num topics: 77
TOPIC NAME INST #SUB #MSG #LOST #QSIZE
actuator_armed 0 6 4 0 1
actuator_controls_0 0 7 242 1044 1
battery_status 0 6 500 2694 1
commander_state 0 1 98 89 1
control_state 0 4 242 433 1
ekf2_innovations 0 1 242 223 1
ekf2_timestamps 0 1 242 23 1
estimator_status 0 3 242 488 1
mc_att_ctrl_status 0 0 242 0 1
sensor_accel 0 1 242 0 1
sensor_accel 1 1 249 43 1
sensor_baro 0 1 42 0 1
sensor_combined 0 6 242 636 1
各列分别是:主题名字,多实例索引值,订阅者数量,发布频率(Hz),每秒丢失的信息数(对所有订阅者)和队列大小。
绘制主题变化
可以使用 PlotJuggler 和 PX4 ROS 2 集成实时绘制主题变化(请注意,这实际上绘制的是与 uORB 主题对应的 ROS 主题,但效果是一样的)。
有关更多信息,请参阅:使用 PlotJuggler 实时绘制 uORB 主题数据。
多实例
uORB 提供了一种机制,可通过 orb_advertise_multi
发布同一主题的多个独立实例。 它将返回实例索引给发布器。 然后,订阅者将必须使用 orb_subscribe_multi
选择订阅哪个实例(orb_subscribe
订阅第一个实例)。 多实例很有用,例如,如果系统中有几个同类型的传感器。
请确保不要将 orb_advertise_multi
和 orb_advertise
用于同一主题。
完整的 API 记录在 platforms/common/uORB/uORBManager.hpp 中。
消息/字段弃用
由于存在从日志文件中使用 uORB 消息的外部工具,例如 Flight Review,因此在更新现有消息时需要考虑某些方面:
- 如果有充分理由进行更新,更改外部工具所依赖的现有字段或消息通常是可以接受的。 特别是对于对 Flight Review 有重大影响的更改,在代码合并到
master
分支之前,必须先更新 Flight Review。 - 为了使外部工具能够可靠地区分两个消息版本,必须遵循以下步骤:
- 已删除或重命名的消息必须添加到 msg/CMakeLists.txt 中的
deprecated_msgs
列表中,并且需要删除 .msg 文件。 - 已删除或重命名的字段必须添加注释并标记为已弃用。 例如,
uint8 quat_reset_counter
将变为# DEPRECATED: uint8 quat_reset_counter
。 这是为了确保已删除的字段(或消息)不会在将来重新添加。 - 如果发生语义更改(例如,单位从度变为弧度),则该字段也必须重命名,并且先前的字段必须按上述方式标记为已弃用。
- 已删除或重命名的消息必须添加到 msg/CMakeLists.txt 中的