用moveit配置完dubot_magician机械臂之后,我运行roslaunch my_magician3 gazebo.launch将机械臂加载到gazebo世界里面,发现机械臂出现了疯狂抖动:
搞了很久也没有搞明白,后来请教师兄,得知原因如下:
我刚开始的gazebo.launch文件中代码是这样写的
圈1的代码是将机械臂模型加载到世界坐标系中的相应位置(x,y,z):
我在这里将其设置为(0,0,0).
而重要的一点是:gazebo加载出来的模型具有碰撞属性,如果一个可动的部分与其他物体发生碰撞,那么它就会把它弹开。而发生碰撞,就是说两个物体重合了:二者坐标相近或者相等,造成体积有重合,进而发生碰撞。
看各个部分坐标,就要看urdf文件,那么我的urdf文件如下:
图没有截全,但上下两图连起来是连贯的。
我画圈的部分是magician_origin_joint1的坐标,可以看到它的父连杆是magician_origin,子连杆是magician_base,它相对于父连杆magician_origin的位置是(x,y,z)=(0,0,-0.139)就意味着在magician_origin下方0.139,而magician_origin和大地相连,坐标为(0,0,0),那么就意味着magician_origin_joint1和大地发生了碰撞,所以会“拼命”把它弹开(或许是互相弹开),所以会出现不断疯狂抖动的情况。
那么解决办法如下:
将gazebo.launch中的圈2中的z坐标改成大于0.139即可,因为gazebo会按照urdf的顺序来加载模型,那么先加载world,再加载origin,然后magician_origin_joint1。。。。一直加载到结尾,那么只要保证机械臂的所有部分都高于地面,不和地面发生碰撞即可。
题外话:
无论是launch文件还是urdf文件,它们都是xml文件,按照行的顺序执行,也可以看一看xml文件相关的。