当前位置: 首页 > news >正文

(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...

 

http://www.lryc.cn/news/582131.html

相关文章:

  • 多通道采发仪VS系列 智能监测终端 工业级采发仪精准守护隧道边坡、水利大坝
  • 【Echarts】“折线+柱状”实现双图表-家庭用电量可视化【文章附完整代码】
  • 【SigNoz部署安装】Ubuntu环境部署SigNoz:Docker容器化监控的全流程指南
  • 御控网关如何实现MQTT、MODBUS、OPCUA、SQL、HTTP之间协议转换
  • HTTP 重定向
  • Camera相机人脸识别系列专题分析之十六:人脸特征检测FFD算法之libcvface_api.so数据结构详细注释解析
  • C++ -- string类的模拟实现
  • Day07- 管理并发和并行挑战:竞争条件和死锁
  • 【AI大模型入门指南】机器学习入门详解
  • 烟雾,火焰探测器
  • Linux操作系统:软硬链接与动静态库
  • ClickHouse介绍与应用
  • 迁移GitLab,在新Linux中用Docker重新部署GitLab备份还原
  • C#中的BindingList有什么作用?
  • 【机器学习深度学习】多分类评估策略:混淆矩阵计算场景模拟示例
  • 亚马逊运营进阶指南:如何用AI工具赋能广告运营
  • 诊断工程师进阶篇 --- 车载诊断怎么与时俱进?
  • English Practice - Day 2
  • vite打包的简单配置
  • react状态管理库 - zustand
  • 风电自动化发电中的通信桥梁:CAN主站转MODBUS TCP网关解析
  • 【MyBatis】MyBatis与Spring和Spring Boot整合原理
  • 5种方法将联系人从iPhone转移到OnePlus
  • C++--map和set的使用
  • 仿mudou库one thread oneloop式并发服务器
  • 达梦数据库的信息查询
  • Redisson 分布式锁原理解析
  • Navicat Premium可视化工具使用查询控制台优化SQL语句
  • 商品中心—库存分桶高并发的优化文档
  • 力扣 3258 统计满足 K 约束的子字符串数量 I 题解