Skip to content

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。 这用于记录日志,因此请确保在发布时填充数据。

若要在代码中使用该主题,请包含头文件:

cpp
#include <uORB/topics/topic_name.h>

通过在 .msg 文件中添加如下一行内容,单个消息定义可用于多个独立主题:

cpp
# TOPICS mission offboard_mission onboard_mission

然后在代码中,将它们用作主题 ID:ORB_ID(offboard_mission)

发布

可以在系统中的任何位置发布主题,包括中断上下文(由 hrt_call API 调用的函数)。 但是,在可以在中断上下文中发布主题之前,该主题需要在中断上下文之外进行通告并发布(至少一次)。

主题列表和监听(Listener)

INFO

listener 命令仅在 Pixracer(FMUv4)以及 Linux / OS X 上可用。

列出所有主题,列出文件句柄:

sh
ls /obj

要监听一个主题内容中五条信息,运行监听器:

sh
listener sensor_accel 5

输出是n次主题正文:

sh
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 命令可实时显示每个主题的发布频率:

sh
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_multiorb_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。 这是为了确保已删除的字段(或消息)不会在将来重新添加。
    • 如果发生语义更改(例如,单位从度变为弧度),则该字段也必须重命名,并且先前的字段必须按上述方式标记为已弃用。