深入解析:实验演示:Movelt2开发机械臂全流程
Movelt2与Movelt Setup Assistant介绍
在前面的内容里,介绍了使用ros2_control为URDF模型添加控制的方法,但是如何让机械臂到达指定位置,以及如何规划机械臂的运动轨迹,就需要用到Movelt。
MoveIt!要解决的核心问题:已知当前状态和目标状态,如何自动完成运动规划。

Movelt2是ROS2中用于运动规划的库,它提供了许多功能,例如碰撞检测、路径规划和执行Movelt2可以与多种机器人硬件接口配合使用,包括URDF模型和ros2_control。
Movelt Setup Assistant是一个图形用户界面,用于配置任何与Movelt配合使用的机器人。它的主要功能是为您的机器人生成语义机器人描述格式(SRDF)文件,该文件指定Movelt所需的其他信息,。借助Movelt Setup Assistant,您可以轻松地为任何机器人生成配置文件,而无需手动编写复杂的配置,使得机械臂快速适配。
Movelt2开发机械臂全流程
下载moveit2功能包:
Movelt2是ROS 2的一个框架,包含了一组相关的功能包,在进行前需要安装,命令如下:
sudo apt install ros-jazzy-moveit* -y
打开Movelt Setup Assistant,进行Movelt可视化配置:
(1)进入之前的工作空间,并激活当前环境,命令如下:
cd ~/learnarm_ws
source install/setup.bash
上述命令的目的是使包含机械臂模型的arm1功能包添加到当前环境中,以便Movelt Setup Assistant正确识别。
启动Movelt设置助手,命令如下:
ros2 launch moveit_setup_assistant setup_assistant.launch.py
打开urdf文件
(2)生成自碰撞矩阵
默认的自碰撞矩阵生成器可以通过禁用机器人上已知安全的连杆对的碰撞检查来帮助缩短运动规划时间。
可以设置采样密度(一般设置为5000左右),该密度决定了有多少个随机机器人位置需要进行自碰撞检查。最后点击生成自碰撞矩阵按钮Generate Collision Matrix,设置助手将花费几秒钟来计算自碰撞矩阵,其中包括检查哪些链接对可以安全地禁用碰撞检查。
计算完成后,结果将显示在主表中。该表显示了已确定为可安全禁用或不可安全禁用碰撞检查的链接对。可安全禁用的链接会带有复选标记。您可以根据需要手动调整复选标记,以启用或禁用特定链接对的自碰撞检查。

(3)配置虚拟关节


(4)配置两个规划组:




(5)配置两个规划组的预定义姿态:




(6)配置末端控制器:
这里的规划组选择的是末端执行器所在规划组的父规划组
(7)配置被动关节
由于没有被动关节,所以不定义
(8)配置控制器接口,选择命令接口与反馈接口:

(9)配置控制器名字与类型:

(10)设置moveit控制器:

(11)设置3D感知传感器:
暂无3D感知传感器,所以不设置
(12)配置launch文件:

(13)配置作者信息:

(14)在src目录下创建一个功能包,专门用于存放moveit2配置文件:

(15)保存moveit2配置文件:

(16)修改joint_limits.yaml
max_velocity: 1.0
has_acceleration_limits: true
max_acceleration: 2.0
# joint_limits.yaml allows the dynamics properties specified in the URDF to be overwritten or augmented as needed
# For beginners, we downscale velocity and acceleration limits.
# You can always specify higher scaling factors (<= 1.0) in your motion requests. # Increase the values below to 1.0 to always move at maximum speed.
default_velocity_scaling_factor: 0.1
default_acceleration_scaling_factor: 0.1
# Specific joint properties can be changed with the keys [max_position, min_position, max_velocity, max_acceleration]
# Joint limits can be turned off with [has_velocity_limits, has_acceleration_limits]
joint_limits:
hand_left_joint:
has_velocity_limits: true
max_velocity: 1.0
has_acceleration_limits: true
max_acceleration: 2.0
hand_right_joint:
has_velocity_limits: true
max_velocity: 1.0
has_acceleration_limits: true
max_acceleration: 2.0
joint1:
has_velocity_limits: true
max_velocity: 1.0
has_acceleration_limits: true
max_acceleration: 2.0
joint2:
has_velocity_limits: true
max_velocity: 1.0
has_acceleration_limits: true
max_acceleration: 2.0
joint3:
has_velocity_limits: true
max_velocity: 1.0
has_acceleration_limits: true
max_acceleration: 2.0
joint4:
has_velocity_limits: true
max_velocity: 1.0
has_acceleration_limits: true
max_acceleration: 2.0
joint5:
has_velocity_limits: true
max_velocity: 1.0
has_acceleration_limits: true
max_acceleration: 2.0
joint6:
has_velocity_limits: true
max_velocity: 1.0
has_acceleration_limits: true
max_acceleration: 2.0
(17)编译配置环境变量,运行demo文件进行测试
拖动末端执行器,点击plan,点击execute,就会规划并执行
ros2 launch robot_arm_config demo.launch.py
ros2 run rviz2 rviz2 -d config/moveit.rviz

