webots(一):创建一个简单的仿真环境

webots(一):创建一个简单的仿真环境

目的:

熟悉用户界面和Webots的基本概念。创建一个简单的仿真环境:一个有地板和墙壁的场地,几个盒子,一个电子冰球机器人以及一个使机器人运动的控制器程序。

 

目录:

1.安装启动webots

2.创建一个new world

3.添加一个电子冰球机器人

4.创建一个新的控制器

5.设置速度控制

 

实践:(代码块里为具体操作)

1.安装不做赘述

2.创建一个new world

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(一):创建一个简单的仿真环境_第1张图片

 现在创建了第一个Webots world!3D视图应显示带有方格地板的正方形场地。可以使用鼠标在3D视图中移动视点:左按钮,右按钮和滚轮。“ Scene Tree”列出的节点包括:

  • WorldInfo:包含模拟的全局参数。

  • 视点:定义主要视点相机参数。

  • TexturedBackground:定义场景的背景(如果稍微旋转视点,您应该看到山很远)

  • TexturedBackroundLight:定义与上述背景关联的光。

  • RectangleArena:定义到目前为止您在该场景中看到的唯一对象。

    每个节点都有一些称为Fields的可自定义属性。可以通过修改这些字段以更改矩形区域:

    webots(一):创建一个简单的仿真环境_第2张图片

双击`RectangleArena`场景树中的节点。这应该打开节点并显示其字段。
​
(1)选择该`floorTileSize`字段并将其值设置`0.25 0.25`为`0.5 0.5`。可以立即在3D视图中看到效果。
​
(2)选择该`wallHeight`字段并将其值更改`0.05`为`0.1`。场地的墙现在应该更低。

                                                 webots(一):创建一个简单的仿真环境_第3张图片

        在场景树视图中,如果字段与默认值不同,则字段将以不同的颜色显示(取决于主题)。

在场景中添加一些对象,双击`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)对结果满意后,请使用保存按钮保存世界。

webots(一):创建一个简单的仿真环境_第4张图片

3.添加一个电子冰球机器人

e-puck是一款小型机器人,带有差速轮,10个LED和几个传感器,其中包括8个DistanceSensors和一个Camera。目前,我们仅对使用其轮子感兴趣。在接下来的教程中,将学习如何使用其他功能。现在,将向世界添加一个电子冰球模型。确保仿真已暂停并且虚拟时间已过,为0。如果不是这种情况,请使用Reset按钮重置模拟

当修改Webots世界以进行保存时,首先要暂停模拟并将其重新加载到其初始状态,这是基本的要求,即主工具栏上的虚拟计时器应显示0:00:00:000。否则,每次保存时,每个3D对象的位置都会累积错误。因此,对世界的任何修改都应按以下顺序执行:暂停,重置,修改和保存仿真

这个e-puck节点实际上是一个PROTO节点,就像我们之前介绍的RectangleArenaWoodenBox一样。原型制作允许您创建自定义对象并重用它们。

(1)选择`WoodenBox`场景树视图的最后一个节点。单击场景树视图顶部的`Add`按钮!。
​
(2)在对话框中,选择`PROTO nodes (Webots Projects) / robots / gctronic / e-puck / E-puck (Robot)`。
​
(3)电子冰球机器人应该出现在舞台中央。移动和旋转此机器人,就像处理盒子一样。保存模拟并按下`运行`按钮!。

 机器人应移动,LED闪烁,并避免障碍物。这是因为它具有具有该行为的默认控制器。

webots(一):创建一个简单的仿真环境_第5张图片

 在仿真运行时,可以通过添加力看一下物体的物理属性。

(1)因为默认情况下,它们没有质量并且被视为粘在地板上,不可能对节点施加力,。要在节点上启用物理,您应该将其场设置为某个值(例如0.2 kg)。完成此操作后,也应该能够对它们施加力。
​
(2)按下*Alt +左键单击+拖动*,向机器人[施加力]。在Linux上,除了*Alt +左键单击+拖动*外,还应按*Ctrl*键。

                                                          webots(一):创建一个简单的仿真环境_第6张图片

webots(一):创建一个简单的仿真环境_第7张图片

4.创建一个新的控制器

现在,将编写一个简单的控制器,使机器人向前移动。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`。选择在文本编辑器中打开源文件的选项。

webots(一):创建一个简单的仿真环境_第8张图片

直接上代码

#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,并将控制器选择为新的控制器,运行仿真。

webots(一):创建一个简单的仿真环境_第9张图片

5.速度控制

机器人的轮子通常是通过速度控制的,而不是像前面的示例那样通过位置控制的。为了控制车轮的电动机的速度,您需要将目标位置设置为无穷大并设置所需的速度:

上代码

#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 ,导致编译时INFINITY未定义。不知大家的是什么情况,看过相关文档之后本人添加了#include ,解决了问题。

你可能感兴趣的:(webots)