MoveIt 启动配置

相关源文件

以下文件用作生成此 wiki 页面的上下文:

本文档介绍 IB-Robot 中的 MoveIt 2 启动配置系统,该系统为 moveit_planning 控制模式提供运动规划功能。有关 MoveItGateway 节点的 IK 求解和约束处理信息,请参阅 10.1。有关 5DOF 运动学约束的详细信息,请参阅 10.2

目的与范围

MoveIt 启动配置系统在机器人以 moveit_planning 控制模式启动时,协调 MoveIt 2 组件的启动。它处理:

  • 基于控制模式条件性包含 MoveIt 节点

  • 参数从 robot_config YAML 传播到 MoveIt 启动文件

  • MoveIt 规划组、运动学求解器和控制器的配置

  • 可选的运动规划 RViz 可视化

此系统将 robot_config 单一数据源模式与 MoveIt 的配置需求连接起来,确保关节定义、链接名称和规划组参数在整个工作空间中保持一致。

启动架构概述

MoveIt 启动系统使用两级架构:robot_config 中的启动构建器条件性地包含 robot_moveit 包中的主 MoveIt 启动文件。

        graph TB
    subgraph "robot_config Package"
        RobotLaunch["robot.launch.py"]
        MoveItBuilder["launch_builders/moveit.py<br/>generate_moveit_nodes()"]
        RobotYAML["config/robots/so101_single_arm.yaml<br/>moveit: {...}"]
    end

    subgraph "robot_moveit Package"
        SO101Launch["launch/so101_moveit.launch.py<br/>generate_launch_description()"]
        MoveItBuilder2["MoveItConfigsBuilder"]

        subgraph "MoveIt Configuration Files"
            SRDF["config/.../so101.srdf<br/>planning groups"]
            Kinematics["config/.../kinematics.yaml<br/>position_only_ik: True"]
            JointLimits["config/.../joint_limits.yaml"]
            Controllers["config/.../moveit_controllers.yaml"]
            PilzLimits["config/.../pilz_cartesian_limits.yaml"]
        end

        subgraph "Launched Nodes"
            MoveGroup["move_group node<br/>moveit_ros_move_group"]
            RViz["rviz2 node<br/>(conditional)"]
            Gateway["moveit_gateway.py<br/>IK gateway"]
        end
    end

    RobotLaunch -->|"control_mode:=moveit_planning"| MoveItBuilder
    MoveItBuilder -->|"read moveit section"| RobotYAML
    MoveItBuilder -->|"IncludeLaunchDescription"| SO101Launch

    SO101Launch -->|"loads configurations"| MoveItBuilder2
    MoveItBuilder2 --> SRDF
    MoveItBuilder2 --> Kinematics
    MoveItBuilder2 --> JointLimits
    MoveItBuilder2 --> Controllers
    MoveItBuilder2 --> PilzLimits

    SO101Launch --> MoveGroup
    SO101Launch --> RViz
    SO101Launch --> Gateway
    

来源src/robot_config/robot_config/launch_builders/moveit.py:1-79src/robot_moveit/launch/so101_moveit.launch.py:1-134

配置参数

robot_config YAML 部分

robot_config YAML 中的 moveit: 部分定义传递给启动系统的 MoveIt 特定参数:

参数

类型

描述

示例

arm_group_name

string

MoveIt 规划组名称

"arm"

base_link

string

基座坐标系

"base"

ee_link

string

末端执行器链接名称

"gripper"

shoulder_link

string

用于 5DOF 约束的肩部链接

"shoulder"

机器人配置示例

src/robot_config/config/robots/so101_single_arm.yaml:37-43

这些参数由启动构建器提取并作为启动参数传播。

来源src/robot_config/config/robots/so101_single_arm.yaml:37-43src/robot_config/robot_config/launch_builders/moveit.py:46-68

启动参数

