☰

教程 7:你的第一个 PROTO(20 分钟)

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

复制机器人定义

目前,机器人的定义完全包含在场景文件(world file)中。 将该定义移到一个 PROTO 文件中,将使你在不使用此机器人时不必完整地复制粘贴其定义(无论是在同一个场景中多次使用,还是在不同场景中使用)。

动手实践 #1:在你最喜欢的文本编辑器中打开上一个教程创建的 4_wheels_robot.wbt 场景文件。 在项目的 protos 文件夹中新建一个名为 FourWheelsRobot.proto 的空文本文件,并在文本编辑器中打开此文件,该文件将包含你的机器人定义。

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

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

protoName 应为 PROTO 文件的名称(本例中即 FourWheelsRobot),protoFields 定义 PROTO 节点的可修改字段(此部分暂时应为空),而 protoBody 是根节点的定义(本例中即 [Robot(https://cyberbotics.com/doc/reference/robot) 节点)。

动手实践 #2:在你的 PROTO 文件中以正确的 protoName 写下这个默认结构。 从 4_wheels_robot.wbt 场景文件中复制机器人节点(以 Robot { 开头,以最后的 } 结尾),并将其粘贴到你的 PROTO 文件中,替换 protoBody。 最后,保存 PROTO 文件。

解答:你得到的内容应该类似于这样:

  #VRML_SIM R2025a utf8
  PROTO FourWheelsRobot [

  ]
  {
    Robot {
      # list of fields
    }
  }

使用 PROTO 节点。

这个新的 PROTO 节点现在对你当前项目中的每个场景都可用。

tutorial_proto.png

PROTO 现在在“添加节点”窗口中可见。

动手实践 #3:在 Webots 中打开 4_wheels_robot.wbt 场景,并添加 FourWheelsRobot 节点(即你刚刚定义的节点)。 该节点位于 PROTO nodes (Current Project) / FourWheelsRobot (Robot)。

应该已经在与已存在机器人完全相同的位置添加了第二个四轮机器人。

添加字段

你可能已经注意到,这个新的 PROTO 节点没有任何开放字段,因此无法进行平移、旋转或更换控制器等操作。 向 PROTO 节点添加新字段并将其与内部字段关联起来非常容易。 这应当在 PROTO 接口部分(即 [ 和 ] 之间的部分)中完成。

动手实践 #4:在文本编辑器中编辑你的 PROTO 文件,并在 PROTO 接口部分添加 translation、rotation 和 bodyMass 字段的定义:

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

你的 PROTO 节点现在有了两个开放字段,但它们尚未与任何内部字段关联。 要关联字段,你应该使用 IS 关键字,只需将 [Robot(https://cyberbotics.com/doc/reference/robot) 节点的 translation x y z 和 rotation x y z angle 字段替换为:

  translation IS translation
  rotation IS rotation

并将 [Robot(https://cyberbotics.com/doc/reference/robot) 节点的 [Physics(https://cyberbotics.com/doc/reference/physics) 节点的 mass 字段替换为:

  mass IS bodyMass

保存你的 PROTO 文件,它现在应该如下所示:

#VRML_SIM R2025a 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 节点的 translation、rotation 和 bodyMass 现在可以被修改(无论是在[场景树(the-scene-tree.html)中,还是使用 [3D 视图(the-3d-window.html)中的手柄)。

同样的机制也可以用来暴露 [Robot(https://cyberbotics.com/doc/reference/robot) 节点的 controller 字段。

解答:PROTO 文件

若要将你的 PROTO 文件与解答进行对比,请前往你的文件并找到在[教程 1(tutorial-1-your-first-simulation-in-webots.html)中创建的名为 "my_first_simulation" 的文件夹,然后进入 "protos" 文件夹,用文本编辑器打开正确的 PROTO 文件。

结论

现在你已经能够从在 Webots 中创建的任何节点创建 PROTO 节点。

更具体地说,你学会了如何将节点定义复制到 PROTO 文件中,以及如何开放 PROTO 字段并将其与内部节点字段关联。

若想进一步深入,参考手册的 [PROTO 章节(https://cyberbotics.com/doc/reference/proto)详细解释了 PROTO 机制的所有可能性。