第九章 Webots官方Tutorial 8
目录
- 第九章 Webots官方Tutorial 8
- Tutorial 8: the Supervisor
- 二、设置环境并添加Supervisor
- 三、使用Supervisor移动对象
- 四、生成和删除结点
- 五、使用Supervisor跟踪目标位置
- 总结
Tutorial 8: the Supervisor
Supervisor监督一个世界,可以设置或获取有关它的信息。本教程将教supervisor的一些任务:
- 如何使用 supervisor 移动对象。
- 如何删除一个节点并在其位置生成另一个节点。
- 如何跟踪场景中对象的变化。
- 如何更改对象的属性,即其颜色。
二、设置环境并添加Supervisor
- File / New / New Project Directory新建工程my_supervisor
- 新建世界文件
my_supervisor.wbt
,添加地板"Add a rectangle arena"- 设置地板大小floorsize为
- 添加一个BB-8机器人。PROTO nodes (Webots projects) / robots / sphero / bb8
- 删除BB-8自带的控制器
- 添加一个Robot结点作为监控器,name改为supervisor,supervisor改为TRUE
- 新建一个机器人控制器
supervisor_controller.py
。File / New / New Robot Controller,将其作为supervisor的控制器。
- 保存
三、使用Supervisor移动对象
使用Supervisor移动BB-8机器人,有必要在其他物体中找到唯一识别BB-8的方法。为此,我们可以使用DEF机制。
单击BB-8节点,并将其命名为BB-8,然后保存世界。
控制器supervisor_controller.py
代码(机器人将被移动到指定位置坐标,注意robot创建的是Supervisor而不是Robot实例):
from controller import Supervisor
TIME_STEP = 32
robot = Supervisor() # create Supervisor instance
# [CODE PLACEHOLDER 1]
bb8_node = robot.getFromDef('BB-8')
# Get Location
translation_field = bb8_node.getField('translation')
i = 0
while robot.step(TIME_STEP) != -1:
# [CODE PLACEHOLDER 2]
if i == 0:
new_value = [2.5, 0, 0]
translation_field.setSFVec3f(new_value)
i += 1
这是一个简单的例子,但无论你更改哪个字段,原理都是一样的。例如,你可以增加对象的大小、颜色,更改灯光条件,或在超出范围时重置其位置等等。这只是一个获取节点引用的问题,从中可以按名称获取字段引用,并通过使用适合更改的类型的函数来设置其值。
四、生成和删除结点
删除结点:
if i == 10:
bb8_node.remove()
添加一个型机器人Nao:
为了添加节点,我们必须知道要在场景树(软件左侧列表)中的何处生成节点。是否应将其添加到场景树的顶层?它应该作为另一个节点的字段插入吗?这些问题将改变如何插入节点以及需要使用哪个主管功能,但其中一个不变的因素是我们需要引用此位置。在这种情况下,Nao机器人将被添加到场景树中的最后一个位置,即BB-8曾经出现的位置。
- 点击IMPORTABLE EXTERNPROTO,Insert new一个Nao机器人。PROTO nodes (Webots Projects)/Nao,保存。
控制代码:
from controller import Supervisor
TIME_STEP = 32
robot = Supervisor() # create Supervisor instance
# [CODE PLACEHOLDER 1]
bb8_node = robot.getFromDef('BB-8')
translation_field = bb8_node.getField('translation')
# 获取根节点
root_node = robot.getRoot()
children_field = root_node.getField('children')
i = 0
while robot.step(TIME_STEP) != -1:
# [CODE PLACEHOLDER 2]
if i == 0:
new_value = [2.5, 0, 0]
translation_field.setSFVec3f(new_value)
# 删除结点
if i == 10:
bb8_node.remove()
# 添加型机器人Nao
if i == 20:
children_field.importMFNodeFromString(-1, 'Nao { }')
i += 1
我们将包含所有内容的此Group节点称为根节点。为了插入Nao robot,我们需要的引用实际上是对根节点的子字段的引用。
五、使用Supervisor跟踪目标位置
由于Supervisor拥有无限的权力,因此它是跟踪模拟演变的完美工具。在本节中,我们将使用所获得的知识来产生一个球,并在它下落时跟踪它的位置,当它接触地面时改变它的颜色。
同添加Nao的操作,将球Ball声明为一个IMPORTABLE EXTERNPROTO
from controller import Supervisor
TIME_STEP = 32
robot = Supervisor() # create Supervisor instance
# [CODE PLACEHOLDER 1]
# bb8_node = robot.getFromDef('BB-8')
# translation_field = bb8_node.getField('translation')
root_node = robot.getRoot()
children_field = root_node.getField('children')
children_field.importMFNodeFromString(-1, 'DEF BALL Ball { translation 0 1 1 }')
ball_node = robot.getFromDef('BALL')
color_field = ball_node.getField('color')
i = 0
while robot.step(TIME_STEP) != -1:
# [CODE PLACEHOLDER 2]
# if (i == 0):
# new_value = [2.5, 0, 0]
# translation_field.setSFVec3f(new_value)
# if i == 10:
# bb8_node.remove()
# if i == 20:
# children_field.importMFNodeFromString(-1, 'Nao { }')
position = ball_node.getPosition()
print('Ball position: %f %f %f\n' %(position[0], position[1], position[2]))
if position[2] < 0.2:
red_color = [1, 0, 0]
color_field.setSFColor(red_color)
i += 1
总结
通过本教程,已了解到:
- Supervisor只不过是一个具有额外权力的机器人,因此,使用机器人实例执行的任何操作都可以使用Supervisor实例来执行。
- Supervisor不受物理学的约束,因为它的权力是无限的,具有“欺骗”性。
- 每当希望使用Supervisor更改场景树时,需要获得参考:
- 要插入节点,需要包含该节点的字段的引用。
- 要删除节点,需要引用节点(即对象)本身。
- 要更改参数的值,如(位置、颜色、大小等),需要引用所述字段。
- 通过将机器人或对象定义为IMPORTABLE EXTERNPROTO并使用
importMFNodeFromString
API函数,可以实现机器人或对象的生成。