系列文章目录

【webots教程】简介与软硬件要求

【webots教程】安装

【webots教程】关于webots的超详细介绍

【webots教程】你在webots搭建的第一个仿真环境

【webots教程】编写你的第一个控制器

【webots教程】简单的避障机器人


文章目录

  • 系列文章目录
  • 前言
  • 一、创建一个新的世界
  • 二、epuck模型
  • 三、避障控制器
    • 1、加载头文件
    • 2、main函数部分
    • 3、添加功能
    • 4、完整代码

前言

现在我们开始解决与编程机器人控制器有关的主题。我们将设计一个简单的控制器,避免前面教程中创建的障碍(箱子)。

本教程将向您介绍Webots中机器人编程的基础。在本章的最后,您应该了解场景树节点和控制器API之间的链接是什么,如何初始化和清理机器人控制器,如何初始化机器人设备,如何获取传感器值,如何命令执行器,以及如何编写简单的反馈回路。

本教程仅解决Webots函数的正确用法。机器人算法的研究超出了本教程的目标,因此此处不再赘述。处理本章需要一些基本的编程知识。

一、创建一个新的世界

此处我们不打算从零开始创建一个新环境,将上一篇文章中创建的仿真环境另存为,取名为avoid_collision。我们将在此仿真的基础上修改我们的控制器以实现简单的避障功能。为了更好地体现避障效果,我们多添加几个箱子。

二、epuck模型

控制器编程需要一些与e-puck模型有关的信息。为了编写防撞算法,我们需要读取位于其转塔周围的8个红外距离传感器的值,根据传感器读数驱动两个车轮。在下图中显示了距离传感器的分布。

距离传感器由机器人层次结构中的8个DistanceSensor节点建模。这些节点由其name字段(从ps0到ps7)引用。以后后我们再解释如何定义这些节点。

现在,我只需要指导,可以通过Webots 的相关API(定义在webots/distance_sensor.h内),可以访问DistanceSensor节点。

距离传感器返回的值在0到4096之间缩放(逐段线性变化到距离)。4096表示测量到的光量很大(障碍物很近),0表示没有测量到的光量(没有障碍物)。

更多有关API函数的文档以及每个节点的说明,可以参考webots的《参考手册》。

三、避障控制器

这一章我们将编写一个控制器,是机器人能够实现简单的避免碰撞的行为。他的简单运行原理如下:机器人前进过程中不断监测8个距离传感器的读数,检测是否存在障碍物,如果有,则转向无障碍物的方向。同样,我们新建一个控制器名为avoid_collision


将机器人链接到我们的新控制器

1、加载头文件

在控制器文件的开头,添加与RobotDistanceSensorMotor节点相关的头文件,以便能够使用相应的API:

#include <webots/Robot.hpp>
#include <webots/DistanceSensor.hpp>
#include <webots/Motor.hpp>

include语句之后添加一个宏,该宏定义每个物理步骤的持续时间。该宏将用作Robot::step函数的参数,还将用于启用设备。此持续时间以毫秒为单位指定,并且必须是WorldInfo节点basicTimeStep字段中值的倍数。

#define TIME_STEP 64

最后,webots类所需的命名空间。

using namespace webots;

部分代码在webots新创建控制器时会自动添加,我们可以按需更改

2、main函数部分

main函数是控制器程序开始执行的地方。传递给main函数的参数由Robot节点的controllerArgs字段给出。main函数的默认模板如下所示。

// entry point of the controller
int main(int argc, char **argv) {// create the Robot instance.Robot *robot = new Robot();// initialize devices// feedback loop: step simulation until receiving an exit eventwhile (robot->step(TIME_STEP) != -1) {// read sensors outputs// process behavior// write actuators inputs}delete robot;return 0; //EXIT_SUCCESS
}

3、添加功能

接下来我们往主函数当中添加我们所需要的功能。首先我们初始化距离传感器

// 初始化设备
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主循环中,即在注释// read sensors outputs之后,添加以下代码,读取距离传感器值,如下所示:

// read sensors outputs
double psValues[8];
for (int i = 0; i < 8 ; i++)psValues[i] = ps[i]->getValue();

在主循环中,在// process behavior后添加以下代码,检测是否发生碰撞(即,距离传感器返回的值大于阈值),如下所示:

// detect obstacles
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;

最后,根据障碍物的信息来驱动车轮,如下所示:

#define MAX_SPEED 6.28
...
// initialize motor speeds at 50% of MAX_SPEED.
double leftSpeed  = 0.5 * MAX_SPEED;
double rightSpeed = 0.5 * MAX_SPEED;
// modify speeds according to obstacles
if (left_obstacle) {// turn rightleftSpeed  = 0.5 * MAX_SPEED;rightSpeed = -0.5 * MAX_SPEED;
}
else if (right_obstacle) {// turn leftleftSpeed  = -0.5 * MAX_SPEED;rightSpeed = 0.5 * MAX_SPEED;
}
// write actuators inputs
leftMotor->setVelocity(leftSpeed);
rightMotor->setVelocity(rightSpeed);

添加完相关功能之后我们编译代码

4、完整代码

