前言
本次所用到的四轮小车模型如下
该四轮小车的模型搭建过程请阅读我的另一篇文章:
https://blog.csdn.net/cyj972628089/article/details/107009528(Webots学习笔记—四轮小车的模型搭建和简单控制)
四轮小车的键盘控制
本次项目不需要添加任何节点和传感器,只需要修改代码即可完成。
先贴上代码
#include <webots/robot.h>
#include <webots/motor.h>
#include <webots/keyboard.h>
#include <stdio.h>
#define TIME_STEP 64
int main(int argc, char **argv) {
wb_robot_init();
wb_keyboard_enable(TIME_STEP);
printf("Able\n");
WbDeviceTag motors[4];
char motors_names[4][8] = {"motor_1", "motor_2", "motor_3", "motor_4"};
for (int i = 0; i < 4; i++) {
motors[i] = wb_robot_get_device(motors_names[i]);
wb_motor_set_position(motors[i], INFINITY);
wb_motor_set_velocity(motors[i],0);
}
double left_speed = 1.0;
double right_speed = 1.0;
while (wb_robot_step(TIME_STEP) != -1) {
int new_key = wb_keyboard_get_key();
while (new_key > 0) {
printf("%d\n",new_key);
switch (new_key) {
case 87://w
printf("UP pressed\n");
if(right_speed<0)left_speed = -right_speed;
else left_speed = right_speed;
left_speed += 1.0;
right_speed += 1.0;
break;
case 83://s
printf("DOWN pressed\n");
if(right_speed>0)left_speed = -right_speed;
else left_speed = right_speed;
left_speed -= 1.0;
right_speed -= 1.0;
break;
case 65://a
printf("LEFT pressed\n");
left_speed -= 0.5;
right_speed += 0.5;
break;
case 68://d
printf("RIGHT pressed\n");
left_speed += 0.5;
right_speed -= 0.5;
break;
case 69://e
printf("RIGHT—UP pressed\n");
left_speed += 1;
right_speed = 1;
break;
case 81://q
printf("LEFT—UP pressed\n");
left_speed = 1;
right_speed += 1;
break;
case 90://z
printf("LEFT—DOWN pressed\n");
left_speed = -1;
right_speed -= 1;
break;
case 67://c
printf("RIGHT—DOWN pressed\n");
left_speed -= 1;
right_speed = -1;
break;
case 70://f
printf("A pressed\n");
wb_keyboard_disable();
break;
}
new_key = wb_keyboard_get_key();
}
if(left_speed>5)left_speed=5;
else if(left_speed<-5)left_speed=-5;
if(right_speed>5)right_speed=5;
else if(right_speed<-5)right_speed=-5;
wb_motor_set_velocity(motors[0],left_speed);
wb_motor_set_velocity(motors[1],right_speed);
wb_motor_set_velocity(motors[2],left_speed);
wb_motor_set_velocity(motors[3],right_speed);
}
wb_robot_cleanup();
return 0;
}
这段代码非常简单,“w”代表前进,“s”代表后退,“a”代表左转,“d”代表右转,“q”代表向左前方转弯,“e”代表向右前方转弯,“z”代表向左后方倒退,“c”代表向右后方倒退,“f”代表键盘失能。
wb_keyboard_enable(TIME_STEP);
:键盘使能wb_keyboard_get_key()
:获得按下按键的int值wb_keyboard_disable()
:键盘失能
在查阅官方文档的时候,我发现官方并没有给出C语言的代码示例。此时我想到了官方给的案例中有出现过键盘控制的相关项目,于是点击帮助→webots引导之旅→Webots Guilded Tour,其中第一个项目mavic_2_pro就是用键盘控制飞机飞行。我参考这个项目给出的代码,完成了四轮小车的键盘控制。
要想知道其他按键对应的int值,只需要用print()函数输出出来即可。
写在最后
这次的项目并不难,最主要的是学会一个学习方法:在学习某些传感器或者想实现某些功能的时候,我们不仅要查阅官方文档,同时也要查看一下官方案例有没有类似的方法和功能实现,这将大大提高我们的效率。因此我们应该多熟悉官方案例,做到心中有数。