键盘控制小车
- 1. 新建C++控制器
- 2. 代码说明
- 3. 演示效果
- 参考资料
上一篇博客中我们利用距离传感器让小车在环境中实现避障行走,但是在实际的使用情况下我们更加希望让小车按我们指定的路线行进,即遥控小车行走,在这篇博客中我们使用键盘上的方向键控制小车前后左右运动,实现遥控操作机器人或者小车。
1. 新建C++控制器
新建一个C++控制器并命名为 keyboard ,将以下代码填入 keyboard.cpp中然后编译
控制器代码:
#include <webots/Robot.hpp>
#include <webots/DistanceSensor.hpp>
#include <webots/Motor.hpp>
#include <webots/Keyboard.hpp>
#include <stdio.h>
#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();
Keyboard kb;
DistanceSensor *ds[2];
char dsNames[2][10] = {"ds_right","ds_left"};
for (int i = 0; i < 2; i++) {
ds[i] = robot->getDistanceSensor(dsNames[i]);
ds[i]->enable(TIME_STEP);
}
// initialise motors
Motor *wheels[4];
char wheels_names[4][8] = {"wheel1", "wheel2", "wheel3", "wheel4"};
for (int i = 0; i < 4; i++) {
wheels[i] = robot->getMotor(wheels_names[i]);
wheels[i]->setPosition(INFINITY);
wheels[i]->setVelocity(0);
}
printf("init successd ...\n");
kb.enable(TIME_STEP);
double leftSpeed = 0.0;
double rightSpeed = 0.0;
// Main loop:
// - perform simulation steps until Webots is stopping the controller
while (robot->step(TIME_STEP) != -1)
{
int key = kb.getKey();
if(key== 315)
{
leftSpeed = 3.0;
rightSpeed = 3.0;
}
else if(key== 317)
{
leftSpeed = -3.0;
rightSpeed = -3.0;
}
else if(key== 314)
{
leftSpeed = -3.0;
rightSpeed = 3.0;
}
else if(key== 316)
{
leftSpeed = 3.0;
rightSpeed = -3.0;
}
else
{
leftSpeed = 0.0;
rightSpeed = 0.0;
}
std::cout<< " Right Sensor Value:" <<ds[0]->getValue() << " Left Sensor Value:" <<ds[1]->getValue() <<std::endl;
wheels[0]->setVelocity(leftSpeed);
wheels[1]->setVelocity(rightSpeed);
wheels[2]->setVelocity(leftSpeed);
wheels[3]->setVelocity(rightSpeed);
};
// Enter here exit cleanup code.
delete robot;
return 0;
}
随后对控制器进行编译。利用我们之前博客(Webot机器人仿真平台(五) 新建四轮小车模型)建立的四轮小车做实验,为小车指定我们新构建的控制器
2. 代码说明
这里我们使用的是C++版本的控制器,控制器的接口函数与C的类似,只是换成了类变量操作方式。程序思路是读取键盘方向键的键值,判断是哪一个按键按下,根据按键值设置小车左右车轮的速度。 其中以下两行代码为初始化键盘
Keyboard kb;
kb.enable(TIME_STEP);
kb.getKey()函数为读取按键值
int key = kb.getKey();
也可以通过字符的形式判断是哪一个按键按下
int k = keyboard->getKey();
switch (k) {
case 'A': message.assign("avoid obstacles"); break;
case 'F': message.assign("move forward"); break;
case 'S': message.assign("stop"); break;
case 'T': message.assign("turn"); break;
case 'I': displayHelp(); break;
case 'R': cout << "Teleport ROBOT1 at (" << x << "," << z << ")" << endl; break;
default: message.clear();
}
3. 演示效果
下图是一个利用键盘方向键控制小车前后左右移动的效果
参考资料
[1] 1https://cyberbotics.com/doc/reference/index?version=R2020a-rev1 [2] https://www.cyberbotics.com/doc/reference/motion 如果大家觉得文章对你有所帮助,请大家帮忙点个赞。O(∩_∩)O 欢迎大家在评论区交流讨论(cenruping@vip.qq.com)