介绍
现在,我们将编程一个简单的控制器,该控制器将使机器人向前移动。
控制器是一个程序,限定了机器人的行为。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;
}
重新编译源文件并重置世界,点击开始模拟之后会看到机器人将会缓慢向前移动(移动速度取决于转速)