启动系统
相关源文件
以下文件用于生成此文档页面:
启动系统是根据配置动态生成并启动机器人操作所需所有 ROS2 节点的编排层。它加载 robot_config YAML 文件并调用专门的构建器模块来创建感知、控制、执行和其他子系统的节点。系统支持多种控制模式,并根据运行时参数有条件地生成节点。
有关 robot_config YAML 结构本身的信息,请参阅 机器人配置文件。有关契约定义详情,请参阅 契约定义。有关外设配置,请参阅 外设配置。
架构概述
启动系统遵循 构建器模式,其中中央编排器(robot.launch.py:123-360)加载配置并将节点生成委托给专门的构建器模块。每个构建器负责特定子系统(如相机、控制器、推理)并返回启动动作列表。
启动系统组件
源码: src/robot_config/launch/robot.launch.py:1-360, src/robot_config/robot_config/launch_builders/control.py, src/robot_config/robot_config/launch_builders/perception.py, src/robot_config/robot_config/launch_builders/execution.py
主启动文件:robot.launch.py
主启动文件 robot.launch.py 位于 src/robot_config/launch/robot.launch.py,作为启动整个机器人系统的单一入口点。
启动参数
参数 |
默认值 |
描述 |
|---|---|---|
|
|
机器人配置名称 (从 |
|
|
配置文件的可选完整路径 (覆盖 |
|
|
启用仿真模式 (Gazebo) |
|
|
自动启动控制器 (设为 false 用于调试) |
|
|
从 YAML 覆盖控制模式 ( |
|
|
启用推理管道 (为空时自动检测) |
|
|
启用 MoveIt 规划 (为空时自动检测) |
|
|
为 MoveIt 启动 RViz (仅当 MoveIt 启用时) |
|
|
启用 rosbag 录制 |
|
|
录制模式: |
启动流程
配置路径注入
启动系统将 _config_path 键注入 robot_config 字典,使下游节点能够访问原始 YAML 文件:
# lines 167-174
robot_config['_config_path'] = str(Path(robot_config_share) / "config" / "robots" / f"{robot_config_name}.yaml")
这对于以下组件至关重要:- episode_recorder:需要路径来加载契约(episode_recorder.py:195-206)- inference_service:需要路径来加载观测规格(lerobot_policy_node.py:158-159)- action_dispatcher:需要路径来加载动作规格(action_dispatcher_node.py:106-117)
启动构建器
启动构建器是为特定子系统生成节点的模块化函数。每个构建器位于 src/robot_config/robot_config/launch_builders/。
构建器模块架构
控制构建器 (control.py)
生成 ros2_control 节点和控制器启动器。
关键函数: -
generate_ros2_control_nodes(robot_config, use_sim, auto_start_controllers)
- 主入口点 - 返回:(nodes_list, spawners_dict),其中 spawners_dict 将控制器名称映射到启动器节点
逻辑: 1. 从 robot_config 确定活动控制模式 2. 从 control_modes[mode].controllers 提取控制器列表 3. 仿真模式:启动器等待 Gazebo 的 controller_manager 4. 硬件模式:先启动 ros2_control_node,然后启动器 5. 使用 RegisterEventHandler(OnProcessExit) 进行顺序启动
示例:
control_modes:
model_inference:
controllers:
- joint_state_broadcaster
- arm_position_controller
- gripper_position_controller
生成 3 个启动器节点来激活这些控制器。
源码: src/robot_config/robot_config/launch_builders/control.py
感知构建器 (perception.py)
生成相机驱动节点和静态 TF 发布器。
关键函数: - generate_camera_nodes(robot_config, use_sim) - 创建相机驱动节点 - generate_tf_nodes(robot_config) - 创建静态变换发布器 - generate_virtual_camera_relays(robot_config) - 为虚拟相机创建主题中继节点
相机驱动:
驱动 |
ROS2 包 |
配置字段 |
|---|---|---|
|
|
|
|
|
|
TF 发布: 对于每个带有 transform 字段的相机,生成一个 static_transform_publisher 节点,发布相机坐标系相对于其父坐标系的变换。
源码: src/robot_config/robot_config/launch_builders/perception.py
执行构建器 (execution.py)
生成推理服务和动作分发器节点。
关键函数: -
generate_inference_node(robot_config, control_mode, use_sim) - 路由到单体或分布式 -
generate_monolithic_inference_node() - 单进程推理 -
generate_distributed_inference_nodes() - 边缘 + 云端推理 -
generate_action_dispatcher_node(robot_config, control_mode, use_sim)
- 动作分发器
执行模式:
单体节点参数:
{
"checkpoint": model_config["path"],
"robot_config_path": str(robot_config_path),
"device": "auto",
"execution_mode": "monolithic",
"node_name": "act_inference_node"
}
分布式节点参数: - 边缘节点: 与单体相同但 execution_mode: "distributed" - 云端节点:
{
"policy_path": policy_path,
"input_topic": "/preprocessed/batch",
"output_topic": "/inference/action",
"device": "auto"
}
源码: src/robot_config/robot_config/launch_builders/execution.py:1-360
遥控构建器 (teleop.py)
生成人工控制设备的遥控操作节点。
条件激活: 仅当 control_mode == 'teleop' 且 teleoperation.enabled == true 时生成节点。
设备类型: - leader_arm:用于双边遥控操作的 SO-101 主臂 - gamepad:Xbox/PlayStation 控制器 - vr:VR 控制器输入 - imu:基于 IMU 的控制
录制构建器 (recording.py)
生成数据录制节点。
录制模式:
模式 |
描述 |
生成的节点 |
|---|---|---|
|
传统 ros2 bag record (一体化文件) |
|
|
通过 Action Server 逐 episode 触发 |
|
连续模式:
# lines 58-99
recording_action = ExecuteProcess(
cmd=['ros2', 'bag', 'record', '-o', output_file] + topics,
output='screen'
)
从 robot_config 自动发现主题(关节、相机、控制器)。
Episodic 模式:
# lines 102-168
episode_recorder_node = Node(
package='dataset_tools',
executable='episode_recorder',
parameters=[
{'robot_config_path': robot_config_path},
{'bag_base_dir': bag_base_dir}
]
)
需要在单独的终端中手动运行 ros2 run dataset_tools record_cli 来触发录制。
源码: src/robot_config/robot_config/launch_builders/recording.py:1-226
控制模式系统
启动系统根据活动控制模式调整节点生成,控制模式决定机器人的操作行为。
控制模式确定
控制模式对节点生成的影响
每个控制模式定义:1. 要启动的控制器 - 在 control_modes[mode].controllers 中列出 2. 推理启用 - control_modes[mode].inference.enabled 3. 执行器配置 - control_modes[mode].executor
示例模式:
control_modes:
teleop:
controllers:
- joint_state_broadcaster
- arm_position_controller
- gripper_position_controller
inference:
enabled: false
force_disable: true
executor:
type: topic
mode: teleop
model_inference:
controllers:
- joint_state_broadcaster
- arm_position_controller
- gripper_position_controller
inference:
enabled: true
model: so101_act
executor:
type: topic
mode: model_inference
moveit_planning:
controllers:
- joint_state_broadcaster
- arm_trajectory_controller
- gripper_trajectory_controller
inference:
enabled: false
executor:
type: action
mode: moveit_planning
源码: src/robot_config/config/robots/so101_single_arm.yaml:46-103
条件节点生成
启动系统使用条件逻辑根据运行时标志生成适当的节点。
推理管道启用
逻辑: 1. 如果显式设置 --with_inference,使用该值 2. 否则,从 control_modes[mode].inference.enabled 自动检测 3. 在 teleop 模式下强制禁用(除非显式覆盖)
仿真与硬件模式
启动示例
示例 1:带模型推理的仿真
ros2 launch robot_config robot.launch.py \
robot_config:=so101_single_arm \
use_sim:=true \
control_mode:=model_inference
生成的节点: 1. Gazebo 服务器/客户端 2. spawn_entity(URDF 机器人) 3. joint_state_broadcaster 4. arm_position_controller 5. gripper_position_controller 6. Gazebo 相机插件 7. static_transform_publisher(用于相机) 8. lerobot_policy_node 9. action_dispatcher_node
示例 2:带遥控和录制的真实硬件
ros2 launch robot_config robot.launch.py \
robot_config:=so101_single_arm \
control_mode:=teleop \
record:=true \
record_mode:=episodic
生成的节点: 1. ros2_control_node (so101_hardware) 2. joint_state_broadcaster 3. arm_position_controller 4. gripper_position_controller 5. usb_cam 节点(顶部、腕部相机) 6. realsense_node(前置相机) 7. static_transform_publisher(相机坐标系) 8. robot_teleop_node 9. episode_recorder(后台服务)
需要手动步骤:
# 在单独终端中
ros2 run dataset_tools record_cli
源码: src/robot_config/launch/robot.launch.py:28-32, src/robot_config/robot_config/launch_builders/recording.py:102-168
示例 3:MoveIt 规划模式
ros2 launch robot_config robot.launch.py \
robot_config:=so101_single_arm \
control_mode:=moveit_planning \
use_sim:=true \
moveit_display:=true
生成的节点: 1. Gazebo 服务器/客户端 2. spawn_entity 3. joint_state_broadcaster 4. arm_trajectory_controller 5. gripper_trajectory_controller 6. move_group (MoveIt) 7. moveit_gateway_node 8. rviz2(带 MoveIt 配置)
参数传播
启动系统通过多种机制将配置参数传播到下游节点:
1. ROS 参数(节点特定)
# 示例: action_dispatcher_node
parameters=[{
"robot_config_path": str(robot_config_path),
"control_frequency": 100.0,
"queue_size": 100,
"watermark_threshold": 20
}]
源码: src/robot_config/robot_config/launch_builders/execution.py:270-305
2. 环境变量
# 为 LeRobot 环境注入 PYTHONPATH
env = prepare_lerobot_env()
# env['PYTHONPATH'] = '/path/to/lerobot:...'
Node(
package='inference_service',
executable='lerobot_policy_node',
env=env, # LeRobot 环境
parameters=[...]
)
源码: src/robot_config/robot_config/launch_builders/execution.py:99-123
3. 直接文件路径
# 传递 robot_config_path 用于契约加载
robot_config_path = robot_config.get('_config_path', '')
parameters=[{'robot_config_path': robot_config_path}]
节点直接从 YAML 加载契约:
# 在 episode_recorder.py 中
from robot_config.loader import load_robot_config
robot_config = load_robot_config(robot_config_path)
contract = robot_config.to_contract()
源码: src/dataset_tools/dataset_tools/episode_recorder.py:194-206, src/inference_service/inference_service/lerobot_policy_node.py:158-159
调试启动问题
启用调试输出
ros2 launch robot_config robot.launch.py \
robot_config:=so101_single_arm \
use_sim:=true \
--log-level debug
禁用自动启动以便手动检查
ros2 launch robot_config robot.launch.py \
robot_config:=so101_single_arm \
auto_start_controllers:=false
这会启动 ros2_control_node 但不启动控制器。手动启动它们进行调试:
ros2 control load_controller joint_state_broadcaster
ros2 control set_controller_state joint_state_broadcaster active
常见问题
问题 |
原因 |
解决方案 |
|---|---|---|
“Controller already loaded” |
之前的 ros2_control_node 仍在运行 |
运行 |
“Config file not found” |
无效的 |
检查 |
“Invalid control mode” |
|
验证 robot_config YAML 中的 |
推理节点失败 |
缺少模型 检查点 |
验证 robot_config 中 |
相机无法打开 |
权限被拒绝 |
运行 |
源码: src/robot_config/launch/robot.launch.py:46-49, src/robot_config/README.en.md:510-516
总结
启动系统提供 配置驱动、模块化的编排层 用于机器人启动:
单一入口点:
robot.launch.py加载配置并编排所有构建器构建器模式: 每个子系统有专门的构建器模块
条件生成: 节点根据控制模式、use_sim 和功能标志生成
参数传播: 配置通过 ROS 参数、环境变量和文件路径流向节点
模式灵活性: 支持具有不同控制器/执行器配置的 teleop、model_inference 和 moveit_planning
关键文件: - src/robot_config/launch/robot.launch.py - 主编排器 - src/robot_config/robot_config/launch_builders/ - 构建器模块 - src/robot_config/config/robots/so101_single_arm.yaml - 配置源
源码: src/robot_config/launch/robot.launch.py:1-360, src/robot_config/robot_config/launch_builders/