目录
声明:本文以下内容为webots学习笔记,主题内容为翻译的官方参考手册reference manual,加上一些自己补充的背景知识点等,仅用于学习交流和备忘备查。
1.2字段值的限制(Field Value Restriction)
4、程序化节点(Procedural PROTO Nodes)
5、和场景树使用PROTO节点(Using PROTO Nodes with the Scene Tree)
5.1 PROTO字典(PROTO Directories)
5.3 使用PROTO实例(Using PROTO Instances)
8、设计指引(PROTO Design Guidelines)
8.4简单 PROTO 节点的推荐字段(Recommended Fields for Simple PROTO Nodes)
8.4.1 平移和旋转("translation" and "rotation")
8.4.2 启用边界对象("enableBoundingObject")
PROTO
扩展结点,便于复用。PROTO 机制允许用户通过添加自己的节点来扩展节点集。因此,用户可以构建并重复使用复杂的对象。
定义后可以实例化。PROTO 通过内置节点或其他 PROTO 节点定义了一种新的节点类型。PROTO 接口定义了 PROTO 的字段。一旦定义,PROTO 节点就可以像内置节点一样在场景树中实例化。
有示例教程。题为 "你的第一个 PROTO "的教程提供了创建自己的 PROTO 节点的实践步骤。
在VRML(Virtual Reality Modeling Language)中,PROTO是一种用于定义可重用节点(Node)的机制,类似于函数或者模板的概念。PROTO可以用来创建自定义的节点类型,以便在VRML场景中多次使用,提高代码的可重用性和可维护性。
在翻译上,PROTO可以被理解为“过程”或者“程序”,表示一种定义和封装节点的过程。在VRML中,通过定义PROTO,可以将一组节点和它们的字段封装在一个自定义的节点类型中,然后在需要的地方实例化和使用这个自定义节点类型。
总的来说,PROTO在VRML中的作用类似于创建自定义函数或模板,在需要时可以重复调用,提高代码的可读性和可维护性。因此,可以将PROTO翻译为“过程”或“程序”,表示定义和封装节点的过程。
在VRML(Virtual Reality Modeling Language)中,Fields(字段)是节点(Node)中用来存储数据的部分,类似于属性或变量。每个节点都可以包含一个或多个字段,用来描述节点的特征、属性或状态。Fields可以存储各种类型的数据,比如整数、浮点数、布尔值、颜色、向量等,以及其他节点或节点集合。
Fields在VRML中起着至关重要的作用,它们定义了节点的状态和行为,决定了节点在3D场景中的外观、位置、交互等方面。通过设置和修改节点的字段值,可以实现对节点的控制和定制,从而创建出丰富多样的虚拟现实体验。
在VRML中,字段通常由字段名和字段值组成,字段名用于标识字段的用途或含义,而字段值则存储具体的数据。字段的语法格式通常如下所示:
fieldName value
例如,一个包含颜色和位置信息的节点字段可以表示为:
color 1.0 0.0 0.0 position 0 0 0
通过设置不同的字段值,可以调整节点的外观、位置、颜色等属性,实现对3D场景的定制和控制。因此,理解和使用Fields是在VRML中创建和编辑3D场景的关键步骤,它们为节点提供了灵活的数据存储和管理机制。
1、定义(PROTO Definition)
1.1接口(Interface)
PROTO 节点在 PROTO 文件中定义,PROTO 文件是以 .proto 扩展名结尾的文本文件。
1.1.1文件头(header)
PROTO 文件以下列标题行开始:
#VRML_SIM R2023b utf8
随后可能会有注释,例如
# license: Apache License 2.0
# license url: https://www.apache.org/licenses/LICENSE-2.0
# This is the description of the sample PROTO node.
1.1.2文件结构(Structure)
PROTO 定义列出了 PROTO 的字段,并定义了这些字段如何影响使用基本节点和/或 PROTO 节点定义的底层对象。
PROTO protoName [ protoFields ] { protoBody }
接口是一系列字段声明,用于指定 PROTO 字段的类型、名称和默认值。字段声明的语法如下
field fieldType fieldName defaultValue
field
是保留字.fieldType
是以下之一:SFNode, SFColor, SFFloat, SFInt32, SFString, SFVec2f, SFVec3f, SFRotation, SFBool, MFNode, MFColor, MFFloat, MFInt32, MFString, MFVec2f, MFVec3f, MFRotation
、MFBool
.fieldName
是字段的名称可自定义defaultValue
是字面默认值,取决于fieldType
.
上面一段暂时看步太懂没关系,这些都是VRML语言的语法。有两类常见的域,一类只包含单值(所谓单值,可以是一个单独的数,也可以是定义一个向量或颜色的几个数,甚至可以是定义一幅图像的一组数),另外一类包含多个单值。单值类型的域,名称以“SF”开始;多值类型的域,名称以“MF”开始。
VRML(Virtual Reality Modeling Language)是一种用于描述虚拟现实场景和交互的标记语言。它最初在1994年发布,旨在为虚拟现实应用程序提供一种标准的方式来描述3D场景和交互元素。然而,随着时间的推移,VRML逐渐被更先进的技术所取代,比如X3D(Extensible 3D)和WebGL(Web Graphics Library)。
目前,VRML已经被认为是过时的技术。主要原因包括:
技术发展:随着计算机图形学和虚拟现实技术的不断发展,新的标准和技术不断涌现,提供了更高效、更强大的方式来创建和展示3D场景。
兼容性:VRML在不同平台和浏览器之间的兼容性并不理想,这限制了其在广泛应用的可能性。
性能:VRML在处理复杂的3D场景时性能可能不佳,特别是在需要实时渲染和交互的应用中。
因此,虽然VRML在其诞生时曾经具有一定的影响力和应用范围,但随着技术的发展,它已经逐渐被更先进的技术所取代,因此可以说VRML已经过时。
进一步了解可以参考以下链接
1.1.3总结(Summary)
PROTO文件长成下面这个样子
#VRML_SIM R2023b utf8
PROTO MyProto [
field SFVec3f translation 0 0 0
field SFRotation rotation 0 0 1 0
field SFString name "my proto"
field SFColor color 0.5 0.5 0.5
field SFNode physics NULL
field MFNode extensionSlot []
]
{
Solid {
...
}
}
PROTO 定义正文中根节点(本例中为 Solid 节点)的类型称为 PROTO 的基本类型。基本类型决定了该 PROTO 的实例在场景树中的位置。例如,如果一个 PROTO 的基本类型是材质,那么该 PROTO 的实例就可以在任何可以使用材质模式的地方使用。基节点是另一个 PROTO 的 PROTO 称为派生 PROTO(derived PROTO)。
1.2字段值的限制(Field Value Restriction)
如果一个字段只有一组有限的可能值,可以直接在字段类型后的 PROTO 定义中这样指定:
PROTO MyProto [
field SFVec3f translation 0 0 0
field SFRotation rotation 0 0 1 0
field SFString name "my proto"
field SFColor{0 0 0, 0.5 0.5 0.5, 1 1 1} color 0.5 0.5 0.5
field SFNode physics NULL
field MFNode{Solid{}, Pose{}} extensionSlot []
]
在这个例子中,color
字段值只可以是0 0 0
, 0.5 0.5 0.5
或 1 1 1;extensionSlot字段仅可以是Solid或Pose节点。
1.3 IS 声明(IS Statements)
PROTO 定义中的节点可以将其字段与 PROTO 接口的字段关联起来。这可以通过节点正文中的 IS 语句来实现。IS 语句包括内置节点的字段名称、关键字 IS 和 PROTO 接口的字段名称:
例如
PROTO Bicycle [
field SFVec3f position 0 0 0
field SFRotation rotation 0 0 1 0
field SFString name "bicycle"
field SFColor frameColor 0.5 0.5 0.5
field SFBool hasBrakes TRUE
]
{
Solid {
translation IS position
rotation IS rotation
...
children [
...
]
...
}
}
IS 语句可以出现在 PROTO 定义中任何可能出现字段的地方。IS 语句应指 PROTO 声明中定义的字段。在 PROTO 接口声明中对同一字段使用多个 IS 语句是有效的,但不鼓励多次使用包含 Solid 或 Joint 节点的字段。这是因为系统假定一个 PROTO 字段的所有实例都完全相同才能正常工作,但对于这些节点来说,由于内部变化或控制器程序指令,实例的状态可能会发生变化,因此无法保证这一点。
一个接口字段如果没有通过 IS 链接到内部 PROTO 字段,在解析时可能会产生警告。在声明接口字段时,可以使用未连接字段(unconfonnectedField)关键字来代替字段,从而抑制该警告。当接口字段的值用于 "存储 "Supervisor控制器可能希望访问的相关数据(如某段道路的限速或某个对象的放射性)时,这种方法非常有用。
IS 语句引用不存在的接口字段是错误的。如果关联字段的类型与 PROTO 接口中声明的类型不一致,也属于错误。例如,将 SFColor 与 SFVec3f 关联就是非法的。将 SFColor 与 MFColor 关联也是非法的,反之亦然。如果 PROTO 主体中一个节点的字段与 PROTO 接口中一个以上的字段关联,则结果将是未定义的。
2、实例化(PROTO Instantiation)
每个 PROTO 实例都可以被视为 PROTO 的完整副本,包括其接口字段和主体节点。PROTO 使用标准节点语法进行实例化,例如
Bicycle {
position 0 0.5 0
frameColor 0 0.8 0.8
hasBrakes FALSE
}
从".wbt "文件读取 PROTO 实例时,可以给出 PROTO 接口字段的字段值。如果给出了字段值,那么 PROTO 定义中所有对这些字段有 IS 语句的节点都将使用这些字段值。
3、示例(PROTO Example)
这里提供了一个完整的 PROTO 定义和实例化示例。该 PROTO 名为 TwoColorChair;它定义了一把有四条腿和一个座位部分的简单椅子。为简单起见,该 PROTO 没有边界对象,也没有物理节点。Webots 发行版中提供了一个名为 SimpleChair 的更完整的 PROTO 示例。
TwoColorChair PROTO 允许指定两种颜色:一种用于椅腿,另一种用于椅面。该界面还定义了一个平移translation字段和一个旋转rotation字段,这两个字段与 PROTO 的实体基本节点的同名字段相关联。这样就可以存储 PROTO 实例的位置和方向。
"TwoColorChair.proto":
#VRML_SIM R2023b utf8
# license: Creative Commons Attribution 4.0 International License.
# license url: https://creativecommons.org/licenses/by/4.0/legalcode
# documentation url: https://www.cyberbotics.com/doc/guide/object-chairs
# A two-color chair
PROTO TwoColorChair [
field SFVec3f translation 0 0 0.91
field SFRotation rotation 0 0 1 0
field SFString name "two-color chair"
field SFColor legColor 1 1 0
field SFColor seatColor 1 0.65 0
field SFNode seatGeometry NULL
field MFNode seatExtensionSlot []
]
{
Solid {
translation IS translation
rotation IS rotation
children [
Pose {
translation 0.27 0 0
children IS seatExtensionSlot
}
Pose {
translation 0 0 -0.35
children [
Shape {
appearance Appearance {
material Material { diffuseColor IS seatColor }
}
geometry IS seatGeometry
}
]
}
Pose {
translation 0.23 -0.25 -0.65
children [
DEF LEG_SHAPE Shape {
appearance Appearance {
material Material { diffuseColor IS legColor }
}
geometry Box { size 0.075 0.075 0.52 }
}
]
}
Pose {
translation 0.23 0.25 -0.65
children [ USE LEG_SHAPE ]
}
Pose {
translation -0.2 -0.25 -0.65
children [ USE LEG_SHAPE ]
}
Pose {
translation -0.2 0.25 -0.65
children [ USE LEG_SHAPE ]
}
]
name IS name
}
}
从这个示例中可以看出,只要类型匹配,一个接口字段(seatColor)可以有多个 IS 语句。也可以在定义的 (DEF) 节点内使用 IS 语句,然后重新使用 (USE) 该节点。这里的做法是将 diffuseColor IS legColor 语句放在 DEF LEG_SHAPE Shape 节点中,然后在下面重复使用(USE)该节点。
下面的 "PROTOInstantiationExample.wbt "文件演示了该 PROTO 的实例化。PROTO 节点使用常规节点语法进行实例化。具有默认值的字段可以省略。必须指定与默认值不同的字段值。
"ThreeChairs.wbt":
#VRML_SIM R2023b utf8
EXTERNPROTO "https://raw.githubusercontent.com/cyberbotics/webots/R2023b/projects/appearances/protos/DamascusSteel.proto"
EXTERNPROTO "https://raw.githubusercontent.com/cyberbotics/webots/R2023b/projects/appearances/protos/VarnishedPine.proto"
EXTERNPROTO "https://raw.githubusercontent.com/cyberbotics/webots/R2023b/projects/objects/backgrounds/protos/TexturedBackground.proto"
EXTERNPROTO "https://raw.githubusercontent.com/cyberbotics/webots/R2023b/projects/objects/backgrounds/protos/TexturedBackgroundLight.proto"
EXTERNPROTO "https://raw.githubusercontent.com/cyberbotics/webots/R2023b/projects/objects/floors/protos/Floor.proto"
EXTERNPROTO "../protos/TwoColorChair.proto"
WorldInfo {
}
Viewpoint {
orientation -0.141 0.263 0.954 1.078
position -0.863 -3.489 1.757
}
TexturedBackground {
}
TexturedBackgroundLight {
luminosity 0.5
castShadows FALSE
}
PointLight {
attenuation 0 0 1
intensity 20
location -4 -4 1
radius 10
castShadows TRUE
}
Floor {
size 20 20
}
DEF GREEN_STOOL TwoColorChair {
translation 0 0 0.9
name "two-color chair(2)"
legColor 0 0.666667 0
seatColor 0.235294 0.470588 0
seatGeometry Cylinder {
height 0.1
radius 0.4
}
}
DEF YELLOW_CHAIR TwoColorChair {
translation 1 0 0.9
seatGeometry Box {
size 0.6 0.6 0.1
}
seatExtensionSlot [
Pose {
translation -0.27 0.28 -0.014
children [
Shape {
appearance PBRAppearance {
baseColor 1 1 0
roughness 1
metalness 0
}
geometry Box {
size 0.6 0.03 0.7
}
}
]
}
]
}
DEF DAMACUS_SPHERE TwoColorChair {
translation 3 0 0.9
name "two-color chair(1)"
legColor 0.678431 0.678431 0.678431
seatExtensionSlot [
Pose {
translation -0.27 0 -0.29
children [
Shape {
appearance DamascusSteel {
}
geometry Sphere {
radius 0.4
subdivision 5
}
}
]
}
]
}
DEF WOODEN_CHAIR TwoColorChair {
translation 2 0 0.9
name "two-color chair(3)"
legColor 0.478431 0.239216 0
seatColor 0.666667 0.333333 0
seatGeometry Box {
size 0.6 0.6 0.1
}
seatExtensionSlot [
Pose {
translation -0.27 0.25 0.05
children [
Shape {
appearance VarnishedPine {
}
geometry Box {
size 0.6 0.1 0.7
}
}
]
}
]
}
Webots 加载后的 "ThreeChairs.wbt "文件如图所示。
从这个示例中可以看出,在 PROTO 接口中定义 MFNode 字段可以将相同的模型重复用于稍有不同的对象或机器人。例如,扩展槽(如 seatExtensionSlot 字段)可用于为基本机器人添加额外的设备,而无需复制机器人定义或创建新的 PROTO。在本示例中,我们添加了一个椅子靠背和一个球体,以创建一个装饰对象。
Three instances of the TwoColorChair PROTO in Webots
在VRML(Virtual Reality Modeling Language)中,MFNode是一种字段类型,用于表示多个节点(Node)的集合。节点(Node)是VRML中的基本构建块,用于描述3D场景中的对象、几何体、光源、相机等元素。
MFNode字段表示一个节点集合,可以包含零个或多个节点。每个节点可以是任何类型的节点,比如Shape节点用于表示几何体外观、Transform节点用于表示变换、Light节点用于表示光源等。MFNode字段允许在一个字段中存储多个节点,这样可以方便地组织和管理复杂的3D场景。
4、程序化节点(Procedural PROTO Nodes)
通过使用脚本语言对 PROTO 节点进行扩展,可以大大提高 PROTO 节点的表现力。这样,PROTO 节点就可以包含常量、数学表达式、循环、条件表达式、随机性等。
4.1 脚本语言
程序 PROTO 节点可以用 Lua 或 JavaScript 编写脚本。未来将停止对 Lua 的支持,因此如果可能,应首选 JavaScript。
Lua 脚本语言
JavaScript 脚本(链接带补充)
5、和场景树使用PROTO节点(Using PROTO Nodes with the Scene Tree)
Webots 中包含多个 PROTO 实例。这些 PROTO 节点的实例可以通过 "场景树 "按钮添加到仿真中。请注意,目前场景树允许实例化,但不允许定义 PROTO 节点。必须在".proto "文件中手动创建或修改 PROTO 定义。
5.1 PROTO字典(PROTO Directories)
要向 Webots 提供 PROTO,必须将完整的 PROTO 定义保存在".proto "文件中。每个".proto "文件只能包含一个 PROTO 的定义,每个文件必须保存为 <PROTOName>".proto",其中 PROTOName 是 PROTO 关键字后指定的 PROTO 名称(区分大小写)。例如,上述 TwoColorChair PROTO 必须保存在名为 "TwoColorChair.proto "的文件中。
.proto "文件应放在当前项目目录下的 "protos "子目录中。根据定义,当前项目目录是包含当前打开的".wbt "文件的 "worlds "目录的父目录。下图显示了".proto "文件在项目目录中的存放位置。
项目目录结构中的 PROTO 目录
请注意,在 "protos "目录内,子目录的数量和名称都是自由的。用户可以出于实际分类的原因指定目录名称,但名称并不影响搜索 PROTO 文件的方式。整个子目录树总是递归搜索的。
除了当前项目目录外,Webots 还管理一个默认项目目录。该目录在结构上与当前项目目录类似(见上文),但位于 Webots 发行版内部。默认项目目录中还有一个 "protos "子目录,提供 Webots 标准 PROTO 节点。用户通常不应修改这些标准 PROTO 节点。请注意,".proto "文件将首先在当前项目目录中搜索,然后在默认项目目录中搜索。
5.2 增加节点对话(Add a Node Dialog)
如果 PROTO 保存在一个具有正确名称和位置的文件中,它就会在 "添加节点 Add a node"对话框中显 示出来,该对话框可以从 "场景树Scene Tree "中调用。在该对话框中,PROTO 节点的组织结构与项目和 Webots 的 "protos "文件夹中的目录层次结构相同。不过,只有当 PROTO 的基本类型适合所选插入点时,该对话框才会显示 PROTO。例如,基本类型为 "材料 "的 PROTO 不能插入到边界对象(boundingObject)字段中。从图中可以看到 TwoColorChair PROTO 在对话框中的显示效果。请注意,对话框的文本面板会自动填入".proto "文件开头的注释。
添加双色椅 PROTO 的实例
PROTO 图标可用于更好地说明 PROTO 节点。PROTO 图标必须存储在 128 x 128 像素的".png "文件中。文件名必须与 PROTO 的名称一致,并加上".png "扩展名,而且必须存储在 "protos "目录下的 "icons "子目录中(见上上图)。请注意,您可以使用 Webots 的菜单 "文件/截屏"(File/Take Screenshot)直接创建".png "文件....。然后使用图像编辑器将图像裁剪或调整为 128 x 128 像素。
5.3 使用PROTO实例(Using PROTO Instances)
点击 "添加 "按钮后,PROTO 实例就会添加到场景树中。在场景树中,PROTO 实例的颜色与内置节点不同(请参阅本图)。PROTO 字段的操作与内置节点字段完全相同。
带有两个 TwoColorChair PROTO 实例的场景树
6、范围规则(PROTO Scoping Rules)
PROTO 名称必须是唯一的:使用与其他 PROTO 或内置节点类型相同的名称定义 PROTO 是错误的。一个".proto "文件只能包含一个 PROTO 定义。一个 PROTO 节点可以用其他 PROTO 节点来定义。但是,不允许在 PROTO 自身的定义中实例化 PROTO(即递归 PROTO 是非法的)。IS 语句指的是同一文件中同一 PROTO 接口中的字段。接口中声明的字段可以通过 IS 语句传递给子 PROTO 节点。
一个".proto "文件建立的 DEF/USE 名称范围与场景树的其他部分和任何其他 PROTO 定义都是分开的。通过 PROTO 内部的 DEF 结构命名的节点不得在 PROTO 范围之外的 USE 结构中引用。在 PROTO 范围之外使用 DEF 结构命名的节点,不得在 PROTO 范围之内的 USE 结构中引用。
对于派生 PROTO 节点,允许在接口中声明与基本 PROTO 字段同名的字段,但前提是该字段除了与同名的基本 PROTO 字段相关联外,不得与任何其他字段相关联。这意味着可以在模板语句中不受限制地使用派生字段,但如果在 IS 语句中使用派生字段,则 IS 关键字前后的两个标识符必须匹配。如果派生字段具有唯一名称,则不受限制。
7、隐藏字段(PROTO Hidden Fields)
通过常规 PROTO 字段,您可以更改、保存和恢复模型的选定特征。相比之下,PROTO 封装可以防止那些无法通过 PROTO 字段访问,但在仿真过程中可能会发生变化的字段值被保存和恢复。尽管如此,这并不适用于所有字段值,因为 Webots 会为您保存隐藏的 PROTO 字段,这些字段在仿真过程中必然会发生变化。也就是说,实体节点的平移和旋转字段以及关节节点的位置字段将作为隐藏 PROTO 字段保存在每个顶层 PROTO 的字段范围内。在实体合并的情况下,请注意隐藏的平移和旋转字段只针对置于实体装配顶层的实体保存。
与非 PROTO 对象一样,PROTO 物理子部分的初始速度也会被保存,并可在重新加载世界文件时恢复。与其他隐藏字段一样,速度也保存在每个顶级 PROTO 的字段范围内。
每个隐藏字段都会在其名称后附加一个索引,该索引编码它所属的实体在以 PROTO 节点为根的树状层次结构中的位置。该索引对应的是 Solid 在该树中的深度优先预排序遍历索引。如果隐藏字段对应的是关节点的位置,则会在其名称后附加一个索引,即该关节点在以预序遍历方式排序的、源于 Solid 的关节点列表中的索引。作为示例,我们将在下面显示一个模拟步骤后保存的 "projects/robots/pioneer/pioneer3at/worlds/pioneer3at.wbt "节选。
DEF PIONEER_3AT Pioneer3at {
hidden position_0_0 -2.88177e-07
hidden position_0_1 -4.63679e-07
hidden position_0_2 -3.16282e-07
hidden position_0_3 -4.91785e-07
hidden linearVelocity_0 -0.00425142 -0.0284347 0.0036279
hidden angularVelocity_0 0.0198558 -9.38102e-07 0.0232653
hidden translation_2 -0.197 4.04034e-06 0.1331
hidden rotation_2 -0.013043 0.00500952 0.999902 -2.88177e-07
hidden linearVelocity_2 -0.00255659 -0.0214607 0.00218164
hidden angularVelocity_2 0.0198598 -9.84272e-07 0.0232733
hidden translation_3 0.197 7.85063e-06 0.1331
hidden rotation_3 -0.00949932 0.00367208 0.999948 -4.63679e-07
hidden linearVelocity_3 -0.00255694 -0.0330774 0.00218161
hidden angularVelocity_3 0.0198623 -9.92987e-07 0.0232782
hidden translation_4 -0.197 4.64107e-06 -0.1331
hidden rotation_4 -0.011884 0.0045545 0.999919 -3.16282e-07
hidden linearVelocity_4 -0.00255674 -0.0232922 0.00218172
hidden angularVelocity_4 0.0198602 -9.84272e-07 0.0232741
hidden translation_5 0.197 8.45135e-06 -0.1331
hidden rotation_5 -0.00895643 0.00345587 0.999954 -4.91785e-07
hidden linearVelocity_5 -0.0025571 -0.0349089 0.00218169
hidden angularVelocity_5 0.0198627 -9.92987e-07 0.023279
translation 2.61431 0.109092 18.5514
rotation -0.000449526 1 0.000227141 -2.66435
controller "obstacle_avoidance_with_lidar"
extensionSlot [
SickLms291 {
translation 0 0.24 -0.136
pixelSize 0
}
]
}
前六个隐藏字段的名称都包含主索引 0,即 Pioneer3at PROTO 本身的索引。四个隐藏位置字段的附加二级索引与车轮使用的四个 HingeJoint 节点相对应,并通过预序遍历进行编号。索引为 1 的实体节点(即 SickLms291 PROTO)没有隐藏字段,因为其相对位置和方向在模拟过程中保持不变。索引 2 至 5 对应 Pioneer3at 的四个实体轮。
8、设计指引(PROTO Design Guidelines)
在创建自己的 PROTO 节点时,我们建议您遵循这些指南。这样可以确保新的 PROTO 节点设计合理、易于使用,并与 Webots 中提供的现有 PROTO 节点保持一致。
8.1 命名(Naming)
PROTO 的命名非常重要,应准确、清晰。因此,在为 PROTO 命名时,应避免使用缩写、数字和含糊不清的术语。例如,SmallWoodenChair 好于 SmallChair,SmallChair 好于 Chair,SmallChair 好于 Chair7。PROTO 名称应使用大写字母,例如,每个单词应以大写字母开头,中间不留空格。
注意:PROTO 文件名应与 PROTO 名称完全一致。例如,应在名为 SmallWoodenChair.proto 的文件中定义 SmallWoodenChair PROTO。
8.2朝向(Orientation)
PROTO 节点在 ENU 坐标系(WorldInfo 中的默认坐标系)中的方向应与 ENU 坐标系一致。如果一个对象至少定义了两个面(例如向上和向前),则应使用 FLU 坐标系确定其方向:
- 沿 X 轴正向的前进Forward方向、
- 沿 Y 正轴的左Left 方向,以及
- 沿 Z 正轴的向上Up方向。
采用 FLU 系统的典型物体是电视机、橡皮鸭或机器人。花盆等物体没有正面、背面、右侧或左侧。在这种情况下,只需正确设置向上的方向:直立位置应沿着正 Z 轴。足球等物体没有上下、前后、左右之分。在这种情况下,方向并不重要。
8.3头文件(header)
PROTO 文件的第一行称为头文件。应该如下所示: #VRML_SIM R2023b utf8。R2023b 相当于运行此 PROTO 所需的 Webots 版本。其后应该是一些描述 PROTO 的注释。这些注释的格式应如下例所示,以便 Webots 正确显示。
8.3.1许可证(License)
如果要分发 PROTO,必须指定使用该 PROTO 的许可证。为此,应在 license: 注释中指定许可名称,并在 license url: 注释中给出许可文件的 URL(见下面的示例)。
8.3.2(标签)
如果需要,应适当指定标签:注释。目前,它支持四种可能的选项:已废弃、隐藏、非确定和 no3dView,这四种选项可以同时使用,并用彗星分开:
- deprecated已废弃表示在新的模拟中不再使用该 PROTO,但为了向后兼容而保留。使用过时的 PROTO 时,Webots 将显示相关警告信息。
- 当用户要插入新的 PROTO 时,"hidden(隐藏)"会告诉 Webots 在 "Add Node(添加节点)"对话框中不显示该 PROTO。隐藏的 PROTO 节点通常用作子 PROTO 节点,即从另一个 PROTO 文件中使用,而不是直接从世界文件中使用。
- nonDeterministic(非确定性)告诉 Webots,该 PROTO 每次执行的结果都可能不同。如果 PROTO 的执行涉及随机性,通常会出现这种情况。
- no3dView 告知 webots.cloud 在显示此 PROTO 的页面时不加载 3D 视图。
8.3.3 文档(Documentation)
文档 url: 注释可用于链接到 PROTO 文档。该链接将显示在添加节点对话框中,并通过节点帮助菜单打开。
8.3.4关键字(Keywords)
应添加关键字:注释,以便在 webots.cloud 上对proto进行正确分类。可使用以下关键字:
robot
- arm
- flying
- tracked
- legged
- wheeled
- other
- accessory
- extension
sensor
- camera
- distance-sensor
- imu
- lidar
- radar
- range-finder
actuator
- gripper
- motor
- other
industrial
- cart
- container
- conveyor
- ironmongery
- light
- plumbing
- safety
- tool
- other
household
- electronics
- hospital
- kitchen
- light
- living room
- potted plant
- school
- toy
vehicle
- car
- farm
- public
- truck
- two wheels
- wheel
- steering
- other
furniture
- bathroom
- bedroom
- chair
- kitchen
- laundry
- living room
- storage
- table
building
- business
- civil
- component
- farm
- hotel
- house
- industry
- residential
- shop
animal
- farm
- pet
- wild
exterior
- garden
- obstacle
- sport
- street furniture
- tree
traffic
- road
- sign
appearance
- electronics
- fabric
- leather
- metal
- mineral
- other
- paint
- plastic
- rubber
- wood
primitive
- background
- geometry
- ground
- joint
您应声明以下关键字:
如果原型属于一个有子类别的类别,则必须选择一个子类别。语法为:keywords:第一级类别/第二级类别,例如:keywords: robot/walking。
如果机器人属于多个类别,则不同类别之间必须用逗号隔开,例如:关键字:车辆/汽车、外观/金属。
8.3.5描述(description)
最后,简要说明 PROTO 的内容也很重要。如下例所示,描述可能非常简单。这些信息将显示在 "添加节点 "对话框中,用于描述 PROTO。
8.4简单 PROTO 节点的推荐字段(Recommended Fields for Simple PROTO Nodes)
本节介绍代表现实世界对象的简单 PROTO 节点,这些节点源自实体节点。它不包括从其他基元(如几何图形)派生的 PROTO 节点和复杂的 PROTO 节点(如传感器、致动器actuators或机器人)。
8.4.1 平移和旋转("translation" and "rotation")
真实物体可以放置在世界上不同的位置和方向。因此,相应的 PROTO 至少应提供一个平移和旋转字段,以便用户轻松移动和旋转对象。
平移的默认值最好是原点(0, 0, 0),并且应与物体的正常位置相对应,例如躺在地板上而不是陷在地板里。也就是说,物体的原点不应位于其三维几何中心,而应位于与地面接触的表面中间。不过,这条规则也有例外:
- 有腿机器人的原点应在其主体上,因为很难知道机器人腿向地面的延伸。
- 球的原点应在其几何中心,因为它们可以滚动,没有直立位置。
- 由基础节点直接派生的设备(如激光雷达、摄像头等)可以有一个不同于 0 0 0 的默认平移值,这样即使传感器本身不在接触面上,设备的形状在创建时也会靠在地面上。
- 任何其他没有明确或稳定直立位置的物体。
旋转轴的位置应该已经确定,例如通常沿 Z 轴旋转,角度值为 0,例如 0 0 1 0,这样在旋转建筑物时,只需更改角度值即可使其沿垂直轴旋转。
vrml中的rotation为什么是4个数字?
在VRML(Virtual Reality Modeling Language)中,rotation字段通常用于表示节点的旋转信息,以控制节点在3D场景中的旋转方向和角度。rotation字段通常由四个数字组成,分别代表一个四元数(quaternion),用来描述节点的旋转状态。
四元数是一种数学工具,用来表示三维空间中的旋转,相比欧拉角等其他表示方法,四元数具有更好的数学性质和计算效率。在VRML中使用四元数来表示旋转信息,可以避免万向锁等问题,同时也更容易进行旋转的组合和插值操作。
四元数通常由四个实数部分组成,分别表示旋转轴的三个分量和旋转角度。在VRML中,rotation字段的四个数字通常按照以下顺序表示:
- 旋转轴的X分量
- 旋转轴的Y分量
- 旋转轴的Z分量
- 旋转角度(以弧度为单位)
通过这四个数字,可以精确地描述节点的旋转状态,包括旋转轴和旋转角度,从而实现对节点在3D场景中的旋转控制。
因此,VRML中的rotation字段使用四个数字来表示四元数,以便精确描述节点的旋转状态,同时利用四元数的数学性质来实现高效的旋转操作。这种表示方法可以避免旋转过程中的奇点和计算复杂性,提高了节点旋转的准确性和效率。
8.4.2 启用边界对象("enableBoundingObject")
边界对象用于碰撞检测。如果您认为某个对象不会与任何物体发生碰撞,那么关闭碰撞检测以节省计算时间是非常方便的。为 PROTO 提供一个启用边界对象(enableBoundingObject)的布尔值字段就可以达到这个目的。例如,在客厅的桌面上运行着一个小型机器人,在机器人活动范围之外的所有物体,如沙发、椅子、吊灯、电视机等,都不会与机器人发生碰撞,因此可以关闭碰撞检测。但在其他一些情况下,我们希望机器人能与椅子发生碰撞,因为机器人是在地板上运行的。因此,这类对象应该有一个 enableBoundingObject 字段,允许用户根据具体的模拟场景来决定是否启用碰撞检测。
8.4.3启用物理引擎("enablePhysics")
有时我们希望模拟物体的物理运动,有时我们又希望通过不模拟物体的物理运动来节省计算时间,因此最好也添加一个 enablePhysics 布尔值字段,允许用户启用或禁用物体的物理模拟。例如,一个盒子可能是机器人可以移动的,也可能是粘在地板上或太重而无法移动的。在这种情况下,我们最好能指定是否要模拟该物体的物理运动。不模拟物理运动可以节省计算时间,提高模拟的稳定性。不过,有些物体在模拟过程中是不会移动的。这包括建筑物、交通标志、树木、邮箱等。因此,这些对象不应包含物理节点,显然也不应暴露 enablePhysics 字段。
8.4.4其它字段(Other Fields)
在与现实世界对象相对应的 PROTO 节点中,不建议添加质量或比例等字段。这是因为在现实生活中,您无法改变物体的质量或大小。我们也不鼓励 PROTO 节点的用户这样做,因为这可能会导致模型不真实和数值不稳定。不过也存在一些例外情况。例如,在 Matryoshka 娃娃 PROTO 中添加一个尺寸字段可能会很方便。不过,这种尺寸字段应限于最小和最大尺寸或有限的整数值范围。因此,它既可以是浮点数,也可以是整数。
对于某些 PROTO 节点,显示颜色字段可能会很有用。例如,汽车或彩色铅笔 PROTO 可以公开一个颜色字段。不过,这应仅限于有不同颜色的对象。例如,消防栓(通常总是红色)或叉子(通常总是金属灰色)就不应该使用这种方法。如果可以使用任何颜色,颜色字段可以指定为一个颜色节点,或者指定为一个字符串(如果该对象只有有限的几种颜色)。
根据对象的不同,一些纹理字段也可能有用。例如,绘画 PROTO 可以在图片字段中指定绘画,在框架字段中指定框架纹理。
一般来说,为了保证生成的对象逼真并符合原始构思,暴露字段的数量应尽可能少。
8.5字段说明(Field Comments)
如有必要,应按照这些规则仔细注释字段,以解释其含义:
如果字段通过 IS 直接连接到根节点,注释应为 # Is RootNodeType.fieldname.。
如果字段是一个槽,注释应为 # 扩展机器人,在 XXX 槽中加入新节点。
一般来说,注释应使用连接动词(大多数情况下为 "Defines"),并以句号(".")结尾。
8.6 实体命名(Solid Names)
注意尽量避免使用 Webots 自动生成的 Solid.name 值,如 solid(1)。最好使用描述性更强的名称,如左臂枢轴。
8.7例子(Example)
下面是一个很好的 PROTO 声明的简单示例(未显示实现方法):
#VRML_SIM R2023b utf8
# license: Apache License 2.0
# license url: https://www.apache.org/licenses/LICENSE-2.0
# A color pencil
PROTO ColorPencil [
field SFFloat translation 0 0 0
field SFRotation rotation 0 0 1 0
field SFBool enablePhysics TRUE
field SFBool enableBoundingObject TRUE
field SFColor color 1 0 0 # defaults to red.
field SFFloat size 0.2 # range in [0.02, 0.2].
]
...