so101_moveit.launch.py 声明以下控制 MoveIt 行为的启动参数:

        graph LR
    subgraph "Launch Arguments"
        IsSim["is_sim<br/>(default: True)"]
        Display["display<br/>(default: True)"]
        JointNames["joint_names<br/>(required)"]
        ArmGroup["arm_group_name<br/>(required)"]
        BaseLink["base_link<br/>(required)"]
        EELink["ee_link<br/>(required)"]
        ShoulderLink["shoulder_link<br/>(required)"]
    end

    subgraph "Parameter Consumers"
        MoveGroup["move_group<br/>use_sim_time"]
        RViz2["rviz2<br/>condition"]
        Gateway["moveit_gateway<br/>parameters"]
    end

    IsSim --> MoveGroup
    IsSim --> Gateway
    Display --> RViz2
    JointNames --> Gateway
    ArmGroup --> Gateway
    BaseLink --> Gateway
    EELink --> Gateway
    ShoulderLink --> Gateway
    

来源src/robot_moveit/launch/so101_moveit.launch.py:13-54

启动文件包含流程

以下图表显示参数如何从 robot_config 流向 MoveIt 节点:

        sequenceDiagram
    participant User
    participant RobotLaunch as robot.launch.py
    participant MoveItBuilder as generate_moveit_nodes()
    participant RobotYAML as robot_config YAML
    participant SO101Launch as so101_moveit.launch.py
    participant MoveItCfg as MoveItConfigsBuilder
    participant Nodes as MoveIt Nodes

    User->>RobotLaunch: ros2 launch robot_config robot.launch.py<br/>control_mode:=moveit_planning
    RobotLaunch->>MoveItBuilder: generate_moveit_nodes(config, mode)
    MoveItBuilder->>RobotYAML: Read moveit section
    RobotYAML-->>MoveItBuilder: arm_group_name, base_link, ee_link, shoulder_link
    MoveItBuilder->>RobotYAML: Read joints.arm
    RobotYAML-->>MoveItBuilder: ["1", "2", "3", "4", "5"]

    MoveItBuilder->>SO101Launch: IncludeLaunchDescription<br/>joint_names="1 2 3 4 5"<br/>arm_group_name="arm"<br/>base_link="base"<br/>ee_link="gripper"<br/>shoulder_link="shoulder"

    SO101Launch->>MoveItCfg: MoveItConfigsBuilder("so101")<br/>.robot_description(...)<br/>.robot_description_semantic(...)<br/>.robot_description_kinematics(...)
    MoveItCfg-->>SO101Launch: moveit_config.to_dict()

    SO101Launch->>Nodes: Launch move_group, rviz2, moveit_gateway
    Nodes-->>User: MoveIt services available
    

来源src/robot_config/robot_config/launch_builders/moveit.py:40-78src/robot_moveit/launch/so101_moveit.launch.py:56-90

MoveItConfigsBuilder 使用

启动文件使用 moveit_configs_utils 中的 MoveItConfigsBuilder 加载和合并配置文件:

src/robot_moveit/launch/so101_moveit.launch.py:61-70

配置文件映射:

构建器方法

配置文件

用途

.robot_description()

urdf/lerobot/so101/so101.urdf.xacro

机器人运动学模型

.robot_description_semantic()

config/.../so101.srdf

规划组、末端执行器

.robot_description_kinematics()

config/.../kinematics.yaml

IK 求解器配置

.joint_limits()

config/.../joint_limits.yaml

速度/加速度限制

.trajectory_execution()

config/../moveit_controllers.yaml

控制器映射

.planning_pipelines()

pipelines=["ompl"]

OMPL 规划器配置

来源src/robot_moveit/launch/so101_moveit.launch.py:61-90

节点配置

move_group 节点

核心 MoveIt 规划服务使用合并的配置参数启动:

src/robot_moveit/launch/so101_moveit.launch.py:79-90

关键参数:- moveit_config.to_dict():所有配置文件合并 - use_sim_time:与 is_sim 启动参数同步 - publish_robot_description_semantic:将 SRDF 发布到 /robot_description_semantic - pilz_cartesian_limits_path:额外的 Pilz 规划器限制

来源src/robot_moveit/launch/so101_moveit.launch.py:79-90

RViz2 可视化节点

