Soup's Blog

Back

ROS2_Moveit2_Ur5e_Grasp项目详解(四):ur5e_gripper_moveit文件详解Blur image

接下来详细解释ur5e_gripper_moveit.launch.py文件内容

第一步,先看generate_launch_description函数#

代码如下:

这里稍微介绍一下ur5e_gripper.srdf.xacro文件,ur5e_gripper.srdf.xacro 是一个SRDF (Semantic Robot Description Format) 文件,它是MoveIt运动规划框架中的一个重要配置文件。SRDF文件用于定义机器人的语义信息,这些信息扩展了基本的URDF(Unified Robot Description Format)模型。这个文件由Setup Assistant生成。 代码如下:

这个文件的主要作用包括:

  • 定义机器人组(Groups):指定机器人的关节和链接如何组成不同的运动学组,例如机械臂组和夹爪组。

  • 定义末端执行器(End Effectors):指定机器人末端执行器与哪个链接相连,以及使用哪个组作为其运动学组。

  • 定义虚拟关节(Virtual Joints):定义机器人与世界坐标系的连接关系。

  • 定义被动关节(Passive Joints):标记那些不受主动控制的关节。

  • 定义机器人自碰撞(Self-Collision):指定哪些链接之间可能发生碰撞,哪些可以忽略。

总结 这段XML代码定义了一个UR5e机械臂与Robotiq夹爪的机器人系统配置:

  1. 声明使用xacro命名空间和UTF-8编码
  2. 包含UR5e和Robotiq的SRDF宏定义文件
  3. 定义名为”ready”的预设关节姿态
  4. 禁用特定连杆间的碰撞检测,避免运动规划时误判

第二步,看launch_setup函数#

代码如下:

URDF文件和SRDF文件 关于URDF文件和SRDF文件的关系可以参考博客

这里简单总结两者之间的关系:

  • 依赖关系:SRDF文件依赖于URDF文件,它是在URDF基础上添加语义信息的扩展。
  • 功能互补:URDF描述机器人的物理结构,SRDF描述机器人的运动学和规划相关语义信息。
  • 协同工作:在MoveIt中,URDF和SRDF通常一起使用,URDF提供基本的机器人描述,SRDF提供运动规划所需的高级语义信息。

kinematics.yaml文件

kinematics.yaml文件是MoveIt运动规划框架中一个非常重要的配置文件,用于配置机器人的运动学求解器。它定义了机器人各运动学组如何进行正向和逆向运动学计算。

joint_limits.yaml文件

顾名思义:关节活动限制文件

运动规划配置

ompl_planning_pipeline_config = {
        "move_group": {
            "planning_plugin": "ompl_interface/OMPLPlanner",
            "request_adapters": """default_planner_request_adapters/AddTimeOptimalParameterization default_planner_request_adapters/FixWorkspaceBounds default_planner_request_adapters/FixStartStateBounds default_planner_request_adapters/FixStartStateCollision default_planner_request_adapters/FixStartStatePathConstraints""",
            "start_state_max_bounds_error": 0.1,
        }
    }
python

这段代码是ROS 2 MoveIt配置中的重要部分,用于设置OMPL(Open Motion Planning Library)运动规划管道。OMPL是MoveIt中使用的默认运动规划库,提供了多种规划算法。

这部分创建了一个基本的OMPL规划管道配置:

  • planning_plugin: 指定使用OMPL作为规划器
  • request_adapters: 定义规划请求处理适配器列表,这些适配器在规划前对请求进行预处理:
    • AddTimeOptimalParameterization: 添加时间最优参数化
    • FixWorkspaceBounds: 修复工作空间边界
    • FixStartStateBounds: 修复起始状态边界
    • FixStartStateCollision: 修复起始状态碰撞
    • FixStartStatePathConstraints: 修复起始状态路径约束
  • start_state_max_bounds_error: 设置起始状态最大边界误差为0.1
    ## 加载OMPL规划配置并更新到move_group配置中
    ompl_planning_yaml = load_yaml("ur5e_gripper_moveit_config", "config/ompl_planning.yaml")
    ompl_planning_pipeline_config["move_group"].update(ompl_planning_yaml)
python

这部分代码加载了额外的OMPL规划配置文件,并将其合并到基本配置中:

  1. 使用load_yaml函数加载ompl_planning.yaml文件中的配置
  2. 通过update方法将加载的配置合并到现有配置中 从我们查看的ompl_planning.yaml文件中可以看到,它定义了:
  1. 多种规划算法的配置(如RRT、RRT*、PRM等)
  2. 为ur_manipulator组指定了默认规划器为RRT*
  3. 设置了规划尝试次数、规划时间等参数

