World:定义了仿真的环境,提供各个obj的位置信息,交互方式,基础物理属性等内容,文件后缀名为.wbt,文件内使用可读的VRML97语言。world文件会集中存放在一个worlds文件夹中。
Nodes:obj称作节点,节点可以包含子节点
Fields:包含了每个节点的相关属性
Scene tree:存储在webots中的的节点被以一种叫做Scene tree的方式进行组织
向导-新项目目录-创建名为my_firstsimulation的项目
创建名为my_first_simulation的world文件(勾选所有tag)
一个仿真项目存储在一个对应的文件夹中(win10默认存储在文档目录下)
项目内部有小的文件夹
现在来看软件内,大概类似这样
主窗口中是scene tree的3d展示,在左侧的是scene tree view,我们主要在其中修改节点和字段,其主要包含以下节点:
WorldInfo:包含模拟的全局变量,如title gravity FPS等
Viewpoint:提供主视角相机的参数,如朝向,位置等
TexturedBackground:包含背景的信息
TexturedBackgroundLight:背景中的光源信息
RectangleArena:定义展示区域的信息,如墙的高度,矩形的大小等
现在尝试对RectangleArena中的wallheight和floorTileSize进行修改
我们可以在场景中添加一些软件预设的节点,并更改他们的属性
点击最上方的+,从protonodes(webots projects)/objects/containers/中选择woodenbox,并在左侧修改其属性
按shift键,可以在场景中拖动木箱
shift点击木箱上的箭头可以完成其在三个方向上的旋转
ctrl-c ctrl-v可以复制粘贴多个木箱
ctrl-shift-s保存当前文件
在你对自己的仿真做出修改时,一定要记住先reset,使得虚拟计时器归零,否则每次保存时,每个3D对象的位置会积累错误。要记住任何修改都要按照如下顺序操作:暂停,重置,修改,保存。
现在我们点击+,找见并添加一个E-puck机器人,保存后点击Run按钮开始仿真,可以看到机器人闪烁着LED灯开始圆周移动,同时右上角有一个黑色的小窗口,这个我们之后会开启。
按下alt拖拽机器人可以施加一个力
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;
}
之前的控制器使得机器人可以移动到对应位置,现在来创造一个速度控制器
直接在原来代码上修改
#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()函数设定速度即可。