Apex Topic 白名单配置与排查说明
更新日期:2026-08-20 适用范围:Marvin Pro、Gento Skye、Gento Luna 适用对象:客户开发人员、测试人员、技术支持工程师
1. 文档目的
Apex 中不止有一套 Topic 白名单。不同白名单分别控制:
- 哪些 Topic 可以写入客户数据包。
- 哪些 Topic 可以从数据包中加载和回放。
- 哪些 Topic 可以通过 WebSocket 送到前端。
- 哪些 Topic 可以写入滚动诊断日志。
这些白名单互相独立。某个 Topic 出现在 ros2 topic list 中,不代表它一定会被录制、回放、发送到 前端或写入诊断包。
本文已按 2026-08-20 当前版本的 /tj 接口规则更新。不同发布版本可能已经修改实现,现场必须以目标机安装产物和运行参数为准。完整接口速查参见 Marvin Pro ROS Topic 列表。
- 查询 Topic、参数和运行状态的命令可直接用于只读排查。
- 修改白名单、安装目录文件或 systemd 服务前,应先确认设备版本并备份原文件。
- 需要修改 Python 硬编码白名单的版本,应联系 Gento Teleoperation Apex 技术支持确认,不建议客户直接修改安装产物。
- 回放控制 Topic 或重启服务可能中断控制并引起机器人动作,必须在机器人停止、工作空间清空且急停可触及时进行。
2. 核心概念
2.1 白名单不是 Topic 创建器
把 Topic 名加入白名单只表示“允许处理”,不会创建发布者,也 不会自动产生数据。一个 Topic 最终被处理,通常需要同时满足:
- Topic 名与白名单完全一致,包括大小写、前导
/和命名空间。 - 当前终端、节点和发布者使用相同的 ROS 环境与
ROS_DOMAIN_ID。 - Topic 已存在,并且录制或转发期间持续发布消息。
- 消息类型可以被当前节点导入。
- 发布者和订阅者的 QoS 兼容。
- 对录制功能而言,开始录制时的选择列表也包含该 Topic。
- 存储路径可写,录制节点和 rosbag 写入器没有异常。
2.2 白名单与选择列表的区别
白名单:系统允许处理的最大范围
选择列表:本次任务从白名单中实际选择的子集
例如录制白名单允许 A、B、C,但开始录制时只选择 A、B,则本次数据包不会包含 C。选择列表不能绕过白名单。
2.3 Topic 名必须精确匹配
以下名称不是同一个 Topic:
/joint_states
/tj/joint_states
joint_states
/Joint_States
目标机启用了 APEX_ROS_NAMESPACE=tj 时,部分相对 Topic 会解析为 /tj/...。当前源码中还有若干使用绝对名称或硬编码集合的模块,因此修改前必须先看目标机实际名称。
source /etc/apex/apex_ros_env.sh
echo "ROS_DOMAIN_ID=${ROS_DOMAIN_ID:-未设置}"
echo "APEX_ROS_NAMESPACE=${APEX_ROS_NAMESPACE:-未设置}"
ros2 topic list -t | sort
3. 四类白名单总览
| 白名单 | 作用 | 典型节点 | 当前实现方式 | 常见归属服务 |
|---|---|---|---|---|
| 数据录制白名单 | 限制写入客户数据包的 Topic | data_bag_recorder | 当前检查源码为 Python 硬编码 | apex-teleop.service |
| 回放白名单 | 限制从 bag 加载并回放的 Topic | playback_node | ROS 参数 topic_whitelist | apex-teleop.service |
| WebSocket 白名单 | 限制转发到 Web 前端的 ROS Topic | topic_websocket_server | ROS 参数,默认值来自 Python | 通常为 Backend/WebSocket 模块 |
| 滚动日志白名单 | 限制自动写入黑匣子诊断 bag 的 Topic | all_topic_log_recorder | 当前检查源码为 Python 硬编码 | 通常随 Robot 模块启动 |
服务归属会随版本变化。修改前使用
systemctl cat、节点列表和进程命令确认,不要只按表格猜测。
4. 数据录制白名单
4.1 作用
数据录制白名单决定前端“可选录制 Topic”以及录制节点允许写入 MCAP 的最大集合。
典型配置文件:
/opt/kernelmind/apex/install/recording_playback_nodes_py/share/recording_playback_nodes_py/config/recording_playback.yaml
配置文件中存在以下字段:
data_bag_recorder:
ros__parameters:
allowed_topics:
- "/tj/joint_states"
- "/tj/info/gripper_feedback_L"
- "/tj/info/gripper_feedback_R"
- "/tj/info/eef_left"
- "/tj/info/eef_right"
- "/tj/control/joint_cmd_A"
- "/tj/control/joint_cmd_B"
- "/hand_left/joint_commands"
- "/hand_left/joint_states"
- "/hand_right/joint_commands"
- "/hand_right/joint_states"
4.2 当前版本的重要限制
在本次检查的 Apex Deploy 源码中,bag_recorder_data.py 使用 Python 常量 ALLOWED_TOPICS 判断 Topic,且只声明了存储路径参数,没有声明或读取 YAML 中的 allowed_topics。
因此,对这类版本:
只修改 recording_playback.yaml 中的 allowed_topics,不会让新 Topic 真正通过录制白名单。
必须先判断目标机属于哪种实现:
source /etc/apex/apex_ros_env.sh
NODE=$(ros2 node list | grep '/data_bag_recorder$' | head -n 1)
echo "Recorder node: ${NODE:-未找到}"
if [ -n "$NODE" ]; then
ros2 param list "$NODE" | sort
ros2 param dump "$NODE"
fi
结果判断:
- 能看到
allowed_topics:该版本可能已支持 YAML/ROS 参数,继续核对参数值和实际效果。