控制器配置

## 加载控制器配置文件
    controllers_yaml = load_yaml("ur5e_gripper_moveit_config", "config/moveit_controllers.yaml")
python

这部分代码加载了外部的控制器配置文件moveit_controllers.yaml。通过读取该文件,我们可以看到其中定义了两种控制器:

  • ur5e_arm_controller:机械臂控制器,类型为FollowJointTrajectory,用于控制机械臂的关节轨迹
  • gripper_controller:夹爪控制器,类型为GripperCommand,用于控制夹爪的开合
## 配置MoveIt控制器管理器和轨迹执行参数
    moveit_controllers = {
        "moveit_simple_controller_manager": controllers_yaml,
        "moveit_controller_manager": "moveit_simple_controller_manager/MoveItSimpleControllerManager",
        "trajectory_execution" : {
            "allowed_execution_duration_scaling": 2.0,  ## change execution time scaling here
            "allowed_goal_duration_margin": 0.5,
            "allowed_start_tolerance": 0.01,
        }
    }
python

这部分配置了MoveIt的控制器管理器和轨迹执行参数:

  • moveit_simple_controller_manager:使用之前加载的控制器配置
  • moveit_controller_manager:指定使用MoveItSimpleControllerManager作为控制器管理器
  • trajectory_execution:轨迹执行相关参数设置
    • allowed_execution_duration_scaling: 允许的执行时间缩放比例为2.0,意味着允许轨迹执行的时间比计划的时间长100%
    • allowed_goal_duration_margin: 允许的目标时间余量为0.5秒
    • allowed_start_tolerance: 允许的起始状态误差为0.01
## 配置MoveIt控制器管理器和轨迹执行参数
    moveit_controllers = {
        "moveit_simple_controller_manager": controllers_yaml,
        "moveit_controller_manager": "moveit_simple_controller_manager/MoveItSimpleControllerManager",
        "trajectory_execution" : {
            "allowed_execution_duration_scaling": 2.0,  ## change execution time scaling here
            "allowed_goal_duration_margin": 0.5,
            "allowed_start_tolerance": 0.01,
        }
    }
python

这部分是额外的轨迹执行参数配置:

  • moveit_manage_controllers: 设置为False,表示不使用MoveIt管理控制器的生命周期
  • 其他参数与上面的配置类似,但执行时间缩放比例为1.2(比上面的配置宽松一些)

总结:些配置最终会被传递给MoveIt的move_group节点,用于控制机器人执行规划好的轨迹。配置中的参数对于确保轨迹执行的安全性和成功率非常重要,比如允许一定的时间余量可以防止因为执行稍慢而导致轨迹执行失败。

配置规划场景监控参数

## 配置规划场景监控参数
    planning_scene_monitor_parameters = {
        "publish_planning_scene": True,
        "publish_geometry_updates": True,
        "publish_state_updates": True,
        "publish_transforms_updates": True,
        "publish_robot_description":True,
        "publish_robot_description_semantic":True,
    }
python

各项参数的含义如下:

  • “publish_planning_scene”: True - 启用规划场景的发布功能。规划场景包含了机器人、障碍物、工作空间等所有与运动规划相关的信息。

  • “publish_geometry_updates”: True - 启用几何更新的发布。当环境中的物体几何形状发生变化时,会发布这些更新。

  • “publish_state_updates”: True - 启用状态更新的发布。当机器人或环境的状态发生变化时(如关节角度变化),会发布这些更新。

  • “publish_transforms_updates”: True - 启用坐标变换更新的发布。当坐标变换关系发生变化时,会发布这些更新。

  • “publish_robot_description”: True - 发布机器人的描述信息(URDF)。

  • “publish_robot_description_semantic”: True - 发布机器人的语义描述信息(SRDF)。

这些参数会被传递给MoveIt的move_group节点,用于控制规划场景监控器的行为。规划场景监控器负责维护和更新机器人工作环境的表示,包括机器人的当前状态、环境中的障碍物、以及机器人各部分之间的碰撞关系等。通过启用这些发布选项,系统中的其他组件可以实时获取到最新的环境和机器人状态信息,这对于安全、准确的运动规划至关重要。

配置OctoMap(八叉树地图)和3D传感器

