30分钟上手你的第一个Webots模拟程序

文章目的:使您熟悉用户界面和Webots的基本概念。您将创建第一个包含简单环境的模拟:一个有地板和墙壁的竞技场,几个盒子,一个Epuck机器人以及一个使机器人运动的控制器程序。
前提:已经安装Webots

1.打开软件

通过双击Webot的图标(或在终端的命令行中调用它)来启动Webots。
在这里插入图片描述

2.创建新World

一个World(世界)是包含像对象是一个信息的文件,他们的样子,它们如何相互影响,天空是什么,如何定义重力,摩擦力,物体的质量,等它定义的颜色模拟的初始状态。不同的对象称为“Nodes(节点)”,并在“Scene Tree(场景树)”中进行分层组织。因此,一个节点可能包含子节点。World(世界)存储在具有.wbt扩展名的文件中。文件格式源自VRML97语言,并且易于阅读。World(世界)文件必须直接存储在名为worlds的目录中

单击Pause3D视图的按钮暂停当前​​模拟。
在这里插入图片描述
如果主工具栏上的虚拟时间计数器已停止,则模拟将暂停。
在这里插入图片描述
Wizards通过选择New Project Directory… 菜单项从菜单创建一个新项目,并按照说明进行操作:
在这里插入图片描述
选择New Project Directory…
在这里插入图片描述

  • 命名项目目录:my_project改为my_first_simulation
    在这里插入图片描述
    命名世界文件empty.wbt改为my_first_simulation.wbt
    在这里插入图片描述
    单击所有复选框,包括默认情况下未选中的“Add a rectangle area”。
    在这里插入图片描述
    点击“Next
    Webots显示它刚刚创建的目录和文件的列表。这对应于Webots项目的标准文件层次结构。单击Finish(Windows,Linux)或Done(macOS)按钮以关闭此窗口。
    在这里插入图片描述
    恭喜,您刚刚创建了第一个Webots世界!3D视图应显示带有方格地板的正方形竞技场。您可以使用鼠标的左键,右键和滚轮在3D视图中移动视点。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    双击RectangleArena场景树中的节点。这应该打开节点并显示其字段。
    在这里插入图片描述
    选择该floorTileSize字段并将其值0.5 0.5设置为0.25 0.25。您应该立即在3D视图中看到效果。网格更多了!
    在这里插入图片描述
    选择该wallHeight字段并将其值0.1更改为0.05。竞技场的墙现在应该更低。
    在这里插入图片描述

双击RectangleArena场景树中的将其收起并选择它。单击Add场景树顶部的按钮(加号)。在打开的对话框中,选择PROTO nodes (Webots Projects) / objects / factory / containers / WoodenBox (Solid)。一个大盒子应该出现在舞台中央。在场景树中双击它以打开其字段。

  • 1.将其size值0.6 0.6 0.6替换为0.1 0.1 0.1。
  • 2.将其translation值0 0.3 0替换为0 0.05 0。
  • 3.现在,在3D视图中按住Shift键并单击并拖动该框,然后将其移动到竞技场的某个角落。
  • 4.选择该框,然后按Ctrl-C,Ctrl-V(Windows,Linux)或Cmd-C,Cmd-V(macOS)进行复制和粘贴。按住Shift并单击并拖动新框,将其移到其他位置。用这种方法创建第三个框。
  • 5.移动这些框,以使任何框都不会位于竞技场的中心。您也可以使用绿色的旋转箭头沿垂直轴旋转框。也可以通过按住Shift并用鼠标右键拖动来完成。或者,您可以更改场景树中节点的rotation视场角度WoodenBox。
  • 6.对结果满意后,请使用保存按钮保存世界。
    在这里插入图片描述
    效果如下:
    在这里插入图片描述
    选择场景树视图的最后一个节点WoodenBox。单击场景树视图顶部的按钮Add(加号)。在对话框中,选择PROTO nodes (Webots Projects) / robots / gctronic / e-puck / E-puck (Robot)。Epuck1机器人应该出现在舞台中央。移动和旋转此机器人,就像处理盒子一样。保存模拟并按下Run real-time按钮。效果如下:
    在这里插入图片描述
    按下Alt +左​​键单击+拖动,可以向机器人施加外力。
    (在Linux上,除了Alt +左​​键单击+拖动外,还应按Ctrl键。)
    不可以对节点WoodenBox施加力,因为默认情况下,它们没有质量并且被视为粘在地板上。要在节点WoodenBox上启用外力,您应该将其质量场mass设置为某个值(例如0.2 kg)。完成此操作后,也应该能够对它们施加力。
    在这里插入图片描述
    暂停仿真并还原它。在“Scene Tree(场景树)”视图中,展开WorldInfo节点(第一个节点)。将其basicTimeStep字段设置为16。然后保存模拟。这将提高模拟的准确性和稳定性(但会降低最大模拟速度)。
    在这里插入图片描述
    使用菜单Wizards / New Robot Controller…
    在这里插入图片描述
    创建一个新的C(或其他语言)控制器e-puck_go_forward
    (对于C ++和Java则称为EPuckGoForward)。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    这将在目录my_first_simulation/controllers中创建一个新e-puck_go_forward(或EPuckGoForward)。

勾选提供您在文本编辑器中打开源文件的选项。 Open source file in Text Editor.
在这里插入图片描述
在场景树视图中,选择E-puck节点的controller字段,然后使用“场景树”视图底部的字段编辑器:按Select…按钮,
在这里插入图片描述
然后在列表中选择
e-puck_go_forward

在这里插入图片描述
一旦控制器与机器人关联,就可以保存World
修改程序:
通过插入include语句(#include <webots/motor.h>),获取电机设备(WbDeviceTag motor = wb_robot_get_device(“motor_name”);)和应用电机命令(wb_motor_set_position(motor, 10);)

#include <webots/robot.h>

// Added a new include file
#include <webots/motor.h>

#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;
}

保存修改后的源代码(File/Save Text File),然后进行编译(Build/Build)。
在这里插入图片描述
如有必要,请修复所有编译错误。
在这里插入图片描述
当Webots建议重置或重新加载世界时,请选择Reset并运行模拟。
在这里插入图片描述
如下所示修改控制器程序,重新编译并运行它:

#include <webots/robot.h>

// Added a new include file
#include <webots/motor.h>

#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;
}

现在,机器人将移动(轮子将以每秒1弧度的速度旋转)并且永不停止。
如果没有任何反应,请不要忘记选择Build / Build菜单项
在这里插入图片描述
或单击代码区域上方的齿轮图标来编译代码。
在这里插入图片描述
编译错误在控制台中以红色显示。如果有,修复它们,然后重试编译。然后,重新加载世界。

发布了35 篇原创文章 · 获赞 15 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/ben_xiao_hai_123/article/details/104249729
今日推荐