#include <webots/Robot.hpp>
#include <webots/DistanceSensor.hpp>
#include <webots/Motor.hpp>// time in [ms] of a simulation step
#define TIME_STEP 64#define MAX_SPEED 6.28// All the webots classes are defined in the "webots" namespace
using namespace webots;// entry point of the controller
int main(int argc, char **argv) {// create the Robot instance.Robot *robot = new Robot();// initialize devicesDistanceSensor *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);// feedback loop: step simulation until an exit event is receivedwhile (robot->step(TIME_STEP) != -1) {// read sensors outputsdouble psValues[8];for (int i = 0; i < 8 ; i++)psValues[i] = ps[i]->getValue();// detect obstaclesbool 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;// initialize motor speeds at 50% of MAX_SPEED.double leftSpeed  = 0.7 * MAX_SPEED;double rightSpeed = 0.7 * MAX_SPEED;// modify speeds according to obstaclesif (left_obstacle) {// turn rightleftSpeed  = 0.7 * MAX_SPEED;rightSpeed = -0.7 * MAX_SPEED;}else if (right_obstacle) {// turn leftleftSpeed  = -0.7 * MAX_SPEED;rightSpeed = 0.7 * MAX_SPEED;}// write actuators inputsleftMotor->setVelocity(leftSpeed);rightMotor->setVelocity(rightSpeed);}delete robot;return 0; //EXIT_SUCCESS
}

保存世界,并重置仿真之后我们可以看到以下运行效果


如果觉得ok,点个赞,点个关注,也欢迎给个打赏支持一下编者的工作

【webots教程】简单的避障机器人相关推荐

  1. Arduino开发实例-DIY超声波传感器避障机器人

    超声波传感器避障机器人 1.应用介绍 在本应用中,我们将使用一个超声波传感器与两个直流电机和一个伺服电机相结合,Arduino作为主控板创建一个简单的避障机器人. 超声波传感器发送和接收信号以确定物体 ...

  2. 如何使用树莓派制作避障机器人

    学习Arduino或者树莓派的过程中,如果仅仅看代码或者做简单实验,那么常常会虎头蛇尾,所以我们建议还是尝试一些简单的机器人项目,这样既有趣也能不断学习提高.本文将向大家展示如何使用树莓派制作简单的避 ...

  3. matlab智能小车避障,Arduino智能小车系列教程4——超声波避障

    Arduino智能小车系列教程4--超声波避障 Arduino智能小车系列教程 准备材料 超声波模块HC-SR04 舵机固定架 舵机安装 超声波接线 代码测试 代码详解 int getDistance ...

  4. 避障机器人程序c语言,移动机器人的避障实验设计+源程序+流程图.doc

    移动机器人的避障实验设计源程序流程图 移动机器人的避障实验设计+源程序+流程图 摘要:随着科学技术的日益,机器人越来越融入到人们的生活.近年来,特别是智能机器人的开发与研究引起了很多学者的关注.其中, ...

  5. ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 程序目录

    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 -- 小车前进实验调试 ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 -- 小车前后左右综合实验 ZYAR20A 亚克力2驱 蓝牙 2 ...

  6. ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车黑线循迹、避障、遥控实验综合程序

    在下载到开发板之前要选择好板和端口,具体参见: ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 -- Arduino相关设置 注意 红外遥控程序注意将IRremote 复制到ARDuino安装 ...

  7. ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车黑线循迹红外避障综合实验

    在下载到开发板之前要选择好板和端口,具体参见: ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 -- Arduino相关设置 注意 红外遥控程序注意将IRremote 复制到ARDuino安装 ...

  8. ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车红外遥控实验

    在下载到开发板之前要选择好板和端口,具体参见: ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 -- Arduino相关设置 注意 红外遥控程序注意将IRremote 复制到ARDuino安装 ...

  9. ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车超声波避障实验(有舵机)

    在下载到开发板之前要选择好板和端口,具体参见: ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 -- Arduino相关设置 代码 // 智能小车超声波避障实验(有舵机) // 程序中电脑打印 ...

最新文章

  1. HDU - 4614 Vases and Flowers 线段树+二分
  2. 商品评论html,商品评论列表.html
  3. 这组动画完美演绎了一个程序员从接手新项目到交货的复杂心情
  4. Nature:拟南芥微生物组功能研究0概述
  5. MS UC 2013-0-虚拟机-标准化-部署-3-虚拟机-生产
  6. C# 部署失败--上传文件缺失
  7. 课程及其编码字典python_【课程15】Python字典
  8. 解决SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问的方法...
  9. 分区partition是否只保存一部分数据?
  10. php环境搭建sqlserver,ThinkPHP5.0/5.1对接SQLServer数据库(宝塔环境)
  11. CentOS 7虚拟机支持virsh console访问
  12. python输入月份判断季节_用户输入月份,判断这个月是哪个季节。(要求使用列表)_学小易找答案...
  13. 人脸关键点:DAN-Deep Alignment Network: A convolutional neural network for robust face alignment
  14. atitit 国家与社区发展战略研究attilax 总结 v2 .docx
  15. 【多商户招商自营多元化功能】
  16. 有道智云OCR图片识别文字+返回数据处理技巧(实现语言-按键精灵脚本请求识别+java服务端处理数据)...
  17. Chrome安装ElasticSearch-head插件
  18. log日志:如何设置log级别、打印字体的颜色
  19. android 汉字转字节,安卓汉字转拼音
  20. 3dsmax2020安装报1603错误的解决方法

热门文章

  1. cmd什么指令可以清除后台进程
  2. 计算机应用能力考试科目,全国专业技术人员计算机应用能力考试科目Word
  3. Movist Pro for mac(高清媒体播放器)
  4. python维语翻译中文_维文、藏文等特殊语种翻译
  5. html 显示shp,运用shapefile.js解析Shp文件
  6. 驰骋工作流引擎三种项目集成开发模式
  7. html 输入数字冒泡,Html5 冒泡排序演示
  8. QT百度离线地图(一)
  9. 矩阵化为最简型矩阵JAVA语言实现――线性代数
  10. iOS 时间与日期处理