gui界面介绍:
Planning:
(1)设置目标点位姿,random valid(随机无碰撞位姿),random(可能碰撞的随机位姿)

context:
OMPL 是 Open Motion Planning Library 的缩写,是一个开源的运动规划算法库,专为机器人、自动驾驶等领域的路径规划问题设计。它提供了一系列高效的运动规划算法,帮助机器人在复杂环境中找到从起点到终点的无碰撞可行路径(或最优路径)。
核心功能与特点
多算法支持:内置多种经典运动规划算法,如快速扩展随机树(RRT、RRT*)、概率路标法(PRM)、A * 算法等,覆盖不同场景的规划需求(如高维空间、动态障碍、最优路径等)。
高维空间适配:机器人的运动空间通常是高维的(如 6 轴机械臂的关节空间是 6 维,笛卡尔空间是 3 维位姿 + 3 维姿态),OMPL 能高效处理这类高维空间的路径搜索问题。
模块化设计:分为规划器(实现具体算法)、状态空间(定义机器人的运动维度和约束)、有效性检查器(判断路径是否碰撞或合规)等模块,支持灵活扩展和定制。
与 ROS/MoveIt 深度集成:是 MoveIt(ROS 生态中机械臂运动规划的核心工具) 的默认运动规划库,在配置 MoveIt 时,你选择的 “OMPL” 规划器就是基于这个库实现的。
(3)joints
设置末端位置,本质上就是在拖动规划球
moveit可视化配置到底为我们创造了什么?

该文件夹结构是使用 MoveIt2 的可视化配置工具生成的机器人配置包。这个包的作用是为机器人( robot_arm)提供 MoveIt2 所需的所有配置信息,以便实现运动规划、轨迹执行、可视化等高级功能。
整体作用:
这个 robot_arm_config 包是一个 MoveIt2 配置包,它将你的机器人 URDF 模型与 MoveIt2 系统集成,包含:
- 机器人模型(URDF/SRDF)
- 控制器配置
- 运动学、碰撞检测、关节限制等参数
- 启动文件和可视化工具
它用于在 ROS2 中运行 MoveIt2 功能,比如:路径规划、笛卡尔运动、抓取、可视化等。
文件详解
✅ config/ 目录下的文件
| 文件名 | 作用 |
|---|---|
arm.ros2_control.xacro | ROS 2 控制框架的配置文件,定义关节控制器(如位置 / 速度控制器),指定如何与硬件 / 仿真关节交互(接口类型、传输协议等)。 |
arm.srdf | 语义机器人描述格式(SRDF),是 URDF 的 “语义补充”。定义运动学组(Planning Groups)、末端执行器、碰撞豁免矩阵、关节限制等,是 MoveIt 2 规划的核心语义逻辑。将可视化配置中有关于机器人模型的设置放到了其中。 |
arm.urdf.xacro | 将控制插件arm.ros2_control.xacro与robot_arm_urdf文件融合大一起,是机器人模型的 “骨架文件”(URDF 格式,xacro 是其宏定义扩展)。描述机器人的几何结构、连杆、关节、惯性、可视化模型等,是机器人的基础物理模型。 |
initial_positions.yaml | 存储机器人关节的初始位置(默认姿态),在启动或规划前设置关节的默认状态(如机械臂开机时的 “归中” 位置)。用于启动时让机器人“摆好姿势”,避免奇异位形或碰撞。 |
joint_limits.yaml | 定义关节的运动限制(位置范围、速度上限、加速度上限等),MoveIt 2 和控制器会参考这些限制规划 “安全且合规” 的运动。 |
kinematics.yaml | 配置运动学求解器(如 KDL、IKFast),设置求解精度、速度等参数,用于逆运动学(IK)和正运动学(FK)计算(即 “给定末端位姿,算出关节角度” 或反之)。示例启动文件中,我们设置好末端执行器位置,moveit自动控制关节运动到末端位置上,就是使用的逆运动学。 |
moveit_controllers.yaml | MoveIt 2 与 ROS 2 控制器管理器的 “交互配置”。定义控制器类型(如关节轨迹控制器)、命名空间等,让 MoveIt 能向控制器发送轨迹指令。 |
moveit.rviz | RViz 的可视化配置文件,保存了预设的 RViz 布局(如机器人模型显示、规划场景、轨迹可视化等),一键加载即可看到运动规划的可视化界面。 |
pilz_cartesian_limits.yaml | (若使用 Pilz 运动规划插件)配置笛卡尔空间运动限制(速度、加速度、加加速度 jerk 限制),确保机械臂在笛卡尔轨迹(直线 / 圆弧)运动时的平滑与安全。 |
ros2_controllers.yaml | ROS 2 控制器的详细参数配置,定义每个控制器的周期、接口类型、增益等(如关节轨迹控制器的具体实现参数)。 |
根据自己的意愿修改配置:
修改 kinematics.yaml 调整 IK 精度
修改 joint_limits.yaml 设置安全范围
修改 moveit_controllers.yaml 添加新控制器

