# uORB 消息传送

# 导言

uORB 是一个异步的 发布() / 订阅() 消息传递 API,用于线程间/进程间通信。

看看 教程 来学习如何在 C++ 中使用它。

uORB 在启动时自动提前启动,因为许多应用程序都依赖于它。启动时使用 启动.单元测试可以通过 uorb_tests.

# 添加新主题

新的 uORB 主题可以在主 PX4/PX4-Autopilot 资源库中添加,也可以在树外信息定义中添加。有关添加树外 uORB 信息定义的信息,请参阅 本节.

要添加新主题,您需要创建一个新的 .msg 文件中的 msg/ 目录,并将文件名添加到 msg/CMakeLists.txt 列表。由此自动生成所需的 C/C++ 代码。

看看现有的 信息 文件中支持的类型。一条信息也可以嵌套在其他信息中使用。

每个生成的 C/C++ 结构体都有一个字段 uint64_t timestamp 将被添加。这将用于记录器,因此在发布信息时务必填写。

要在代码中使用主题,请加入标题:

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

.msg 文件,一个信息定义可用于多个独立主题:

# 主题 任务 船外任务 船上任务

然后在代码中使用它们作为主题 ID: ORB_ID(offboard_mission).

# 出版

发布主题可在系统的任何地方进行,包括中断上下文(由 hrt_call API)。不过,在中断上下文中发布主题前,需要在中断上下文外进行广告和发布(至少一次)。

# 列出主题并聆听

备注

听众 命令仅适用于 Pixracer (FMUv4) 和 Linux / OS X。

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

ls /obj

要收听一个主题 5 条信息的内容,请运行监听器:

监听器 sensor_accel 5

输出是主题内容的 n 倍:

主题: 传感器 #3
时间戳: 84978861
integral_dt: 4044
error_count: 0
x: -1 y: 2
z: 100
x_integral:-0 y_integral: 0
z_integral: 0
温度 46
范围_m_s2: 78
缩放: 0

主题: 传感器 #4
时间戳: 85010833
integral_dt: 3980
error_count: 0
x: -1 y: 2
z: 100
x_integral:-0 y_integral: 0
z_integral: 0
温度 46
范围_m_s2: 78
缩放: 0

TIP

在基于 NuttX 的系统(Pixhawk、Pixracer 等)上,该系统的 听众 命令可以在 QGroundControl MAVLink 控制台来检查传感器值和其他主题。这是一个功能强大的调试工具,因为即使 QGC 通过无线链路连接(如飞行器在飞行时),也可以使用它。更多信息,请参阅: 传感器/主题调试.

# uorb 顶级命令

命令 顶部 实时显示每个主题的发布频率:

更新:1S,主题编号: 77
主题名称 #sub #msg #lost #qsize
已上膛的致动器                       0    6    4     0 1
执行器控制器_0                  0    7  242  1044 1
电池状态                       0    6  500  2694 1
指挥官状态                      0    1   98    89 1
控制状态                        0    4  242   433 1
ekf2_innovations                     0    1  242   223 1
ekf2_timestamps                      0    1  242    23 1
估计器状态                     0    3  242   488 1
mc_att_ctrl_status                   0    0  242     0 1
传感器_加速                         0    1  242     0 1
传感器_加速                         1    1  249    43 1
传感器_巴罗                          0    1   42     0 1
综合传感器                      0    6  242   636 1

这些列包括:主题名称、多实例索引、订阅者数量、以赫兹为单位的发布频率、每秒丢失的信息数量(所有订阅者的总和)以及队列大小。

# 多实例

uORB 提供了一种机制,可通过以下方式发布同一主题的多个独立实例 多广告.它将向发布者返回一个实例索引。然后,订阅者必须使用 orb_subscribe_multi (订阅 订阅第一个实例)。例如,如果系统中有多个相同类型的传感器,那么拥有多个实例就非常有用。

确保不要混合 多广告广告 为同一主题。

完整的应用程序接口在 platforms/common/uORB/uORBManager.hpp (打开新窗口).

# 消息/字段停用

由于有外部工具使用日志文件中的 uORB 信息,如 飞行回顾 (打开新窗口)因此,在更新现有信息时需要考虑某些方面:

  • 如果有充分的更新理由,更改外部工具所依赖的现有字段或信息通常是可以接受的。特别是对 飞行回顾, 飞行回顾 代码合并到 .
  • 为了让外部工具可靠地区分两个报文版本,必须遵循以下步骤:
    • 删除或重命名的邮件必须添加到 弃用的msgs 名单中 msg/CMakeLists.txt (打开新窗口).msg 文件需要删除。
    • 删除或重命名的字段必须加以注释并标记为已废弃。例如 uint8 quat_reset_counter 将成为 # 已删除:uint8 quat_reset_counter.这是为了确保已删除的字段(或信息)不会在将来重新添加。
    • 如果语义发生变化(例如单位从 "度 "变为 "弧度"),则该字段也必须重新命名,并如上所述将之前的字段标记为废弃字段。