1.Moveit的主要功能

  • 运动学求解
  • 运动规划
  • 碰撞检测
    在这里插入图片描述

2.Move Group 的具体职责

在这里插入图片描述

Move Group 的工作流程:

输入:目标位姿/关节角度
↓
Move Group 协调:
1. 查询当前状态(从关节状态话题)
2. 检查碰撞(通过规划场景)
3. 调用规划器(如OMPL、CHOMP)
4. 验证轨迹(动力学、碰撞检查)
5. 发送到控制器(轨迹执行)
↓
输出:机器人运动

Move Group 提供的接口:

1. Action 接口:
   - /move_action (主要运动接口)
   - /execute_trajectory (执行轨迹)
   
2. Service 接口:
   - /get_planning_scene
   - /apply_planning_scene
   - /compute_ik
   - /compute_fk
   
3. Topic 接口:
   - /display_planned_path (RViz显示)
   - /planning_scene (环境更新)

系统依赖关系

在这里插入图片描述

在程序运行过程中,Move Group 必须是 Active 状态。

3.Move Group 的内部架构

主要组件:

class MoveGroupCore:
    def __init__(self):
        self.planning_scene_monitor   # 规划场景监控
        self.planning_pipeline        # 规划管道
        self.trajectory_execution     # 轨迹执行
        self.planning_scene_interface # 场景接口
        self.robot_model              # 机器人模型
        self.robot_state              # 机器人状态

数据流图:

用户请求
    ↓
MoveGroup Action Server
    ├──→ 验证请求
    ├──→ 更新规划场景
    ├──→ 调用规划器
    ├──→ 轨迹优化
    ├──→ 碰撞检查
    └──→ 发送到控制器
        ↓
    控制器管理器
        ↓
    Gazebo/Robot

4.Gazebo + MoveIt 集成中的关键作用

实时协调:

# Move Group 在 Gazebo 集成中的关键任务:
1. 同步状态:
   -/joint_states 获取 Gazebo 中的真实位置
   - 更新内部机器人模型

2. 轨迹适配:
   - 将规划轨迹适配到 Gazebo 的控制器接口
   - 处理时间缩放、动力学限制

3. 反馈处理:
   - 监控执行进度
   - 处理执行失败(如碰撞)

控制器管理:

# move_group 的控制器配置:
controller_list:
  - name: arm_controller
    action_ns: follow_joint_trajectory
    type: FollowJointTrajectory
    joints: [joint1, joint2, joint3, joint4, joint5, joint6]

5.完整的启动顺序:

# 正确的启动顺序:
1. 启动 Gazebo
   ros2 launch your_robot_gazebo robot.launch.py

2. 启动 MoveIt(自动启动 move_group)
   ros2 launch your_robot_moveit_config demo.launch.py
   # 这会:
   #   - 加载 move_group 节点
   #   - 配置规划器
   #   - 启动 action 服务器

3. 启动控制器管理器
   ros2 run controller_manager spawner joint_state_broadcaster
   ros2 run controller_manager spawner arm_controller

4. 运行控制代码
   python3 your_control_script.py

6.Move Group 配置详解

配置文件位置:

~/ros2_ws/src/your_robot_moveit_config/config/
├── moveit_controllers.yaml    # 控制器配置
├── ompl_planning.yaml        # OMPL规划器配置
├── kinematics.yaml           # 运动学配置
├── joint_limits.yaml         # 关节限制
└── sensors_3d.yaml          # 传感器配置

关键参数:

# move_group 的核心参数
move_group:
  # 规划组
  planning_groups:
    arm:  # 规划组名称
      default_planner_config: RRTConnect
      
  # 轨迹执行
  trajectory_execution:
    execution_duration_monitoring: true
    allowed_execution_duration_scaling: 1.2
    allowed_goal_duration_margin: 0.5
    
  # 规划场景
  planning_scene_monitor:
    publish_planning_scene: true
    publish_geometry_updates: true
    publish_state_updates: true
    publish_transforms_updates: true

7.等待 Move Group 就绪:

import rclpy
from rclpy.node import Node
from rclpy.action import ActionClient
from moveit_msgs.action import MoveGroup

class RobotController(Node):
   def __init__(self):
       super().__init__('robot_controller')
       
       # 创建 Action 客户端
       self.move_action_client = ActionClient(
           self, 
           MoveGroup, 
           'move_action'
       )
       
       # 等待 Move Group 就绪(关键!)
       self.wait_for_move_group()
   
   def wait_for_move_group(self):
       """等待 Move Group 变为 active"""
       self.get_logger().info('等待 Move Group...')
       
       # 方法1:等待 action 服务器
       if not self.move_action_client.wait_for_server(timeout_sec=10.0):
           self.get_logger().error('Move Group 未启动!')
           return False
       
       # 方法2:检查话题(可选)
       # from rclpy.wait_for_message import wait_for_message
       # try:
       #     wait_for_message('/move_group/status', 
       #                      rclpy.duration.Duration(seconds=5))
       # except:
       #     self.get_logger().warning('未收到 Move Group 状态')
       
       self.get_logger().info('Move Group 已就绪')
       return True
Logo

脑启社区是一个专注类脑智能领域的开发者社区。欢迎加入社区,共建类脑智能生态。社区为开发者提供了丰富的开源类脑工具软件、类脑算法模型及数据集、类脑知识库、类脑技术培训课程以及类脑应用案例等资源。

更多推荐