惯性参数的获取方法:
① 使用V-rep中的rigid body properties中的选项进行自动计算可得(需要知道连杆的质量或者密度)(V-rep中惯性参数的解释),vrep中输出的惯量矩阵需要乘以质量。
URDF中对inertial
属性的定义:
可以看到inertial
的origin
是用来描述惯量参考系与连杆坐标系之间的偏差的,以下图为例介绍URDF中的inertial
属性和V-rep中得到的惯性属性之间的对应关系和转换方法:
左边是URDF文件,右边是导入V-rep后生成的模型,可以看到urdf中的inertial
属性是定义在连杆坐标系下的属性,连杆坐标系通常定义在该连杆父关节坐标系上,而inertial
的origin
属性定义了惯性(质心)坐标系相对连杆坐标系的偏差(即从连杆坐标系到连杆质心坐标系的变换);在V-rep中点击某个物体显示的坐标通常是质心或者几何中心(大部分情况重合)的坐标,而V-rep中显示的Relative to absolute frame
下的惯性矩阵(上图中最右边红圈里)才是URDF中的inertia
属性对应的参数,不过还需要乘以质量,因为V-rep中的这个惯性矩阵除过质量(所以单位是m^2)。因此V-rep和URDF中的inertial
属性参数之间的对应关系如下:
- Vrep中
Relative to absolute frame
下的惯性矩阵乘以连杆质量就可得到URDF中inertial
的inertia
属性; - V-rep中用连杆位置坐标直接减去父关节坐标就可得到
inertial
的origin
的xyz
属性,而rpy
属性通常都是零。。。!!!更精确的做法:由于质心和几何中心并不是完全重合,更精确的做法是使用Relative to absolute frame
下的连杆质心坐标减去父关节坐标从而得到xyz
参数,这样比点击连杆得到的几何中心坐标减去父关节坐标的结果更精确。
PS:以上结论的得到参考如下博客
- V-rep中不同惯性参数的区别:https://www.cnblogs.com/21207-iHome/p/7765508.html
- 极其重要的概念解析–Solidworks中三种不同坐标系下的惯性张量:https://blog.csdn.net/robinvista/article/details/70231205
- V-rep中相对连杆参考系的惯性参数的解释和编程获取方法:http://macro.ppgee.ufmg.br/wiki/index.php?title=VRep:_How_to_get_the_dynamic_parameters_of_the_robots
- Mathematica中机械臂模型的导入和仿真:https://blog.csdn.net/robinvista/article/details/70231205
V-rep中编程获取惯性参数
命令:sim.getShapeMassAndInertia
这个命令获取到的参数还没有和URDF文件中的参数对应起来,重心位置参数正常,惯性矩阵暂且不使用。
PS:
a.urdf中inertial
属性的定义:http://wiki.ros.org/urdf/XML/link
b. 惯性矩阵、惯性张量的区别和联系:https://www.cnblogs.com/21207-iHome/p/7765508.html
c. 惯性矩阵的主对角线元素满足三角不等式:ixx + iyy >= izz, ixx + izz >= iyy and iyy + izz >= ixx
d. 切记V-rep中得到的惯性矩阵是mass-less的(除以过质量),所以需要乘以质量后才能得到我们需要的惯性矩阵。
PS: 为什么需要相对连杆坐标系的惯性参数?
可以看到有三种惯性参数:主轴惯性矩、主惯性距和惯性张量矩阵,前两种是在惯性坐标系(以质心为坐标原点)下的惯性参数,但是在进行正逆运动学解算和控制律设计时通常是以连杆坐标系进行的,所以需要相对连杆坐标系的惯性参数,而连杆坐标系原点通常位于该连杆父关节坐标原点。(参考博客)
②使用Meshlab获取惯性参数
参考文档:http://gazebosim.org/tutorials?tut=inertia&cat=build_robot
- 首先使用Meshlab得到每个连杆的体积参数:Filters->Quality Measure and Computations->Compute Geometric Measures。
- 机械臂官方文档可查到总质量,根据各连杆的体积可以得到各连杆的质量,然后将质量填入V-rep的动力学参数框,按照方法①进行操作,即可得到惯性矩阵参数。
PS:
- 出现“Mesh is not ‘watertight’, no information on volume, barycenter and inertia tensor”的问题—当前使用meshlab版本是2016版本。
解决办法:安装2020.03版本的meshlab(安装新版本前一定要手动卸载旧版本,否则新版本无法正常运行),出现这个问题的原因可能是stl文件中的模型太精细,无法进行体积计算,这时候可以先将stl中的模型转换为凸包模型,然后计算出凸包模型的体积来近似原模型的体积。转换凸包模型:Filters->Remeshing, Simplification and Reconstrcution->Convex Hull,然后在计算体积和惯性参数:Filters->Quality Measure and Computations->Compute Geometric Measures,然后就可以得到体积参数。 - 此处使用Meshlab仅仅用来计算连杆的体积参数,从而根据体积分布得到各连杆的质量,然后通过V-rep得到最终的惯性矩阵参数。。。Meshlab中得到的惯性矩阵并不是我们需要的惯性矩阵,因为一方面Meshlab默认密度为1,而且其惯性矩阵是相对惯性参考系得到的,并不是相对连杆坐标系得到的。
- 缩放stl模型之后的惯性参数:https://answers.ros.org/question/237421/calculating-inertial-matrix-for-gazebo/
- 切记V-rep中得到的惯性矩阵是mass-less的(除以过质量),所以需要乘以质量后才能得到我们需要的惯性矩阵。