以下是 robot_arm_config 功能包中 launch 文件夹内各启动文件的作用说明,它们负责一键启动 MoveIt 2 运动规划系统的不同功能模块:
| 启动文件名 | 作用 |
|---|---|
demo.launch.py | 综合演示启动文件,一键启动整个 MoveIt 2 环境:加载机器人模型、启动 move_group 规划节点、启动 RViz 并加载预设可视化配置、启动机器人状态发布节点等,用于快速测试运动规划功能。 |
move_group.launch.py | 启动 MoveIt 2 核心规划节点 move_group,该节点负责运动规划、逆运动学(IK)求解、碰撞检测、轨迹生成等核心功能,是机械臂 “决策运动” 的大脑。 |
moveit_rviz.launch.py | 启动 RViz 并加载预设的 MoveIt 可视化配置(如 config/moveit.rviz),用于可视化机器人模型、规划场景、运动轨迹等,是调试和监控运动规划的 “可视化窗口”。 |
rsp.launch.py | 启动 Robot State Publisher(机器人状态发布)节点,负责将机器人的关节状态转换为 TF 变换(坐标系关系),让 RViz、move_group 等节点能实时获取机器人的位姿信息。 |
setup_assistant.launch.py | 启动 MoveIt Setup Assistant 可视化配置工具,用于后续修改或重新创建机器人的 MoveIt 配置(如调整规划组、末端执行器、碰撞矩阵等)。 |
spawn_controllers.launch.py | 启动 ROS 2 控制器管理器,并加载 config/ros2_controllers.yaml 中配置的控制器(如关节轨迹控制器),使机械臂能接收并执行 move_group 生成的运动轨迹。 |
static_virtual_joint_tfs.launch.py | 若机器人存在虚拟关节(如底座与世界坐标系的固定连接),该文件会发布对应的 TF 变换,确保虚拟关节的坐标系关系在系统中正确生效。 |
这些启动文件通过模块化分工,实现了 “模型加载→状态发布→规划决策→控制器执行→可视化监控” 的完整运动规划流程,让你可以通过简单的 ros2 launch 命令快速启动不同功能模块,高效调试和使用 MoveIt 2。
在此基础上,加入gazebo仿真:
先安装gazebo功能包:
使用ros2_control控制Gazebo中的机器人需要安装ros2_control在Gazebo中的插件gz-ros2-control,
# 1. 先更新软件源(关键:避免源未同步导致包找不到)
sudo apt update && sudo apt upgrade -y
# 2. 安装核心包(包含 gz_ros2_control 插件)
sudo apt install ros-jazzy-ros-gz-sim ros-jazzy-ros-gz-bridge -y
# 3. 尝试安装独立的控制插件包(若上面的包未包含)
sudo apt install ros-jazzy-gz-ros2-control -y
创建arm.gazebo.urdf.xacro:
在robot_arm_config功能包的config文件夹下,有一个表示机械臂模型的arm.urdf.xacro文件,使用XACRO格式,主要是对原机械臂的URDF添加了ros2_control的相关配置。
为了能够控制Gazebo中的机械臂,需要重新调整ros2_control的相关配置为Gazebo的ros2_control插件gz_ros2_control,以及需要将机械臂的底座固定在地面。
因此,基于arm.urdf.xacro文件进行修改,创建一个名为arm.gazebo.urdf.xacro文件

