Find out inertial parameters

对于该模型的物理上合理的行为,你需要去正确的设置惯性矩阵,质量中心和所有链接links的重量。如果你没有他们(3D模型的链接),本教程将通过获得和填写信息来引导你。

本教程将展示怎样通过MeshLab(假设君子体)来获取惯性数据。你也可以用商业软件solidworks来计算他们的信息。如何使用soildworks,请参考this question on answers.ros.org

Preparation

Installing MeshLab

从官网上下载MeshLab软件,安装到你的电脑上,安装应该是很简单。

当安装上之后,你可以查看MeshLab(DAE和STL格式都支持,Gazebo/ROS也支持)。

Computing the inertial parameters

First try in MeshLab

为了计算惯量参数,你首先需要显示 图层对话框View->ShowLayer Dialog,窗口右侧有一个小组被打开,我们对其下册的部分感兴趣。

接下来,计算惯性参数。选择Filters->QualityMeasure andComputations->ComputeGeometric Measures。从图形对话框的下部应该看到关于惯性测量的一些数据。

Mesh Bounding Box Size 0.044000 0.221000 0.388410
Mesh Bounding Box Diag 0.449043 
Mesh Volume is 0.001576
Mesh Surface is 0.136169
Thin shell barycenter -0.021954 0.008976 0.012835
Center of Mass is -0.021993 0.001259 0.001489
Inertia Tensor is :
| 0.000008 -0.000000 -0.000000 |
| -0.000000 0.000001 -0.000000 |
| -0.000000 -0.000000 0.000007 |
Principal axes are :
| 0.999999 0.000166 0.001241 |
| -0.000113 0.999104 -0.042310 |
| -0.001247 0.042310 0.999104 |
axis momenta are :
| 0.000008 0.000001 0.000007 |
好像我们得到了想要的东西。但是,当你仔细看的时候,你会看到一个错误的东西--输出的最多只是六位小数。其结果是我们失去了惯性张量的有价值的信息。

现在,来解释MeshLab输出的意义。在MeshLab中,无法告诉模型的质量。因此MeshLab不得不用其他地方的质量来代替。在这种情况下,模型的体积大小(假设材料的单元密度)是十分有意义的。Mesh Volume存在于text output。

Getting the Center of Mass

MeshLab并不是用相同的长度单元。然而,你可以通过查看 Mesh Bounding Box Size,很容易的告诉MeshLab你所需要的MeshLab分辨。你可以以你自己的单元来计算边界框的尺寸,和MeshLab的进行比较。

Getting the Inertia Tensor

在text output中,如何解决惯性张量精度低的问题?你可以扩展模型,以使它数字增长足够大,而不会被裁剪。该模型可以用Filters->Normals, Curvatures and Orientation->Transform: Scale来标定。

Filling in the tags in URDF/SDF

下一步是记录包含你的机器人的URDF/SDF文件的计算值。

在每个链接中,你应该有<inertial>标记。SDF将如下形式:

<link name='antenna'>
  <inertial>
    <pose>-0.022 0.0203 0.02917 0 -0 0</pose>
    <mass>0.56</mass>
    <inertia>
      <ixx>0.004878</ixx>
      <ixy>-6.2341e-07</ixy>
      <ixz>-7.4538e-07</ixz>
      <iyy>0.00090164</iyy>
      <iyz>-0.00014394</iyz>
      <izz>0.0042946</izz>
    </inertia>
  </inertial>
  <collision name='antenna_collision'>
    ...
  </collision>
  <visual name='antenna_visual'>
    ...
  </visual>
  ...
</link> 

或者在URDF中:

<link name="antenna">
  <inertial>
    <origin rpy="0 0 0" xyz="-0.022 0.0203 0.02917"/>
    <mass value="0.56"/>
    <inertia ixx="0.004878" ixy="-6.2341e-07" ixz="-7.4538e-07" iyy="0.00090164" iyz="-0.00014394" izz="0.0042946"/>
  </inertial>
  <visual>
    ...
  </visual>
  <collision>
    ...
  </collision>
</link>

<mass>以千克为单位。

<origin>或者<pose>用于质量中心位置。旋转单元将被忽略。如果你已经找到质心,填写值;否则,填写MeshLab计算的正确值。

 <inertia>标记包含在上部你你计算的惯性张量。因为矩阵是对称的,紧要6个数字来表示。从MeshLab中获得的输出映射如下:

| ixx ixy ixz |
| ixy iyy iyz |
| ixz iyz izz |

Checking in Gazebo

查看是否正确,你可以用gazebo中的界面。我们运行:

roslaunch gazebo_ros empty_world.launch



你可能感兴趣的:(Find out inertial parameters)