Webots:RHex仿真平台搭建——(二)给不规则腿部设置boundingObject

将模型导入成功之后点击启动仿真,模型并不会有任何变化,给整个机器人添加physics,点击启动仿真,机器人直接穿过地面掉落,原因是没有对腿部添加boundingObject。一般在直接使用Webots自带的几何形状构建模型时,添加boundingObject只需要选择相同的几何形状即可,但是由于我们的腿部是自己导入的,因此不能使用这种方法。接下来介绍两种为导入的不规则模型添加boundingObject的方法。

方法一:通过给shape命名的方法直接use已有的几何信息

展开在HingeJoint的endPoint节点处导入的leg,找到children的最下级Shape,将其命名为leg。
在这里插入图片描述
命名完成后双击该endPoint节点下的任一boundingObject,选择use,选择刚命名的leg,点击添加即可。

在这里插入图片描述
该方法极为简单,唯一可能出现的麻烦就是分级太多,不知道给哪个节点命名是可以直接使用的几何信息。此处给出一些提示:
1. 能直接USE作为boundingObject的几何信息一般为Shape节点。因此,找到最底层的Shape节点给其命名即可。
2. 无法确定是哪个需要的节点,可以随手给所有的可命名节点命名。

方法二:自定义boundingObject的PROTO节点

双击boundingObject NULL添加boundingObject节点时可以看到Webots Projects中提供了一些节点,其中有一个十分简单的矩形平面可以作为boundingObject。
在这里插入图片描述
打开Webots按照目录D:\Program Files\Webots\projects\objects\geometries\protos可以看到一个文件Rectangle.proto,使用记事本打开,可以看到如下代码

#VRML_SIM R2020a utf8
# license: Apache License 2.0
# license url: http://www.apache.org/licenses/LICENSE-2.0
# tags: static
# Single/double sided and adjustable rectangle shape.

PROTO Rectangle [
  field SFVec2f size        0.1 0.1  # Defines the size of the rectangle shape.
  field SFBool  doubleSided TRUE     # Defines whether the shape has two sides or not.
]
{
  %{
    -- Size verification
    if fields.size.value.x < 0 or fields.size.value.y < 0 then
      print('The rectangle size should be strictly positive')
    end

    -- Parameters transformation
    -- Convention from https://www.cyberbotics.com/doc/reference/imagetexture
    -- (s0,t0) = bottom left => (s1,t1) = top right
    s1 = fields.size.value.x/2.0
    s0 = -s1
    t1 = fields.size.value.y/2.0
    t0 = -t1
  }%

  IndexedFaceSet {
    coord Coordinate {
      point [
        %{=s0}% %{=t0}% 0
        %{=s1}% %{=t0}% 0
        %{=s1}% %{=t1}% 0
        %{=s0}% %{=t1}% 0
      ]
    }
    texCoord TextureCoordinate {
      point [
        0 0
        1 0
        1 1
        0 1
      ]
    }
    coordIndex [
      0,  1, 2, -1, 0,  2, 3, -1,
      %{ if fields.doubleSided.value then}%
        2, 1, 0, -1, 3,  2, 0, -1
      %{ end }%
    ]
    texCoordIndex [
      0,  1, 2, -1, 0,  2, 3, -1,
      %{ if fields.doubleSided.value then}%
        3, 0, 1, -1, 2, 3, 1, -1
      %{ end }%
    ]
  }
}

删除其中的部分代码进行测试,发现对其能否作为boundingObject的关键影响参数为IndexedFaceSet 中的相关参数,其实在选择boundingObject界面也有所体现
在这里插入图片描述

在知道了boundingObject的PROTO文件的核心参数之后,找到之前保存的leg.wbo,用记事本打开,可以看到该文件中也保存有IndexedFaceSet信息,把这部分复制下来,创建一个文本文档,将其名称和拓展名改为leg.proto。

PROTO leg [

]
{

  IndexedFaceSet {
    coord Coordinate {
point [
 -0.015000 0.000000 -0.013000, -0.015000 0.000000 0.013000, -0.014665 0.004345 -0.013000, -0.014665 0.004345 0.013000, -0.014500 -0.003842 -0.013000,
 -0.014500 -0.003842 0.013000, -0.013815 0.007624 -0.013000, -0.013815 0.007624 0.013000, 
 ···
 ···
 ···
 0.089507 -0.082408 -0.013000, 0.089507 -0.082408 0.013000, 0.089507 -0.063592 -0.013000, 0.089507 -0.063592 0.013000, 0.090000 -0.073000 -0.013000,
 0.090000 -0.073000 0.013000
]
}
    coordIndex [
 32, 33, 43, -1, 32, 43, 42, -1, 42, 43, 57, -1,
 42, 57, 56, -1, 56, 57, 67, -1, 56, 67, 66, -1,
···
···
···
 13, 19, 45, -1, 45, 19, 23, -1, 45, 23, 37, -1,
 37, 23, 35, -1
]
  }
}

将创建的leg.proto文件放在工程文件的protos文件夹下
E:\Webots\HexRobot\protos
回到Webots,双击腿部节点下的boundingObject NULL即可在PROTO nodes(Current Project)下看到我们刚创建的boundingObject 节点
在这里插入图片描述
使用该方法:需要特别注意的一点是创建的PROTO对象的名称要与该文件名保持一致,如上述我们创建的PROTO leg [ ··· ] ,对应的要把文件名命名为leg.proto