robot_description
$(find robot_arm_config)/config/ros2_controllers.yaml
true
相较于arm.urdf.xacro文件,主要做了以下改动:
1.添加了一个标签,用于添加Gazebo所需要的特性,里边有两项改动:
○ 添加了一个标签,用于将机械臂的底座固定在Gazebo的世界坐标系中。
○ 添加了一个标签,用于加载Gazebo的ros2_control插件gz_ros2_control,用于控制Gazebo仿真的机械臂。
2.修改了ros2_control的配置文件为<xacro:include filename="arm.gazebo.ros2_control.xacro"/>
,arm.gazebo.ros2_control.xacro文件是基于arm.ros2_contrdl.xacro文件修改而来,主要是将ros2_control的硬件接口改为Gazebo仿真所需的插件。创建一个名arm.gazebo.ros2_control.xacro的文件
创建arm.gazebo.ros2_control.xacro文件:
gz_ros2_control/GazeboSimSystem
${initial_positions['joint1']}
${initial_positions['joint2']}
${initial_positions['joint3']}
${initial_positions['joint4']}
${initial_positions['joint5']}
${initial_positions['joint6']}
${initial_positions['hand_right_joint']}
在launch文件夹中创建一个 文件gazebo.launch.py
除开与gazebo相关的节点,其他需要启动的节点(包括节点的配置),可以参考moveit可视化配置后得到的demo.launch所启动的节点。
# 导入MoveIt配置构建工具,用于简化机器人描述、规划管线等配置的加载
from moveit_configs_utils import MoveItConfigsBuilder
# 用于获取功能包的共享目录路径,方便定位配置文件(如URDF、SRDF、控制器配置)
from ament_index_python.packages import get_package_share_directory
# 用于创建ROS 2节点的启动动作
from launch_ros.actions import Node
# 定义launch文件的描述结构,用于组织多个启动动作
from launch import LaunchDescription
# 用于包含其他launch文件的启动动作(比如启动Gazebo的launch文件)
from launch.actions import IncludeLaunchDescription
# 用于指定Python格式的launch文件源
from launch.launch_description_sources import PythonLaunchDescriptionSource
def generate_launch_description():
# 获取当前功能包(robot_arm_config)的共享目录路径,后续用于定位配置文件
packagepath = get_package_share_directory('robot_arm_config')
print(packagepath) # 打印路径,方便调试
# 构建MoveIt配置:加载机器人仿真模型(URDF)和语义描述(SRDF)
# "arm"是规划组名称,package_name指定功能包,robot_description加载URDF,robot_description_semantic加载SRDF
moveit_config = (MoveItConfigsBuilder("arm", package_name="robot_arm_config")
.robot_description('config/arm.gazebo.urdf.xacro') # 加载机器人仿真模型的URDF文件(Xacro格式)
.robot_description_semantic('config/arm.srdf') # 加载机器人语义描述(定义规划组、自碰撞等)
.to_moveit_configs() # 生成MoveIt配置对象
)
# 启动Gazebo仿真环境
# 等价于ros2 launch ros_gz_sim gz_sim.launch.py gz_args:="empty.sdf -r --physics-engine gz-physics-bullet-featherstone-plugin"
gazebo_node = IncludeLaunchDescription(
PythonLaunchDescriptionSource([
# 定位ros_gz_sim功能包的gz_sim.launch.py启动文件,用于启动Gazebo
get_package_share_directory('ros_gz_sim') + '/launch/gz_sim.launch.py'
]),
# 传递Gazebo启动参数:加载空世界、启用Bullet物理引擎
launch_arguments=[('gz_args', 'empty.sdf -r --physics-engine gz-physics-bullet-featherstone-plugin')]
)
# 将机器人模型加载到Gazebo仿真环境中
# ros2 run ros_gz_sim create -string "$(ros2 param get /robot_state_publisher robot_description)" -x 0.0 -y 0.0 -z 0.0
robot_to_gazebo_node = Node(
package='ros_gz_sim', # 功能包:ros_gz_sim(Gazebo与ROS 2的桥接工具)
executable='create', # 可执行文件:用于在Gazebo中创建模型
# 参数:机器人模型的URDF字符串、初始位姿(x,y,z均为0.0)
arguments=[ '-string', moveit_config.robot_description['robot_description'], '-x', '0.0', '-y', '0.0', '-z','0.0' ]
)
# 时钟桥接:同步Gazebo仿真时间与ROS 2时钟(必须同步,否则控制和仿真会“时差”)
# ros2 run ros_gz_bridge parameter_bridge /clock@rosgraph_msgs/msg/Clock[gz.msgs.Clock] --output screen
clock_bridge_node = Node(
package='ros_gz_bridge', # 功能包:ros_gz_bridge(Gazebo与ROS 2的消息桥接工具)
executable='parameter_bridge', # 可执行文件:参数化桥接工具
# 桥接指令:将Gazebo的时钟消息转换为ROS 2的Clock消息
arguments=['/clock@rosgraph_msgs/msg/Clock[gz.msgs.Clock]'],
output='screen' # 输出日志到终端
)
# 发布机器人状态(关节变换、TF等):让RViz和MoveIt能看到机器人的模型和运动
robot_desc_node = Node(
package="robot_state_publisher", # 功能包:机器人状态发布
executable="robot_state_publisher", # 可执行文件:状态发布节点
name="robot_state_publisher", # 节点名称
output="both", # 输出日志到终端和日志文件
parameters=[
moveit_config.robot_description, # 机器人URDF描述
{'use_sim_time': True}, # 启用仿真时间(和Gazebo时钟同步)
{"publish_frequency": 30.0}, # 状态发布频率(30Hz)
],
)
# 启动RViz并加载MoveIt预设可视化配置:可视化规划过程、机器人模型、环境等
rviz_node = Node(
package="rviz2", # 功能包:RViz可视化工具
executable="rviz2", # 可执行文件:RViz启动程序
output="log", # 输出日志到文件(减少终端冗余)
# 参数:加载预设的MoveIt可视化配置文件
arguments=["-d", packagepath + '/config/moveit.rviz'],
parameters=[
moveit_config.robot_description, # 机器人URDF描述
moveit_config.robot_description_semantic, # 机器人语义描述(SRDF)
moveit_config.robot_description_kinematics, # 运动学配置(逆解、正解)
moveit_config.planning_pipelines, # 规划管线配置(如OMPL算法)
moveit_config.joint_limits, # 关节限制配置(最大角度、速度等)
{'use_sim_time': True}, # 启用仿真时间
],
)
# 启动ros2_control控制器管理器:管理所有关节控制器的启动、停止
ros2_control_node = Node(
package='controller_manager', # 功能包:控制器管理器
executable='ros2_control_node', # 可执行文件:ros2_control核心节点
parameters=[
packagepath + '/config/ros2_controllers.yaml', # 加载控制器配置文件(定义关节控制器参数)
{'use_sim_time': True}, # 启用仿真时间
],
output="both", # 输出日志到终端和文件
)
# 启动具体的控制器:关节状态发布器、机械臂控制器、夹爪控制器
controller_spawner_node = Node(
package="controller_manager", # 功能包:控制器管理器
executable="spawner", # 可执行文件:控制器启动工具
# 参数:需要启动的控制器名称(必须和ros2_controllers.yaml中定义的一致)
arguments=[
"joint_state_broadcaster", "arm_controller", "hand_controller"
],
)
# 启动MoveIt核心规划节点(move_group):负责运动规划、逆解、轨迹生成等核心功能
move_group_node = Node(
package="moveit_ros_move_group", # 功能包:MoveIt运动规划核心
executable="move_group", # 可执行文件:move_group节点
output="screen", # 输出日志到终端
parameters=[
moveit_config.to_dict(), # 加载所有MoveIt配置
{'use_sim_time': True}, # 启用仿真时间
],
)
# 组织所有启动动作,按顺序返回LaunchDescription
return LaunchDescription([
gazebo_node, # 1. 先启动Gazebo仿真环境
robot_to_gazebo_node, # 2. 将机器人模型加载到Gazebo
clock_bridge_node, # 3. 同步Gazebo与ROS 2的时钟
robot_desc_node, # 4. 发布机器人状态(让RViz和MoveIt看到模型)
rviz_node, # 5. 启动RViz可视化
ros2_control_node, # 6. 启动控制器管理器
controller_spawner_node, # 7. 启动具体的关节控制器
move_group_node # 8. 启动MoveIt核心规划节点
])
编译,配置环境变量,运行测试:
ros2 launch robot_arm_config gazebo.launch.py



浙公网安备 33010602011771号