一个Moveit示例分析
The planning and execution components of MoveIt! configured to run
参数器发布关节名称数组(rosparam load 利用yaml文件)
必须与机器人控制器(如之前提到的 JointPositionController)预期接收的关节顺序完全一致,否则会导致控制指令与关节不匹配。
<rosparam command="load" file="$(find probot_anno_moveit_config)/config/joint_names.yaml"/>
ip地址设置: 若 sim=false(即连接真实机器人),则必须提供 robot_ip 参数(用于指定真实机器人的IP地址) 。同时规划器选择ompl
<arg name="sim" default="false" />
<arg name="robot_ip" default="127.0.0.1"/>
<arg name="planner" default="ompl" /> <!-- ompl, chomp -->
向参数服务器中robot_description 上传机器人的模型(urdf/xacro)
<param name="robot_description" command="$(find xacro)/xacro --inorder '$(find probot_description)/urdf/probot_anno.xacro'" />
运行robot_state_publisher节点,发布tf
<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"
respawn="false" output="screen">
</node>
向参数服务器加载robot_description的一些参数
<include file="$(find probot_anno_moveit_config)/launch/planning_context.launch" >
<arg name="load_robot_description" value="true" />
</include>
我们进入planning_context文件分析一下,可以发现都是向参数服务器上传一些参数。
- 机器人URDF模型(描述机器人的物理结构(如连杆、关节的几何形状、连接关系、运动范围、碰撞惯性矩阵等))
- 机器人SRDF模型(定义更高层次的语义信息,哪些关节属于机器人的 “臂”“手” 等功能组;关节的默认姿态;碰撞检测时可忽略的连杆;机器人的工作空间、末端执行器定义等。)
- 关节限制Joint_Limit (各个关节的速度、加速度、位置限制)
- 运动学求解器参数设置kinematics (指定运动学求解器的类型,搜索分辨率,求解超时时间,求解器最大尝试次数)
<launch>
<!-- 选择是否载入URDF模型文件 避免重复的加载 -->
<arg name="load_robot_description" default="false"/>
<!-- 机器人名称前缀 -->
<arg name="robot_description" default="robot_description"/>
<!-- 载入URDF模型 -->
<param if="$(arg load_robot_description)" name="$(arg robot_description)" command="xacro --inorder '$(find probot_description)/urdf/probot_anno.xacro'"/>
<!-- 机器人语义描述文件(srdf)加载 是对 URDF 模型的语义层面补充 -->
<param name="$(arg robot_description)_semantic" textfile="$(find probot_anno_moveit_config)/config/probot_anno.srdf" />
<!-- 载入关节限制 -->
<group ns="$(arg robot_description)_planning">
<rosparam command="load" file="$(find probot_anno_moveit_config)/config/joint_limits.yaml"/>
</group>
<!-- 加载运动学的默认配置;这些默认配置会被节点命名空间(namespace)内的配置覆盖 -->
<group ns="$(arg robot_description)_kinematics">
<rosparam command="load" file="$(find probot_anno_moveit_config)/config/kinematics.yaml"/>
</group>
</launch>
Moveit的核心move_group,同样我们进入launch文件,看一下都需要配置哪些参数。
<include file="$(find probot_anno_moveit_config)/launch/move_group.launch">
<arg name="publish_monitored_planning_scene" value="true" />
<arg name="planner" value="$(arg planner)"/>
</include>
参数比较多
- sim:是否仿真(仿真 or 实际机器人)
- robot_ip:ip设置(仿真127.0.0.1 实际机器人对应机器人ip)
- planner:规划器名称
- allow_trajectory_execution:是否允许轨迹执行
- fake_execution:是否使用虚拟执行(不实际控制机器人 直接接rviz)
- max_safe_path_cost:安全路径的最大成本
- jiggle_fraction:调整分数,用于处理微小碰撞
- publish_monitored_planning_scene:是否发布监控的规划场景
- planning_pipeline.launch:中关于路径规划器的参数(默认ompl)
- trajectory_execution.launch.xml:中关于轨迹控制器的配置参数
- launch/sensor_manager.launch.xml:中关于传感器的配置参数
启动move_group节点,将上述参数作为输入参数 启动move_group节点。
<launch>
<!-- 这条已经执行过了 向参数服务器发布一些配置参数 -->
<include file="$(find probot_anno_moveit_config)/launch/planning_context.launch" />
<arg name="planner" default="ompl" /><!-- 路径规划组 -->
<arg name="gazebo" default="false" /><!-- 是否使用gazebo -->
<!-- GDB 调试选项 的参数设置 -->
<!--允许用户在启动节点时选择是否是否启用 GDB(GNU 调试调试器)进行程序调试 -->
<arg name="debug" default="false" />
<arg unless="$(arg debug)" name="launch_prefix" value="" />
<arg if="$(arg debug)" name="launch_prefix"
value="gdb -x $(find probot_anno_moveit_config)/launch/gdb_settings.gdb --ex run --args" />
<!-- Verbose Mode Option -->
<arg name="info" default="$(arg debug)" />
<arg unless="$(arg info)" name="command_args" value="" />
<arg if="$(arg info)" name="command_args" value="--debug" />
<!-- move_group settings -->
<arg name="allow_trajectory_execution" default="true"/>
<arg name="fake_execution" default="false"/>
<arg name="max_safe_path_cost" default="1"/>
<arg name="jiggle_fraction" default="0.05" />
<arg name="publish_monitored_planning_scene" default="true"/>
<arg name="capabilities" default=""/>
<arg name="disable_capabilities" default=""/>
<!-- load these non-default MoveGroup capabilities (space seperated) -->
<!--
<arg name="capabilities" value="
a_package/AwsomeMotionPlanningCapability
another_package/GraspPlanningPipeline
" />
-->
<!-- inhibit these default MoveGroup capabilities (space seperated) -->
<!--
<arg name="disable_capabilities" value="
move_group/MoveGroupKinematicsService
move_group/ClearOctomapService
" />
-->
<!-- Planning Functionality -->
<include ns="move_group" file="$(find probot_anno_moveit_config)/launch/planning_pipeline.launch.xml">
<arg name="pipeline" value="$(arg planner)" />
</include>
<!-- Trajectory Execution Functionality -->
<include ns="move_group" file="$(find probot_anno_moveit_config)/launch/trajectory_execution.launch.xml" if="$(arg allow_trajectory_execution)">
<arg name="moveit_manage_controllers" value="true" />
<arg name="moveit_controller_manager" value="probot_anno" unless="$(arg fake_execution)"/>
<arg name="moveit_controller_manager" value="fake" if="$(arg fake_execution)"/>
<arg name="gazebo" value="$(arg gazebo)" />
</include>
<!-- Sensors Functionality -->
<include ns="move_group" file="$(find probot_anno_moveit_config)/launch/sensor_manager.launch.xml" if="$(arg allow_trajectory_execution)">
<arg name="moveit_sensor_manager" value="probot_anno" />
</include>
<!-- Start the actual move_group node/action server
启动move_group节点 充当Action通信的server -->
<node name="move_group" launch-prefix="$(arg launch_prefix)" pkg="moveit_ros_move_group" type="move_group" respawn="false" output="screen" args="$(arg command_args)">
<!-- Set the display variable, in case OpenGL code is used internally
设置DISPLAY环境变量,确保节点中涉及OpenGL的图形渲染功能能正确关联到当前显示设备 -->
<env name="DISPLAY" value="$(optenv DISPLAY :0)" />
<param name="allow_trajectory_execution" value="$(arg allow_trajectory_execution)"/>
<param name="max_safe_path_cost" value="$(arg max_safe_path_cost)"/>
<param name="jiggle_fraction" value="$(arg jiggle_fraction)" />
<param name="capabilities" value="$(arg capabilities)"/>
<param name="disable_capabilities" value="$(arg disable_capabilities)"/>
<!-- Publish the planning scene of the physical robot
so that rviz plugin can know actual robot
规划场景中 场景数据 发布场景中几何图形变化 关节状态更新 坐标关系更新 -->
<param name="planning_scene_monitor/publish_planning_scene" value="$(arg publish_monitored_planning_scene)" />
<param name="planning_scene_monitor/publish_geometry_updates" value="$(arg publish_monitored_planning_scene)" />
<param name="planning_scene_monitor/publish_state_updates" value="$(arg publish_monitored_planning_scene)" />
<param name="planning_scene_monitor/publish_transforms_updates" value="$(arg publish_monitored_planning_scene)" />
</node>
</launch>
planning_pipeline.launch配置 运动规划插件(OMPL)及规划适配器 的启动文件,主要作用是定义机器人运动规划的核心算法、预处理规则和参数,确保规划出的轨迹安全、可行。
- plnning_plugin对应的 MoveIt 与 OMPL 库对接的接口插件
- 规划适配器(Planning Adapters)配置
规划适配器:是在规划算法执行前 / 后对规划请求或结果进行预处理 / 后处理的插件,作用是修正输入、优化输出,确保规划可行。顺序至关重要(按列表顺序执行)。
AddTimeParameterization:为规划出的轨迹添加时间参数(根据关节速度限制计算每个点的执行时间),使轨迹可被控制器按时间同步执行。FixWorkspaceBounds:修正规划空间(Workspace)的边界(如限制机械臂运动范围),若用户未指定则使用默认边界。FixStartStateBounds:修正机器人起始状态中超出关节限位的情况(如关节因误差略超上限,自动调整到安全范围内)。FixStartStateCollision:检查起始状态是否与自身或环境碰撞,若碰撞则微调关节位置(在安全范围内)以避免初始碰撞。FixStartStatePathConstraints:确保起始状态满足用户设定的路径约束(如某关节必须保持水平),不满足则修正。industrial_trajectory_filters/NPointFilter:工业机器人专用的轨迹滤波插件,用于减少轨迹点数量(保留n_points个关键帧),使轨迹更平滑、适合硬件执行。
- start_state_max_bounds_error:允许起始状态关节位置超出限位的最大误差(rad),默认0.1。若超出此值,FixStartStateBounds适配器会报错,避免规划无效路径。
- n_points:配合NPointFilter适配器,指定轨迹滤波后保留的关键点数量(这里为 20 个),平衡轨迹精度和执行效率。
<launch>
<!-- OMPL Plugin for MoveIt! -->
<arg name="planning_plugin" value="ompl_interface/OMPLPlanner" />
<!-- The request adapters (plugins) used when planning with OMPL.
ORDER MATTERS -->
<arg name="planning_adapters" value="default_planner_request_adapters/AddTimeParameterization
default_planner_request_adapters/FixWorkspaceBounds
default_planner_request_adapters/FixStartStateBounds
default_planner_request_adapters/FixStartStateCollision
default_planner_request_adapters/FixStartStatePathConstraints
industrial_trajectory_filters/NPointFilter" />
<arg name="start_state_max_bounds_error" value="0.1" />
<param name="planning_plugin" value="$(arg planning_plugin)" />
<param name="request_adapters" value="$(arg planning_adapters)" />
<param name="start_state_max_bounds_error" value="$(arg start_state_max_bounds_error)" />
<param name="n_points" value="20"/>
<rosparam command="load" file="$(find probot_anno_moveit_config)/config/ompl_planning.yaml"/>
</launch>
<launch>
<!-- This file makes it easy to include the settings for trajectory execution -->
<!-- Flag indicating whether MoveIt! is allowed to load/unload or switch controllers -->
<arg name="moveit_manage_controllers" default="true"/>
<param name="moveit_manage_controllers" value="$(arg moveit_manage_controllers)"/>
<arg name="gazebo" default="false" />
<!-- When determining the expected duration of a trajectory, this multiplicative factor is applied to get the allowed duration of execution -->
<param name="trajectory_execution/allowed_execution_duration_scaling" value="1.5"/> <!-- default 1.2 -->
<!-- Allow more than the expected execution time before triggering a trajectory cancel (applied after scaling) -->
<param name="trajectory_execution/allowed_goal_duration_margin" value="0.5"/> <!-- default 0.5 -->
<!-- Allowed joint-value tolerance for validation that trajectory's first point matches current robot state -->
<param name="trajectory_execution/allowed_start_tolerance" value="0.1"/> <!-- default 0.01 -->
<!-- Load the robot specific controller manager; this sets the moveit_controller_manager ROS parameter -->
<arg name="moveit_controller_manager" default="probot_anno" />
<include file="$(find probot_anno_moveit_config)/launch/$(arg moveit_controller_manager)_moveit_controller_manager.launch.xml">
<arg name="gazebo" value="$(arg gazebo)" />
</include>
</launch>
<launch>
<arg name="gazebo" default="false" />
<arg name="moveit_controller_manager" default="moveit_simple_controller_manager/MoveItSimpleControllerManager"/>
<param name="moveit_controller_manager" value="$(arg moveit_controller_manager)"/>
<group if="$(arg gazebo)">
<!-- gazebo Controller -->
<rosparam file="$(find probot_anno_moveit_config)/config/controllers_gazebo.yaml"/>
</group>
<group unless="$(arg gazebo)">
<!-- ROS-I Controller -->
<rosparam file="$(find probot_anno_moveit_config)/config/controllers.yaml"/>
</group>
</launch>
<!-- run the robot simulator and action interface nodes -->
<group if="$(arg sim)">
<include file="$(find probot_anno_moveit_config)/launch/moveit_rviz.launch">
<arg name="config" value="true"/>
</include>
<include file="$(find industrial_robot_simulator)/launch/robot_interface_simulator.launch"/>
</group>
<!-- run the "real robot" interface nodes -->
<!-- - this typically includes: robot_state, motion_interface, and joint_trajectory_action ntes -->
<!-- - replace these calls with appropriate robot-specific calls or launch files -->
<group unless="$(arg sim)">
<include file="$(find probot_anno_moveit_config)/launch/moveit_rviz.launch">
<arg name="config" value="true"/>
<arg name="command_args" value="-d $(find probot_bringup)/config/PROBOT_Anno.rviz"/>
</include>
<include file="$(find industrial_robot_client)/launch/robot_interface_download.launch">
<arg name="robot_ip" value="$(arg robot_ip)"/>
</include>
<node name="probot_cmd_interface" pkg="probot_driver" type="probot_cmd_interface" output="screen"/>
<node name="probot_io_interface" pkg="probot_driver" type="probot_io_interface" output="screen"/>
<node name="probot_log_interface" pkg="probot_driver" type="probot_log_interface" />
</group>
- 使用仿真环境
moveit_rviz.launch:启动rviz配置相关的文件
robot_interface_simulator.launch:仿真情况下加载相关参数
- 真实机器人
moveit_rviz.launch: 启动rviz配置相关的文件
industrial_robot_client/launch/robot_interface_download:从真实机器人下载配置信息(如关节参数、控制模式),并建立基础通信连接
probot_driver功能包下的节点(机器人的专属驱动节点,负责与真实硬件直接交互)
probot_cmd_interface:接收 ROS 上层的运动指令(如关节位置、轨迹),转换为机器人能识别的控制信号(如电机驱动指令),并下发给硬件。
probot_io_interface:处理机器人的 IO 信号(如末端执行器的气泵开关、限位传感器信号),实现硬件层面的输入输出控制。
probot_log_interface:记录机器人的运行状态、错误信息等日志,用于调试和故障排查(未指定output="screen" ,默认日志可能输出到文件或 ROS 日志系统)。
这是程序的所有内容,但是其实还需注意的就是发布轨迹和接收关节状态的实现程序
更多推荐


所有评论(0)