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

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

1. 准备

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

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

2. 新建工作空间 打开webots,在顶部工具栏中找到

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

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

注意:添加机器人前,确保仿真环境已经暂停,且虚拟时间为0。如下图所示。 file 当一个世界被保存,但是存在被修改的时候,暂停时间和模拟并且重新加载到其初始状态是很重要的。否则在每次保存时,每个3D对象的位置会累计误差。因此,对任何世界的修改都应该按照如下顺序执行:暂停、重置、修改、保存、模拟。

选择左边窗口的添加按钮 file

然后依次选择

PROTO nodes (Webots Projects) / robots / gctronic / e-puck / E-puck (Robot) 添加一个 e-punk机器人。此时,机器人会出现在地板的中央位置。

4. 创建一个控制器

控制器是控制机器人行为的程序。在webots中可以用以下程序编写:C、C++、Java、Python、MATLAB、ROS。这里我们用C++。 需要注意的是,机器人节点的控制器名字指定当前与之关联的机器人。同一个控制器可以被重复使用。

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

e-punk机器的反馈回路如下图 file 在工具栏找到

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

代码编辑完毕以后,点击文本编辑栏的保存,然后编译该文件。 file 编译完成后,该控制器就会被加载到e-punk的控制器属性中。按照下图所示进行操作,选择我们刚刚编译好的控制器,点击ok进行更换。 file

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

  • End -

技术发展的日新月异,阿木实验室将紧跟技术的脚步,不断把机器人行业最新的技术和硬件推荐给大家。看到经过我们培训的学员在技术上突飞猛进,是我们培训最大的价值。如果你在机器人行业,就请关注我们的公众号,我们将持续发布机器人行业最有价值的信息和技术。 阿木实验室致力于前沿IT科技的教育和智能装备,让机器人研发更高效!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章