1.前言

之前一直在使用Pybullet作为机械臂的仿真平台,感觉Pybullet相对于像本人这样的强化学习初学小白比较友好,简单易上手,说明文档也写得挺详细。最主要就是,它免费开源(还得是白嫖香啊ヾ( ˘ ³˘人)ヾ.......)。

一般要进行模型仿真的话,我就会先从SolidWorks这边通过sw2urdf插件(插件干啥用和怎么用可以看看简书的这篇Solidworks导出URDF模型:SW2URDF插件),导出urdf文件,之后在Pybullet中利用其loadURDF()函数加载进Pybullet中,即可丝滑地进行模型仿真(✪ω✪)。

ur5机械臂逆解python_机器人

但最近这套丝滑小连招在解决闭链结构的机械臂时直接失效散架了。。。遇到都遇到了,总不能直接摆烂吧,于是我开始了下面的一系列过程。

2.解决过程2.1 URDF与SDF

本着面向百度编程的原则,我第一时间去了度娘找答案,在排除建系错误的可能后,我发现了导致模型导入后直接散架的原因:URDF本身只支持开环结构的机器人模型,至于闭环结构的机器人,URDF无能为力。(关于开环和闭环结构,可以看看这篇URDF学习(一)什么是URDF以及怎么理解一个URDF文件)

ur5机械臂逆解python_ur5机械臂逆解python_02

额.....URDF不支持的话,总有其他格式能支持吧.......果不其然,度娘抛出了另一个答案:SDF格式。(SDF与URDF的看这篇【ROS-Gazebo】为什么选择SDF?)

我以为这回必解决了,但是很快又找到一篇帖子给了我一棒:使用Gazebo和ROS2仿真闭环机器人

ur5机械臂逆解python_机械臂_03

难绷.........

2.2 Pybullet的loadSDF函数

于是我又把查找方向放到Pybullet的 官方说明文档上,结果发现人家Pybullet本身就有loadSDF()函数用来加载SDF文件。

ur5机械臂逆解python_加载_04

我立即把Solidworks生成的urdf文件通过这篇文章【ROS-Gazebo】SDF与URDF的相互转换给出的命令将其转为SDF文件。

ur5机械臂逆解python_ur5机械臂逆解python_05

gz sdf -p my_model.urdf > my_model.sdf

然后导入Pybullet,结果还是散架了(实验室的模型,图没法放)........ 

再去一查百度,发现知乎上有个老哥也遇到了同样的问题,并且最后还解决了:[双足机器人]pybullet单足仿真-解决机器人中存在闭链机构的问题

文章里说Pybullet不论使用的是loadURDF、loadSDF还是loadMJCF,导入的时候只要你是闭链结构的,一律给你拆成开环,没得商量.......

ur5机械臂逆解python_ur5机械臂逆解python_06

但Pybullet为了解决这个问题,也提供了一定的“曲线”补救措施,即上图这个createConstrant()函数。该函数的作用是给两个Link之间添加一个约束,从而间接地实现闭环结构的运动仿真。

啧,怎么说呢,函数是好函数,就是里面的两个参数有点难求,parentFramePosition和childFramePosition。

ur5机械臂逆解python_机械臂_07

2.3 parentFramePosition和childFramePosition参数的求法

按照知乎老哥的做法,要通过Solidworks手算这两参数,但是我那个模型关系有点复杂,算着算着我就弄混了,有点费时费力。然后我又在CSDN上发现了另一篇文章pybullet构建闭环结构笔记,其提供了一个很好的计算方法,方法如下图:

ur5机械臂逆解python_ur5机械臂逆解python_08

图中点14为我们的约束点,t_f_b坐标系为该link的URDF坐标系,然后直接用约束点的坐标无脑减重心就能出结果,芜湖方便快捷!!!

注:Link的URDF坐标系与其质心(COM)坐标系之间的关系参考下图:

ur5机械臂逆解python_加载_09

计算并设置好这两个参数后并没有结束,要记得将非驱动关节的控制方式设为速度控制模式,即VELOCITY_CONTROL,然后速度设置为零(其实我感觉速度和force都可以不为零)。

之后驱动驱动关节(驱动关节的模式没有限制,可以是VELOCITY_CONTROL也可以是POSITION_CONTROL),芜湖,就能成功了!!!!

(实验室的图没法放。。。,参考一下知乎老哥的图吧)

ur5机械臂逆解python_机械臂_10

3.总结

虽然Pybullet一定程度上解决了闭链机器人仿真的问题,但是我感觉其在闭链机器人的仿真上还是不如mujoco(DeepMind买了下来,现在已经可以白嫖,而且最新版已经支持pip install mujoco命令直接安装,不用再整那些花里胡哨的许可证书了)和V-rep(可以用EDU版,功能和付费差不多,就是仿真的时候界面底下会一直显示一个大大的“EDU”字样.......)支持的更好。尤其是我后期的仿真还有可能要加上绳子这样柔性介质的仿真,而Pybullet直接就没办法了,只能用mujoco或V-rep,还是存在一定的局限性。但同时也不能忽视Pybullet的简单易用性,其对新手初学者确实是一个不错的选择。