[搬运]Webots 入门教程 1

Webots Tutorial 1

Your first simulation in webots

Create a new world

World:定义了仿真的环境,提供各个obj的位置信息,交互方式,基础物理属性等内容,文件后缀名为.wbt,文件内使用可读的VRML97语言。world文件会集中存放在一个worlds文件夹中。

Nodes:obj称作节点,节点可以包含子节点

Fields:包含了每个节点的相关属性

Scene tree:存储在webots中的的节点被以一种叫做Scene tree的方式进行组织


向导-新项目目录-创建名为my_firstsimulation的项目

[搬运]Webots 入门教程 1_第1张图片

创建名为my_first_simulation的world文件(勾选所有tag)

[搬运]Webots 入门教程 1_第2张图片

一个仿真项目存储在一个对应的文件夹中(win10默认存储在文档目录下)

项目内部有小的文件夹
[搬运]Webots 入门教程 1_第3张图片
现在来看软件内,大概类似这样

主窗口中是scene tree的3d展示,在左侧的是scene tree view,我们主要在其中修改节点和字段,其主要包含以下节点:

WorldInfo:包含模拟的全局变量,如title gravity FPS等

Viewpoint:提供主视角相机的参数,如朝向,位置等

TexturedBackground:包含背景的信息

TexturedBackgroundLight:背景中的光源信息

RectangleArena:定义展示区域的信息,如墙的高度,矩形的大小等


现在尝试对RectangleArena中的wallheight和floorTileSize进行修改

[搬运]Webots 入门教程 1_第4张图片


我们可以在场景中添加一些软件预设的节点,并更改他们的属性


点击最上方的+,从protonodes(webots projects)/objects/containers/中选择woodenbox,并在左侧修改其属性

[搬运]Webots 入门教程 1_第5张图片

按shift键,可以在场景中拖动木箱

shift点击木箱上的箭头可以完成其在三个方向上的旋转

ctrl-c ctrl-v可以复制粘贴多个木箱
[搬运]Webots 入门教程 1_第6张图片
[搬运]Webots 入门教程 1_第7张图片
ctrl-shift-s保存当前文件


Add an e-punk robot

在你对自己的仿真做出修改时,一定要记住先reset,使得虚拟计时器归零,否则每次保存时,每个3D对象的位置会积累错误。要记住任何修改都要按照如下顺序操作:暂停,重置,修改,保存。

现在我们点击+,找见并添加一个E-puck机器人,保存后点击Run按钮开始仿真,可以看到机器人闪烁着LED灯开始圆周移动,同时右上角有一个黑色的小窗口,这个我们之后会开启。
[搬运]Webots 入门教程 1_第8张图片
按下alt拖拽机器人可以施加一个力
[搬运]Webots 入门教程 1_第9张图片

Create a new controller

controller可以控制小车的移动,其也是一种节点,同一种控制器可以在不同的机器人上使用,进程彼此独立,不互相影响,但是同一个机器人只能使用一种控制器。

现在我们来为机器人用C和C++添加一个新的controller使其只能向前移动

在E-puck的域内,这个是其原有的控制器
在这里插入图片描述
点击向导-新机器人控制器-C-IDE选webots就好,创建控制器名为epuck_go_forward.

接下来,我们需要在左侧的窗口编辑源代码

#include 
#include 
#define TIME_STEP 64
int main(int argc char ** arg){
  wb_robot_init();
  WbDeviceTag left_motor = wb_robot_get_device("left wheel motor");
  WbDeviceTag right_motor = wb_robot_get_device("right wheel motor");
  //设置目标点
  wb_motor_set_position(left_motor,10.0);
  wb_motor_set_position(right_motor,10.0);
  while(wb_robot_step(TIME_STEP)!=-1);
  wb_robot_cleanup();
  return 0;
}

保存,编译(Build,齿轮形状),更改controller为新写的,运行仿真,看到机器人向前前进到目标位置。


在controller文件夹中可以看到对应的可执行文件。

还可以用c++编写

#include 
#include 
#define TIME_STEP 64

using namespace webots;

int main(){
  Robot *robot = new Robot();
  Motor *left = robot->getMotor("left wheel motor");
  Motor *right = robot->getMotor("right wheel motor");
  
  left->setPosition(10.0);
  right->setPosition(10.0);
  
  while(robot->step(TIME_STEP)!=-1);
  
  delete robot;
  return 0;
}

Extend the controller to speed control

之前的控制器使得机器人可以移动到对应位置,现在来创造一个速度控制器

直接在原来代码上修改

#include 

// Added a new include file
#include 

#define TIME_STEP 64

#define MAX_SPEED 6.28

int main(int argc, char **argv) {
 wb_robot_init();

 // get the motor devices
 WbDeviceTag left_motor = wb_robot_get_device("left wheel motor");
 WbDeviceTag right_motor = wb_robot_get_device("right wheel motor");
 // set the target position of the motors
 wb_motor_set_position(left_motor, INFINITY);
 wb_motor_set_position(right_motor, INFINITY);

 //set up the speed to 30% of the MAX_SPEED
 wb_motor_set_velocity(left_motor,0.3*MAX_SPEED);
 wb_motor_set_velocity(right_motor,0.3*MAX_SPEED);
 

 while (wb_robot_step(TIME_STEP) != -1);
 wb_robot_cleanup();
 return 0;
}

编译后运行仿真,发现小车会匀速向前运动

同样的,我们也可以用c++来写

原理类似,先设置位置为INFINITY,然后使用setVelocity()函数设定速度即可。

你可能感兴趣的:(webots)