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)配置

        规划适配器:是在规划算法执行前 / 后对规划请求或结果进行预处理 / 后处理的插件,作用是修正输入、优化输出,确保规划可行。顺序至关重要(按列表顺序执行)。

  1. AddTimeParameterization:为规划出的轨迹添加时间参数(根据关节速度限制计算每个点的执行时间),使轨迹可被控制器按时间同步执行。
  2. FixWorkspaceBounds:修正规划空间(Workspace)的边界(如限制机械臂运动范围),若用户未指定则使用默认边界。
  3. FixStartStateBounds:修正机器人起始状态中超出关节限位的情况(如关节因误差略超上限,自动调整到安全范围内)。
  4. FixStartStateCollision:检查起始状态是否与自身或环境碰撞,若碰撞则微调关节位置(在安全范围内)以避免初始碰撞。
  5. FixStartStatePathConstraints:确保起始状态满足用户设定的路径约束(如某关节必须保持水平),不满足则修正。
  6. 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 日志系统)。

        这是程序的所有内容,但是其实还需注意的就是发布轨迹和接收关节状态的实现程序

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