RViz 根据 display 参数条件性启动:

src/robot_moveit/launch/so101_moveit.launch.py:94-105

RViz 配置从 src/robot_moveit/config/lerobot/so101/moveit.rviz:1-1 加载,包括:- 用于交互式规划的 MotionPlanning 插件 - RobotModel 显示 - PlanningScene 可视化 - TF 坐标树

来源src/robot_moveit/launch/so101_moveit.launch.py:92-105

moveit_gateway 节点

自定义网关节点从 robot_config 接收参数:

src/robot_moveit/launch/so101_moveit.launch.py:107-120

参数使用 PythonExpression 构建,将空格分隔的 joint_names 字符串拆分回列表:

src/robot_moveit/launch/so101_moveit.launch.py:117

来源src/robot_moveit/launch/so101_moveit.launch.py:107-120

运动学配置

5DOF 机械臂支持最关键的配置文件是 kinematics.yaml

src/robot_moveit/config/lerobot/so101/kinematics.yaml:1-7

position_only_ik: True

此参数对 5DOF 机械臂 IK 求解至关重要。启用时:

  • KDL 求解器使用 ChainIkSolverPos 而非 ChainIkSolverPos_NR

  • 优化仅针对位置精度,忽略姿态

  • 姿态约束仍可通过 Constraints 消息应用,但用于验证而非优化

  • 显著提高 5DOF 机械臂的 IK 成功率

有关 5DOF 运动学约束的详细说明,请参阅 10.2

来源src/robot_moveit/config/lerobot/so101/kinematics.yaml:1-7src/robot_moveit/docs/moveit_gateway.md:32-58

控制模式集成

MoveIt 启动根据控制模式条件性包含:

        graph TB
    LaunchBuilder["generate_moveit_nodes()"]
    CheckMode{"'moveit' in<br/>control_mode.lower()?"}
    FindPkg["get_package_share_directory('robot_moveit')"]
    CheckFile{"so101_moveit.launch.py<br/>exists?"}
    Include["IncludeLaunchDescription"]
    Skip["return []<br/>(no MoveIt)"]
    Warn["Print warning<br/>'MoveIt launch file not found'"]

    LaunchBuilder --> CheckMode
    CheckMode -->|"No<br/>(teleop, model_inference)"| Skip
    CheckMode -->|"Yes<br/>(moveit_planning)"| FindPkg
    FindPkg --> CheckFile
    CheckFile -->|Yes| Include
    CheckFile -->|No| Warn
    Warn --> Skip
    

src/robot_config/robot_config/launch_builders/moveit.py:29-34

此设计确保 MoveIt 节点仅在需要时启动,减少其他控制模式下的资源消耗。

来源src/robot_config/robot_config/launch_builders/moveit.py:15-78

配置文件依赖图

        graph TB
    subgraph "robot_config Package"
        RobotYAML["so101_single_arm.yaml"]
    end

    subgraph "robot_description Package"
        URDF["urdf/lerobot/so101/so101.urdf.xacro"]
    end

    subgraph "robot_moveit Package"
        SO101Launch["so101_moveit.launch.py"]

        SRDF["so101.srdf"]
        Kinematics["kinematics.yaml"]
        JointLimits["joint_limits.yaml"]
        Controllers["moveit_controllers.yaml"]
        Pilz["pilz_cartesian_limits.yaml"]
    end

    subgraph "MoveIt Nodes"
        MoveGroup["move_group"]
        Gateway["moveit_gateway"]
    end

    RobotYAML -->|"moveit: {...}"| SO101Launch
    RobotYAML -->|"joints: {...}"| SO101Launch

    SO101Launch --> URDF
    SO101Launch --> SRDF
    SO101Launch --> Kinematics
    SO101Launch --> JointLimits
    SO101Launch --> Controllers
    SO101Launch --> Pilz

    URDF --> MoveGroup
    SRDF --> MoveGroup
    Kinematics --> MoveGroup
    JointLimits --> MoveGroup
    Controllers --> MoveGroup
    Pilz --> MoveGroup

    RobotYAML -->|"parameters"| Gateway
    Kinematics -.->|"IK solver"| Gateway
    

