对于该模型的物理上合理的行为,你需要去正确的设置惯性矩阵,质量中心和所有链接links的重量。如果你没有他们(3D模型的链接),本教程将通过获得和填写信息来引导你。
本教程将展示怎样通过MeshLab(假设君子体)来获取惯性数据。你也可以用商业软件solidworks来计算他们的信息。如何使用soildworks,请参考this question on answers.ros.org
从官网上下载MeshLab软件,安装到你的电脑上,安装应该是很简单。
当安装上之后,你可以查看MeshLab(DAE和STL格式都支持,Gazebo/ROS也支持)。
图层对话框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。
Mesh Bounding Box Size
,很容易的告诉MeshLab你所需要的MeshLab分辨。你可以以你自己的单元来计算边界框的尺寸,和MeshLab的进行比较。
在每个链接中,你应该有<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>
<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>
<origin>或者<pose>用于质量中心位置。旋转单元将被忽略。如果你已经找到质心,填写值;否则,填写MeshLab计算的正确值。
<inertia>标记包含在上部你你计算的惯性张量。因为矩阵是对称的,紧要6个数字来表示。从MeshLab中获得的输出映射如下:
| ixx ixy ixz | | ixy iyy iyz | | ixz iyz izz |
查看是否正确,你可以用gazebo中的界面。我们运行:
roslaunch gazebo_ros empty_world.launch