第一篇教程的目的是让您熟悉用户界面和 Webot 的基本概念。您将创建第一个包含简单环境的模拟:一个有地板和墙壁的竞技场、几个盒子、一个电子冰球机器人和一个使机器人移动的控制器程序。
启动Webots软件
一个世界是一个文件,其中包含诸如物体的位置、它们的外观、它们如何相互作用、天空的颜色是什么、重力、摩擦力、物体质量等的定义等信息。它定义了模拟的初始状态。不同的对象称为节点,并在场景树中分层组织。因此,一个节点可能包含子节点。世界存储在扩展名为 .wbt 的文件中。文件格式源自 VRML97 语言,并且是人类可读的。世界文件必须直接存储在名为 worlds 的目录中。
选择next
最好为每个工程项目新建一个目录,然后选择目录next
这里可以更改世界的名字,然后next
右键Add添加机器人
这个机器人自带一个避障的控制器
e-puck 是一个小型机器人,具有差动轮、10 个 LED 和多个传感器,包括 8 个距离传感器和一个摄像头。在本教程中,我们只对使用它的轮子感兴趣。我们将在接下来的教程中学习如何使用其他功能。
机器人应该移动、闪烁 LED 并避开障碍物。那是因为它有一个具有该行为的默认控制器。您可能已经注意到 3D 视图的左上角出现了一个黑色的小窗口。它显示了 e-puck 机器人的相机拍摄的图像。在机器人的控制器明确启用相机之前,此图像将保持黑色。这个小图像窗口可以通过拖动来移动。也可以通过拖动右下角来调整大小。最后,可以通过点击右上角的“x”来关闭它。您可以通过在“相机设备”子菜单中选择它,使其从“叠加”菜单再次可见。因为我们不需要它,所以您实际上可以将其关闭。
可以尝试通过这几个按钮进行单步仿真、暂停/开始、启动仿真、快速仿真(无画面)
可以看到这个机器人已经初步具备避障的功能。这里我们使用的是他自带的控制器,代码在安装目录下。接下来我们可以新建一个控制器。
我们现在将编写一个简单的控制器,使机器人向前移动。
控制器是定义机器人行为的程序。 Webots控制器可以用以下编程语言编写:C、C++、Java、Python、MATLAB、ROS等。C、C++和Java控制器需要编译后才能作为机器人控制器运行。 Python 和 MATLAB 控制器是解释型语言,因此它们无需编译即可运行。在本教程中,我们将使用 C 作为参考语言,但所有代码片段也可用于 C++、Java、Python 和 MATLAB。
Robot 节点的 controller 字段指定当前与机器人相关联的控制器。请注意,同一个控制器可以被多个机器人使用,但一个机器人一次只能使用一个控制器。每个控制器都在通常由 Webot 生成的单独子进程中执行。因为它们是独立的进程,所以控制器不共享相同的地址空间,并且可以在不同的处理器内核上运行。
新建控制器,Wizards->New Robot Controller
点击next
选择控制器代码使用的语言,然后next
使用webots自带的编译器还是VS进行编译,这里选用Webots即可,点击next
定义控制器的名字,这里我改成了epuck_go_forward,点击next
点击finish
选择刚才新建的controller epuck_go_forward
右侧代码区放入如下代码,保存。
#include
// Added a new include file
#include
#define TIME_STEP 64
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, 10.0);
wb_motor_set_position(right_motor, 10.0);
while (wb_robot_step(TIME_STEP) != -1);
wb_robot_cleanup();
return 0;
}
接下来编译控制器的C文件
若提问是否保存,点击save,替换初始的wbt文件。
如果一切正常,您的机器人应该会向前移动。机器人将以其最大速度移动一段时间,然后在轮子旋转 10 弧度后停止。
在项目的控制器目录中,已创建包含 epuck_go_forward控制器的目录。 epuck_go_forward目录包含一个在控制器编译后生成的 e-puck_go_forward二进制文件(在 Windows 上,此文件具有 .exe 扩展名)。控制器目录名称应与二进制名称匹配。
可以看到机器人往前直走,往墙上撞。在控制器目录有我们的C代码和编译出的exe可执行文件。
机器人的轮子通常是以速度控制的,而不是像我们在前面的例子中那样以位置控制。为了控制车轮马达的速度,你需要将目标位置设置为无限大,并设置所需的速度。
机器人现在将移动(轮子将以每秒 1 弧度的速度旋转)并且永不停止。如果没有任何反应,请不要忘记通过选择 Build / Build 菜单项或单击代码区域上方的齿轮图标来编译您的代码。编译错误在控制台中以红色显示。如果有,修复它们并重试编译。然后,重新加载世界。
我们和第四步类似新建一个控制器epuck_speed_forward
这里参考第四步
更改为如下代码
#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 a handler to the motors and set target position to infinity (speed control)
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, INFINITY);
wb_motor_set_position(right_motor, INFINITY);
// set up the motor speeds at 10% of the MAX_SPEED.
wb_motor_set_velocity(left_motor, 0.1 * MAX_SPEED);
wb_motor_set_velocity(right_motor, 0.1 * MAX_SPEED);
while (wb_robot_step(TIME_STEP) != -1) {
}
wb_robot_cleanup();
return 0;
}
我们希望您喜欢创建您的第一个 Webots 模拟。您已经能够建立一个世界,添加一个机器人并对其进行编程。重要的是你学会了下面总结的基本概念: