在使用ROS2的MoveIt2进行机器人运动规划并与Gazebo仿真环境集成时,开发者有时会遇到一个典型问题:运动规划(Plan)可以成功完成,但在执行(Execute)轨迹时却失败。
问题现象与日志分析
从问题日志中,我们可以清晰地看到整个流程的分界点:
- 规划阶段成功:
move_group节点成功接收到规划请求,并通过OMPL规划器(RRTConnect)生成了轨迹。日志显示“Motion plan was computed successfully.”,规划耗时约0.016秒。
- 执行阶段失败:当尝试执行规划好的轨迹时,系统报告了致命错误。关键错误信息如下:
[move_group-4] [ERROR] [1764669186.021168135] [moveit.simple_controller_manager.follow_joint_trajectory_controller_handle]: Action client not connected to action server: arm_controller/follow_joint_trajectory
这条错误明确指出,MoveIt的简单控制器管理器(moveit_simple_controller_manager)尝试向名为 arm_controller/follow_joint_trajectory 的Action服务器发送轨迹,但其Action客户端并未成功连接到该服务器,导致轨迹发送失败,整个执行过程被中止(ABORTED)。
关键配置文件检查
问题通常指向MoveIt2与Gazebo(或真实控制器)之间的桥梁——控制器配置。根据提供的配置文件,我们需要检查两个核心文件:
1. moveit_controllers.yaml
此文件负责配置MoveIt2侧的控制器管理器。
# moveit_controllers.yaml
# MoveIt uses this configuration for controller management
moveit_controller_manager: moveit_simple_controller_manager/MoveItSimpleControllerManager
moveit_simple_controller_manager:
controller_names:
- arm_controller
arm_controller:
type: FollowJointTrajectory
action_ns: follow_joint_trajectory
配置表明,MoveIt期望通过一个名为 arm_controller 的控制器来执行轨迹,其类型为 FollowJointTrajectory,并且它将尝试连接到名为 arm_controller/follow_joint_trajectory 的Action服务。
2. kinematics.yaml
此文件配置运动学求解器,虽然与本次控制器连接问题无直接关联,但其配置的合理性影响规划。
# kinematics.yaml
arm:
kinematics_solver: kdl_kinematics_plugin/KDLKinematicsPlugin
kinematics_solver_search_resolution: 0.005
kinematics_solver_timeout: 0.005
根本原因与解决方案
日志错误 Action client not connected to action server 的核心原因是:在ROS2系统中,名为 arm_controller/follow_joint_trajectory 的Action服务器并未被启动,或者MoveIt2节点无法发现它。
这通常是由于Gazebo仿真环境或机器人描述文件(URDF)中控制器配置缺失或不匹配导致的。在ROS2的机器人控制系统架构中,控制器通常由机器人硬件抽象层或仿真器加载和管理。
解决步骤:
- 确保Gazebo加载了控制器:检查您的Gazebo启动文件或世界文件,确认它正确加载并启动了名为
arm_controller 的ROS2控制器。这通常需要在URDF的<ros2_control>标签内正确定义控制器,并在Launch文件中使用controller_manager spawner来启动它。
- 验证Action服务器名称:使用
ros2 action list命令在终端中查看当前活跃的Action服务器列表。确认是否存在 /arm_controller/follow_joint_trajectory(或命名空间可能不同)。如果不存在,则证明控制器未启动。
- 检查控制器类型匹配:确保Gazebo中启动的控制器类型也是
FollowJointTrajectory,并且其控制的关节组(Joint Names)与MoveIt规划组中的关节完全一致。
- 核对命名空间:检查MoveIt2配置中的
action_ns与Gazebo控制器实际发布的Action话题名称是否完全匹配。有时需要添加或移除全局命名空间(/)。
当Gazebo中的控制器正确启动后,MoveIt2的moveit_simple_controller_manager才能成功建立Action客户端连接,从而将规划好的轨迹发送给仿真环境中的机器人执行,完成从规划到执行的闭环。
|