介绍

 
现在,我们将编程一个简单的控制器,该控制器将使机器人向前移动。  
控制器是一个程序,限定了机器人的行为。Webots控制器可以用以下编程语言编写:C,C ++,Java,Python,MATLAB,ROS等。C,C ++和Java控制器必须先进行编译,然后才能作为机器人控制器运行。Python和MATLAB控制器是解释性语言,因此它们无需编译即可运行。在本教程中,我们将使用C作为参考语言,但是所有代码段也都可以在C ++,Java,Python和MATLAB中获得。  
机器人的controller节点指定当前与机器人关联的控制器。  
请注意,同一台控制器可以由多个机器人使用,但一个机器人一次只能使用一个控制器。每个控制器在通常由Webots产生的单独的子进程中执行。因为它们是独立的进程,所以控制器不共享相同的地址空间,并且可以在不同的处理器内核上运行。
  在开始本篇的教程之前,请确保按照上一篇【webots教程】你在webots搭建的第一个仿真环境中的步骤搭建好一个仿真场景  
 

一、创建一个新的控制器

  依次点击菜单栏中的 向导 -> 新机器人控制器,会出现以下弹窗:   在这里插入图片描述   点击下一步选择控制器所使用的语言(这里我们使用c++):   在这里插入图片描述   选择IDE,我们这里使用webots自带的ide进行程序编写:   在这里插入图片描述  
填写好控制器名字之后会有提示将创建相关文件,随后点击完成即可:  
在这里插入图片描述

此时控制器的源文件会自动在webots的文本编辑器中打开,此时的带码没有实际作用,因为我们还没添加相关的api对机器人进行控制:

在这里插入图片描述

二、编辑控制器源文件

 

1、链接控制器与机器人

  在场景树视图中,展开E-puck节点选中controller,下方Select...按钮选择控制器。   在这里插入图片描述   在此我们选中之前填写的控制器名称(此处选中默认名称my_controller),点击确定:   在这里插入图片描述   完成上述步骤之后,控制器就会与机器人关联起来,习惯性地点一下保存世界以防出现“意外”。  

2、对轮子进行位置控制

 
现在我们可以开始编辑控制器的源文件了。  
  • 头文件:#include <webots/motor.h>
  • 获取电机信息:WbDeviceTag motor = wb_robot_get_device("motor_name");
  • 控制电机位置命令:wb_motor_set_position(motor, 10);
  完整代码如下:   #include <webots/Robot.hpp> #include <webots/Motor.hpp> #define TIME_STEP 64 // All the webots classes are defined in the "webots" namespace using namespace webots; int main(int argc, char **argv) { // create the Robot instance. Robot *robot = new Robot(); // 读取电机设备 Motor *leftMotor = robot->getMotor("left wheel motor"); Motor *rightMotor = robot->getMotor("right wheel motor"); // 设定电机目标位置 leftMotor->setPosition(10.0); rightMotor->setPosition(10.0); while (robot->step(TIME_STEP) != -1) { };   保存修改后的源码,点击Build/build进行编译   在这里插入图片描述
  重新启动模拟,如果一切正常,机器人应向前移动。机器人将以其最大速度移动一会儿,然后在轮子旋转10弧度后停止。如下所示:  
在这里插入图片描述

3、拓展至车轮的速度控制

 
机器人的轮子通常是通过速度控制的,而不是像前面的示例那样通过位置控制的。为了控制车轮的电动机的速度,您需要将目标位置设置为无穷大并设置所需的速度,对程序作以下改动:   #include <webots/Robot.hpp> // Added a new include file #include <webots/Motor.hpp> #define TIME_STEP 64 #define MAX_SPEED 6.28 // All the webots classes are defined in the "webots" namespace using namespace webots; int main(int argc, char **argv) { Robot *robot = new Robot(); // 获取设备 Motor *leftMotor = robot->getMotor("left wheel motor"); Motor *rightMotor = robot->getMotor("right wheel motor"); leftMotor->setPosition(INFINITY); rightMotor->setPosition(INFINITY); //设定电机转速为最大转速的30% leftMotor->setVelocity(0.3 * MAX_SPEED); rightMotor->setVelocity(0.3 * MAX_SPEED); while (robot->step(TIME_STEP) != -1); delete robot; return 0; }
delete robot; return 0; }
  重新编译源文件并重置世界,点击开始模拟之后会看到机器人将会缓慢向前移动(移动速度取决于转速)  
在这里插入图片描述