(4)ROS2:moveit2的几个坑
前言
上个月学moveit2的时候,遇到了几个官方没有明说,卡了我好久的坑,这里记录一下
1. MTC中Connect阶段GroupPlanner关节组要求
MTC(moveit task constructor)中Connect阶段用于链接前后两个任务阶段,并根据传入的求解器类型自动规划轨迹,这个过程中,官方有其中一段给出的案例是这样:
{ //创建一个连接阶段,连接抓取阶段和放置阶段auto stage_move_to_place = std::make_unique<mtc::stages::Connect>("move to place",mtc::stages::Connect::GroupPlannerVector{{arm_group_name, sampling_planner},{gripper_group_name, sampling_planner}});stage_move_to_place->setTimeout(10.0); // 设置超时时间为10秒stage_move_to_place->properties().configureInitFrom(mtc::Stage::PARENT);task.add(std::move(stage_move_to_place)); // 将移动到放置位置阶段添加到任务中}
由于我用的是自定义的模型而不是官方给的demo,运行时反复报错:
robot_trajectory::RobotTrajectory requiring a JointModelGroup for construction.
这是因为mtc::stages::Connect::GroupPlannerVector在connect阶段求解时,会把传入的{arm_group_name, sampling_planner},{gripper_group_name, sampling_planner}当成一个完整的向量组,所以这时候在srdf中单纯定义了arm_group_name和gripper_group_name是不够的,mtc需要一个完整的包含这两个组的group来执行命令,所以需要在srdf中加入:
<group name = "manipulator_gripper"><group name = "arm"/><group name = "gripper"/>
</group>
命名甚至都不重要,会自动调用。
2. 末端执行器定义
说来简单,就是在srdf中把末端关节声明为end_effector, 在mtc中用到的比较频繁
<end_effector name="gripper" parent_link="tool_link" group="gripper"/>
3. moveit规划执行超时
[move_group-10] [WARN] [1751878404.741713873] [moveit.simple_controller_manager.follow_joint_trajectory_controller_handle]: waitForExecution timed out
[move_group-10] [ERROR] [1751878404.741782089] [moveit_ros.trajectory_execution_manager]: Controller is taking too long to execute trajectory (the expected upper bound for the trajectory execution was 2.649222 seconds). Stopping trajectory.
对于非位置控制的控制器,使用各种规划器时都可能遇到如上的报错,根本原因是机器人没有在规划时间范围内到达指定位置,这时可以需要在moveit_controllers.yaml中增加宽放,注意其缩进为头部缩进,即无缩进,不在任何词条下
trajectory_execution:allowed_execution_duration_scaling: 4.0 # 允许的执行时间缩放比例,比如规划器要求1.0s, 如此设置允许最多执行1.0x4.0时间长度allowed_goal_duration_margin: 1.0 # 允许的目标持续时间边距,比如规划器要求1.0s,如此设置允许执行最多执行1.0+1.0sallowed_start_tolerance: 0.05 # 关节位置的容差,比如目标位置为1.0rad,如此设置允许在1.0+-0.05rad范围内判定执行成功trajectory_duration_monitoring: true
4. 关节丢失/模型读取失败
这个绝对是最坑的,当更改了urdf以及各urdf中相对应的关节命名时,再运行gazebo、moveit有一定概率会报错“jointxx not found in ....",打印ros control list_hardware_interface也缺少这个关节接口,我遇到的有两种原因:
1. 当使用预制的gazebo world环境时必然存在,需要在.world文件中,把其中模型部分对应的joint名称也纠正过来;
2. 关闭程序,检查ros node list, 确认是不是有robot_publisher、robot_description卡在后台没有退出,有的话是因为卡住的模型信息被新的程序误读旧模型导致问题
5. chomp/ompl规划器冲突
这个问题遇到的人可能比较少,表现为MotionPlanning的Context部分,当使用yaml文件设置规划器使用ompl时,规划器Planning Library绿色字体显示CHOMP,而下拉选项这里是ompl(图中是对的,错误情况下绿色字体为CHOMP),导致无法规划非关节空间轨迹
原因是我装了两版moveit2,一版为源码,一版为debug时不经意的binary安装,导致即使使用yaml文件定义了ompl_controllers.yaml后,源码中的chomp planner还在生效,解决办法是
cd /home/<your_usrname>/moveit2/src // cd到源码路径下
find . -name "*chomp*" -type d // 找到chomp相关文件
输出如下:
./moveit2/moveit_planners/chomp
./moveit2/moveit_planners/chomp/chomp_optimizer_adapter
./moveit2/moveit_planners/chomp/chomp_interface
./moveit2/moveit_planners/chomp/chomp_interface/include/chomp_interface
./moveit2/moveit_planners/chomp/chomp_motion_planner
./moveit2/moveit_planners/chomp/chomp_motion_planner/include/chomp_motion_plannercd /home/<your_usrname>/moveit2/install //cd到源码路径的install文件夹下
//临时ban掉源码路径的chomp规划器
mv chomp_motion_planner chomp_motion_planner.disabled
mv moveit_chomp_optimizer_adapter moveit_chomp_optimizer_adapter.disabled
mv moveit_planners_chomp moveit_planners_chomp.disabled
6. gazebo的joint_mimic误导moveit解决
这个遇到的可能比较多,即如果使用了mimic词条定义从动关节,gazebo会自动在这个关节的关节名后加一个_mimic,比如夹爪的joint8,设置为mimic joint7时,gazebo启动后投射出的接口名就变成了joint8_mimic_position/velocity/effort/...,但moveit读取时就会找joint8_mimic,但我们定义的名字是joint8,会报错"joint8_mimic not found.......",这时建议:
1. 定义一个dummy的joint8_mimic,相当于舍弃对joint8的控制,反正它会自动mimic joint7
<joint name="joint8_mimic" type="fixed"><parent link="world" /><child link="random" /></joint>
2. 直接不用mimic定义,因为在非位置控制尤其是力控时,因为上面的方式取消了对joint8的主动控制,而gazebo这时在物理表现上并不会让joint8模仿joint7,而是成为了一个自由关节,所以不如直接控制,并在控制起中令两个关节每轮循环收到的值相等。
7. RVIZ/MOVEIT轨迹显示bug?
表现为不显示机器人实体的轨迹动画,实际是当State Display Time设置为1x或者其他倍数时,轨迹极快导致看起来像是没有显示,但打印轨迹发现时间正常,执行起来也没有异常
我是直接把State Display Time设置为固定时间让其显示解决的,查了很久没有发现原因,Claude说是显示bug
结语
暂时先写这么多,实际上坑更多,但总归感谢Claude...