## 配置OctoMap参数和传感器配置
    octomap_config = {'octomap_frame': 'camera_depth_optical_frame', 'octomap_resolution': 0.02}
    octomap_updater_config = load_yaml('ur5e_gripper_moveit_config', 'config/sensors_3d.yaml')  
python

第一行定义了OctoMap的基本配置参数:

  • octomap_frame: 设置了OctoMap的参考坐标系为’camera_depth_optical_frame’,这是深度相机的光学坐标系
  • octomap_resolution: 设置了OctoMap的分辨率为0.02米,即2厘米,这决定了地图的精细程度

第二行通过load_yaml函数加载了sensors_3d.yaml配置文件,该文件内容如下:

sensors:  
  - point_cloud_camera

point_cloud_camera:
    sensor_plugin: occupancy_map_monitor/PointCloudOctomapUpdater
    point_cloud_topic: /depth/points_filtered
    max_range: 5.0
    point_subsample: 1
    padding_offset: 0.05
    padding_scale: 1.0
    max_update_rate: 1.0
    filtered_cloud_topic: filtered_cloud
yaml

这个配置文件定义了3D传感器的相关参数:

  1. sensors: 定义了使用的传感器列表,这里只有一个名为point_cloud_camera的点云相机
  2. point_cloud_camera部分详细配置了点云相机的参数:
    • sensor_plugin: 使用occupancy_map_monitor/PointCloudOctomapUpdater作为传感器插件,用于将点云数据更新到占用地图
    • point_cloud_topic: 指定接收点云数据的话题为/depth/points_filtered
    • max_range: 设置点云数据的最大处理距离为5.0米
    • point_subsample: 点云采样因子为1,即不进行采样
    • padding_offset和padding_scale: 碰撞检测的填充参数,用于在规划时增加安全距离
    • max_update_rate: 最大更新频率为1.0Hz
    • filtered_cloud_topic: 指定发布过滤后点云的话题为filtered_cloud

这些配置参数最终会被传递给MoveIt的move_group节点,用于启用和配置3D感知功能。通过这些配置,MoveIt可以实时接收点云数据,构建环境的3D占用地图(OctoMap),并在运动规划时考虑环境中的障碍物,从而实现更安全、更智能的路径规划。

创建move_group节点

这个代码块创建了一个ROS 2节点,该节点是MoveIt运动规划框架的核心组件。具体解释如下:

  • Node定义:

    • package=“moveit_ros_move_group”: 指定节点所属的ROS包为moveit_ros_move_group
    • executable=“move_group”: 指定要运行的可执行文件为move_group,这是MoveIt的主要入口点
    • output=“screen”: 将节点输出打印到终端屏幕
  • parameters参数列表包含了MoveIt系统运行所需的所有配置信息:

    • robot_description:机器人的URDF描述,包含机器人的物理结构信息
    • robot_description_semantic:机器人的SRDF语义描述,包含规划组、末端执行器等语义信息
    • robot_description_kinematics:运动学求解器配置,指定使用哪种IK算法
    • robot_description_planning:机器人规划相关参数,如关节限制等
    • ompl_planning_pipeline_config:OMPL运动规划管道配置,包括规划算法和适配器设置
    • trajectory_execution:轨迹执行参数,控制轨迹执行的时间和容错设置
    • moveit_controllers:控制器管理配置,指定如何与底层控制器通信
    • planning_scene_monitor_parameters:规划场景监控参数,控制场景信息的发布和更新
    • {“use_sim_time”: use_sim_time}:是否使用仿真时间
    • octomap_config:OctoMap配置,用于3D环境感知
    • octomap_updater_config:OctoMap更新器配置,指定如何从传感器数据更新地图

总结 这个move_group节点是MoveIt系统的核心,它整合了所有的配置信息,提供了以下关键功能:

  1. 运动规划:基于OMPL规划器提供路径规划功能
  2. 运动学计算:提供正向和逆向运动学求解
  3. 碰撞检测:实时检测机器人与环境的碰撞
  4. 轨迹执行:控制机器人按照规划的轨迹执行动作
  5. 3D感知:通过OctoMap处理传感器数据,构建环境地图
  6. 场景管理:维护和更新规划场景信息

通过将所有这些配置参数传递给move_group节点,系统能够完整地运行MoveIt的所有功能,实现复杂的机器人运动规划和控制任务。

ROS2_Moveit2_Ur5e_Grasp项目详解(四):ur5e_gripper_moveit文件详解
http://www.soupcola.top/blog/ros2_blogs/ros2_blogs-4
Author Soup Cola
Published at 2026年2月4日