技术分享 | 带你从webots中搭建第一个仿真环境


前言

前面的文章介绍了webots的安装和简单使用,今天我们来创建一个简单的webots世界和一个简单的控制器,该控制器会让机器人在世界中进行避障。废话不多说,现在就开始吧

1. 准备

webots世界其实是一个文件。文件中包含诸如物体在哪里、它们看起来像什么、它们如何相互作用、天空的颜色是什么、如何定义重力、摩擦力、物体质量等信息。它定义了模拟的初始状态。不同的对象称为节点,并在场景树中分层组织

webots世界以






.wbt

扩展名存储在计算机中。并且世界文件必须存在名为 worlds 的目录中。因此,我们要先新建一个工作空间

2. 新建工作空间

打开webots,在顶部工具栏中找到






Wizards -> New Project Directory

然后一路next,选择你要保存的路径,并且重命名世界名称,然后在世界的设置中,勾选所有项。此时一个世界就创建好了,如下图所示:

微信图片_20211202092535.png

3. 添加一个机器人

这里选择 e-puck 机器人。e-puck 是一个小型机器人,具有差速轮、10 个 LED 和多个传感器,包括 8 个距离传感器和一个摄像头。如下图所示。

微信图片_20211202092705.png

注意:添加机器人前,确保仿真环境已经暂停,且虚拟时间为0。如下图所示。

微信图片_20211202092730.png

当一个世界被保存,但是存在被修改的时候,暂停时间和模拟并且重新加载到其初始状态是很重要的。否则在每次保存时,每个3D对象的位置会累计误差。因此,对任何世界的修改都应该按照如下顺序执行:暂停、重置、修改、保存、模拟

选择左边窗口的添加按钮

微信图片_20211202092737.png

然后依次选择






PROTO nodes (Webots Projects) / robots / gctronic / e-puck / E-puck (Robot)

添加一个 e-punk机器人。此时,机器人会出现在地板的中央位置。

4. 创建一个控制器

控制器是控制机器人行为的程序。在webots中可以用以下程序编写:CC++JavaPythonMATLABROS。这里我们用C++。

需要注意的是,机器人节点的控制器名字指定当前与之关联的机器人。同一个控制器可以被重复使用。

这个部分就是仿真的核心内容了,你可以将你的算法部署在这个地方,进行算法验证

e-punk机器的反馈回路如下图

微信图片_20211202092850.png

在工具栏找到






Wizard -> New Robot Controller

语言选择C++,然后重命名这个控制器,接着一路next。我们就会看到一个文本编辑窗口出现在左侧。将以下代码复制进去:

在工具栏找到






Wizard -> New Robot Controller

语言选择C++,然后重命名这个控制器,接着一路next。我们就会看到一个文本编辑窗口出现在左侧。将以下代码复制进去:






// File: my_controller.cpp// Date: 2021.12.1// Description: 用于在webots中,控制e-puck机器人避障// Author: Loren// Modifications://webos必要头文件#include <webots/Robot.hpp>#include <webots/DistanceSensor.hpp> #include <webots/Motor.hpp>//定义常量#define TIME_STEP 64#define MAX_SPEED 6.28//所有 webots 类都定义在“webots”命名空间中using namespace webots;int main(int argc, char** argv){//创建机器人对象Robot *robot = new Robot();//初始化传感器// e-puck机器人有8个红外传感器DistanceSensor *ps[8];char psNames[8][4] = {"ps0", "ps1", "ps2", "ps3","ps4", "ps5", "ps6", "ps7"};//依次读取每个传感器的编号for (int i = 0; i < 8; i++){ps[i] = robot->getDistanceSensor(psNames[i]);ps[i]->enable(TIME_STEP);}//初始化电机Motor *LeftMotor = robot->getMotor("left wheel motor");Motor *RightMotor = robot->getMotor("right wheel motor");LeftMotor->setPosition(INFINITY);RightMotor->setPosition(INFINITY);LeftMotor->setVelocity(0.0);RightMotor->setVelocity(0.0);//开始反馈循环(参照反馈图)while (robot->step(TIME_STEP) != -1){//读取传感器输出值double psValues[8];for (int i = 0; i < 8; i++){psValues[i] = ps[i]->getValue();}//检测障碍物(参考e-puck传感器范围图)bool right_obstacle = psValues[0] > 80.0|| psValues[1] > 80.0|| psValues[2] > 80.0;bool left_obstacle = psValues[5] > 80.0|| psValues[6] > 80.0|| psValues[7] > 80.0;// 初始化电机速度为50%double LeftSpeed = 0.5 * MAX_SPEED;double RightSpeed = 0.5 * MAX_SPEED;//根据障碍物情况,调整实际的速度if (left_obstacle){//检测到左边有障碍物,就向右转LeftSpeed = 0.5 * MAX_SPEED;RightSpeed = -0.5 *MAX_SPEED;}else if (right_obstacle){//检测到右边有障碍物,就向左转LeftSpeed = -0.5 * MAX_SPEED;RightSpeed = 0.5 * MAX_SPEED;}//将速度给到电机LeftMotor->setVelocity(LeftSpeed);RightMotor->setVelocity(RightSpeed);}delete robot; //程序结束后释放内存return 0;}

代码编辑完毕以后,点击文本编辑栏的保存,然后编译该文件。

微信图片_20211202092922.png

编译完成后,该控制器就会被加载到e-punk的控制器属性中。按照下图所示进行操作,选择我们刚刚编译好的控制器,点击ok进行更换。

微信图片_20211202092948.png

仿真结果

Peek-2021-12-01-10-53-改.gif

结语

webots仿真器十分强大,其控制的仿真,支持多种语言编程,也支持各种各样的机器人。我们可以利用该软件进行各种仿真的验证(通过添加控制器的方式)。即使没有ROS,也能进行验证。

阿木实验室致力于前沿IT科技的教育和智能装备,让机器人研发更高效!

公众号:阿木实验室 ( 领取免费资料包)

官方淘宝店:阿木实验室(可购买硬件配件)

硬件咨询:yanyue199506(欢迎洽谈合作)

课程咨询:jiayue199506 (免费领取机器人工程师学习计划)

  • End -

技术发展的日新月异,阿木实验室将紧跟技术的脚步,不断把机器人行业最新的技术和硬件推荐给大家。看到经过我们培训的学员在技术上突飞猛进,是我们培训最大的价值。如果你在机器人行业,就请关注我们的公众号,我们将持续发布机器人行业最有价值的信息和技术。