9、教程-6 第一个PROTO文件

发布时间 2023-07-27 22:35:23作者: gary_123

本教程的目的是创建与上一教程中的四轮机器人相对应的PROTO文件。

目前,机器人的定义完全包含在世界文件中。在PROTO文件中移动此定义将允许您使用此机器人,而无需完全复制和粘贴其定义(在同一世界或不同世界中多次)。

在您喜欢的文本编辑器中打开上一教程中创建的世界4_wheels_robot.wbt。在项目的protos文件夹中创建一个新的空文本文件,名为FourWheelsRobot.proto,并在文本编辑器中打开该文件,该文件将包含机器人的定义。

任何PROTO文件至少应遵循以下结构:

#VRML_SIM R2023b utf8
PROTO protoName [
  protoFields
]
{
  protoBody
}

protoName应该是PROTO文件的名称(即本例中的FourWheelsRobot),protoFields定义PROTO节点的可修改字段(该部分目前应为空),protoBody是根节点的定义(即本案中的Robot节点)。

使用正确的protoName在PROTO文件中写入此默认结构。从4_wheels_robot.wbt世界文件复制robot节点(以robot{开始,以final}结束),并将其粘贴到PROTO文件中,而不是protoBody中。最后,保存PROTO文件。

  #VRML_SIM R2023b utf8
  PROTO FourWheelsRobot [

  ]
  {
    Robot {
      # list of fields
    }
  }

使用PROTO节点

这个新的PROTO节点现在可用于当前项目中的每个世界。

在Webots中打开4_wheels_robot.wbt世界,然后添加FourWheelsRobot节点(您刚刚定义的)。该节点位于PROTO节点(当前项目)/ForWheelsRobot(机器人)中。

应该在与现有机器人完全相同的位置添加第二个4轮机器人。

增加域

正如您可能注意到的,这个新的PROTO节点没有任何开放字段,因此不可能平移、旋转或更改控制器。将新字段添加到PROTO节点并将其与内部字段链接是非常容易的。这应该在PROTO接口部分([和]之间的部分)中完成。

在文本编辑器中编辑PROTO文件,并在PROTO接口部分添加平移、旋转和bodyMass字段的定义:

 field SFVec3f    translation  0 0 0
  field SFRotation rotation     0 0 1 0
  field SFFloat    bodyMass     1

您的PROTO节点现在有两个打开的字段,但它们没有链接到任何内部字段。要链接应使用IS关键字的字段,只需将Robot节点的平移x y z和旋转x y z角度字段替换为:

 translation IS translation
  rotation IS rotation

和机器人节点的物理节点的质量域通过:

  mass IS bodyMass

保存PROTO文件

#VRML_SIM R2023b utf8
PROTO FourWheelsRobot [
  field SFVec3f    translation  0 0 0
  field SFRotation rotation     0 0 1 0
  field SFFloat    bodyMass     1
]
{
  Robot {
    translation IS translation
    rotation IS rotation
    children [
      # list of children nodes
    ]
    boundingObject USE BODY
    physics Physics {
      density -1
      mass IS bodyMass
    }
    controller "four_wheels_collision_avoidance"
  }
}

现在,您可以将模拟保存在Webots中并进行还原。FourWheelsRobot节点的平移、旋转和bodyMass现在可以更改(在场景树中或使用三维视图中的控制柄)。
同样的机制也可以用于暴露机器人节点的控制器字段。