熟悉用户界面和Webots的基本概念。创建一个简单的仿真环境:一个有地板和墙壁的场地,几个盒子,一个电子冰球机器人以及一个使机器人运动的控制器程序。
1.安装启动webots
2.创建一个new world
3.添加一个电子冰球机器人
4.创建一个新的控制器
5.设置速度控制
world是一个包含对象信息的文件,其中包含了他们的外形,它们之间如何相互影响,天空是什么,如何定义重力,摩擦力,物体的质量,颜色模拟等等。不同的对象称为“ Nodes”,并在“ Scene Tree”中进行分层组织。因此,一个节点可能包含子节点。world存储在具有.wbt
扩展名的文件中。文件格式源自VRML97语言,并且易于阅读。世界文件必须直接存储在名为worlds
的目录中。
(1) 单击“向导(Wizards)”--“新建项目目录”,选择你喜欢的项目目录,这里是“my_first_simulation”;
(2) 命名world文件为“my_first_simulation.wbt”;
(3) 选择所有的复选框,包括默认情况下未选中的“Add a rectangle arena”。--“finish”
现在创建了第一个Webots world!3D视图应显示带有方格地板的正方形场地。可以使用鼠标在3D视图中移动视点:左按钮,右按钮和滚轮。“ Scene Tree”列出的节点包括:
WorldInfo:包含模拟的全局参数。
视点:定义主要视点相机参数。
TexturedBackground:定义场景的背景(如果稍微旋转视点,您应该看到山很远)
TexturedBackroundLight:定义与上述背景关联的光。
RectangleArena:定义到目前为止您在该场景中看到的唯一对象。
每个节点都有一些称为Fields的可自定义属性。可以通过修改这些字段以更改矩形区域:
双击`RectangleArena`场景树中的节点。这应该打开节点并显示其字段。
(1)选择该`floorTileSize`字段并将其值设置`0.25 0.25`为`0.5 0.5`。可以立即在3D视图中看到效果。
(2)选择该`wallHeight`字段并将其值更改`0.05`为`0.1`。场地的墙现在应该更低。
在场景树视图中,如果字段与默认值不同,则字段将以不同的颜色显示(取决于主题)。
在场景中添加一些对象,双击`RectangleArena`场景树中的将其关闭并选择它。单击场景树顶部的`Add`按钮。在打开的对话框中,选择`PROTO nodes (Webots Projects) / objects / factory / containers / WoodenBox (Solid)`。一个大盒子应该出现在舞台中央。在场景树中双击它以打开其字段。
(1)将其更改`size`为`0.1 0.1 0.1`而不是`0.6 0.6 0.6`。
(2)将其更改`translation`为`0 0.05 0`而不是`0 0.3 0`。或者,您可以使用3D视图中显示的绿色箭头来调整其`translation.y`字段。
(3)现在,在3D视图中按住Shift键并单击并拖动该框,然后将其移动到竞技场的某个角落。
(4)选择该框,然后按Ctrl-C,Ctrl-V(Windows,Linux)或Cmd-C,Cmd-V(macOS)进行复制和粘贴。按住Shift并单击并拖动新框,将其移到其他位置。用这种方法创建第三个框。
(5)移动这些框,以使任何框都不会位于竞技场的中心。您也可以使用绿色的旋转箭头沿垂直轴旋转框。也可以通过按住Shift并用鼠标右键拖动来完成。或者,您可以更改场景树中节点的`rotation`视场角度`WoodenBox`。**
(6)对结果满意后,请使用保存按钮保存世界。
e-puck是一款小型机器人,带有差速轮,10个LED和几个传感器,其中包括8个DistanceSensors和一个Camera。目前,我们仅对使用其轮子感兴趣。在接下来的教程中,将学习如何使用其他功能。现在,将向世界添加一个电子冰球模型。确保仿真已暂停并且虚拟时间已过,为0。如果不是这种情况,请使用Reset
按钮重置模拟。
当修改Webots世界以进行保存时,首先要暂停模拟并将其重新加载到其初始状态,这是基本的要求,即主工具栏上的虚拟计时器应显示0:00:00:000。否则,每次保存时,每个3D对象的位置都会累积错误。因此,对世界的任何修改都应按以下顺序执行:暂停,重置,修改和保存仿真。
这个e-puck节点实际上是一个PROTO节点,就像我们之前介绍的RectangleArena
或WoodenBox
一样。原型制作允许您创建自定义对象并重用它们。
(1)选择`WoodenBox`场景树视图的最后一个节点。单击场景树视图顶部的`Add`按钮!。
(2)在对话框中,选择`PROTO nodes (Webots Projects) / robots / gctronic / e-puck / E-puck (Robot)`。
(3)电子冰球机器人应该出现在舞台中央。移动和旋转此机器人,就像处理盒子一样。保存模拟并按下`运行`按钮!。
机器人应移动,LED闪烁,并避免障碍物。这是因为它具有具有该行为的默认控制器。
在仿真运行时,可以通过添加力看一下物体的物理属性。
(1)因为默认情况下,它们没有质量并且被视为粘在地板上,不可能对节点施加力,。要在节点上启用物理,您应该将其场设置为某个值(例如0.2 kg)。完成此操作后,也应该能够对它们施加力。
(2)按下*Alt +左键单击+拖动*,向机器人[施加力]。在Linux上,除了*Alt +左键单击+拖动*外,还应按*Ctrl*键。
现在,将编写一个简单的控制器,使机器人向前移动。Webots控制器可以用以下编程语言编写:C,C ++,Java,Python,MATLAB,ROS等。C,C ++和Java控制器必须先进行编译,然后才能作为机器人控制器运行。Python和MATLAB控制器是解释性语言,因此它们无需编译即可运行。此内容将使用C++作为参考语言。
使用菜单创建一个新的C++控制器`EPuckGoForward`:
(1)单机`(向导)Wizards /(新机器人控制器) New Robot Controlle`。
(2)目录选择`my_first_simulation/controllers`。选择在文本编辑器中打开源文件的选项。
直接上代码
#include
// Added a new include file
#include
#define TIME_STEP 64
// All the webots classes are defined in the "webots" namespace
using namespace webots;
int main(int argc, char **argv) {
Robot *robot = new Robot();
// get the motor devices
Motor *leftMotor = robot->getMotor("left wheel motor");
Motor *rightMotor = robot->getMotor("right wheel motor");
// set the target position of the motors
leftMotor->setPosition(10.0);
rightMotor->setPosition(10.0);
while (robot->step(TIME_STEP) != -1);
delete robot;
return 0;
}
保存修改后的源代码(File / Save Text File
),然后进行编译。当Webots建议重置或重新加载世界时,请选择Reset
,并将控制器选择为新的控制器,运行仿真。
机器人的轮子通常是通过速度控制的,而不是像前面的示例那样通过位置控制的。为了控制车轮的电动机的速度,您需要将目标位置设置为无穷大并设置所需的速度:
上代码
#include
// Added a new include file
#include
#include
#define TIME_STEP 64
#define MAX_SPEED 6.28
// All the webots classes are defined in the "webots" namespace
using namespace webots;
int main(int argc, char **argv) {
Robot *robot = new Robot();
// get a handler to the motors and set target position to infinity (speed control)
Motor *leftMotor = robot->getMotor("left wheel motor");
Motor *rightMotor = robot->getMotor("right wheel motor");
leftMotor->setPosition(INFINITY);
rightMotor->setPosition(INFINITY);
// set up the motor speeds at 10% of the MAX_SPEED.
leftMotor->setVelocity(0.1 * MAX_SPEED);
rightMotor->setVelocity(0.1 * MAX_SPEED);
while (robot->step(TIME_STEP) != -1);
delete robot;
return 0;
}
现在,机器人将移动(轮子将以每秒1弧度的速度旋转)并且永不停止。(不要忘了编译,选择对应的控制器)。
官方给的代码中没有#include