来源src/robot_moveit/launch/so101_moveit.launch.py:58-90src/robot_config/robot_config/launch_builders/moveit.py:40-78

启动命令示例

基本 MoveIt 启动(带 RViz)

ros2 launch robot_config robot.launch.py \
  robot_config:=so101_single_arm \
  control_mode:=moveit_planning

此命令启动:- move_group 节点(运动规划服务)- 带 MoveIt 插件的 rviz2 - moveit_gateway 节点(IK 求解器接口)

无头 MoveIt 启动(不带 RViz)

ros2 launch robot_config robot.launch.py \
  robot_config:=so101_single_arm \
  control_mode:=moveit_planning \
  moveit_display:=false

moveit_display 参数作为 display 参数转发到 so101_moveit.launch.py

带 MoveIt 的仿真

ros2 launch robot_config robot.launch.py \
  robot_config:=so101_single_arm \
  control_mode:=moveit_planning \
  use_sim:=true

为所有 MoveIt 节点设置 use_sim_time:=True 以与 Gazebo 时钟同步。

来源src/robot_config/README.en.md:350-354

参数映射表

下表显示参数如何从 robot_config 提取并映射到 MoveIt 启动参数:

robot_config 路径

转换

启动参数

消费节点

moveit.ar m_group_name

direct

ar m_group_name

mo veit_gateway

move it.base_link

direct

base_link

mo veit_gateway

mo veit.ee_link

direct

ee_link

mo veit_gateway

moveit.s houlder_link

direct

s houlder_link

mo veit_gateway

joints.arm

' '.join(list)

` joint_names`

mo veit_gateway

use_sim (launch arg)

boolean

is_sim

` move_group`, mo veit_gateway

mo veit_display (launch arg)

boolean

display

rviz2 (condition)

来源src/robot_config/robot_config/launch_builders/moveit.py:46-68src/robot_moveit/launch/so101_moveit.launch.py:26-54

故障排除

MoveIt 启动文件未找到

症状:启动期间警告消息:

[robot_config] WARNING: MoveIt launch file not found at .../so101_moveit.launch.py
[robot_config] Continuing without MoveIt...

原因robot_moveit 包未构建或安装。

解决方案

cd ~/IB_Robot
colcon build --packages-select robot_moveit
source install/setup.bash

来源src/robot_config/robot_config/launch_builders/moveit.py:73-76

缺少 MoveIt 配置参数

症状:启动失败,提示:

[moveit_gateway-X] rclpy._exceptions.ParameterNotDeclaredException: Parameter 'arm_group_name' is not declared

原因robot_config YAML 中缺少 moveit: 部分。

解决方案:在机器人配置中添加 moveit: 部分:

robot:
  moveit:
    arm_group_name: arm
    base_link: base
    ee_link: gripper
    shoulder_link: shoulder

来源src/robot_config/config/robots/so101_single_arm.yaml:37-43

关节名称不匹配

症状:MoveIt 规划因关节名称无效而失败。

原因robot_config 中的 joints.arm 与 URDF 或 SRDF 中的关节名称不匹配。

解决方案:使用以下命令验证一致性:

# 检查 URDF 关节
ros2 topic echo /robot_description --once | grep -A 5 "joint name"

# 检查 robot_config
cat src/robot_config/config/robots/so101_single_arm.yaml | grep -A 5 "joints:"

确保关节列表完全匹配。

来源src/robot_config/robot_config/launch_builders/moveit.py:47-49

IK 求解器频繁失败

症状:MoveIt 规划对大多数目标返回 NO_IK_SOLUTION

原因:5DOF 机械臂的 kinematics.yaml 中未设置 position_only_ik: True

解决方案:验证运动学配置:

src/robot_moveit/config/lerobot/so101/kinematics.yaml:6

此参数对 5DOF 机械臂至关重要。详情请参阅 10.2

来源src/robot_moveit/config/lerobot/so101/kinematics.yaml:1-7src/robot_moveit/docs/moveit_gateway.md:32-58