Webots学习笔记—四轮小车的键盘控制

前言

本次所用到的四轮小车模型如下在这里插入图片描述
该四轮小车的模型搭建过程请阅读我的另一篇文章:
https://blog.csdn.net/cyj972628089/article/details/107009528(Webots学习笔记—四轮小车的模型搭建和简单控制)

四轮小车的键盘控制

本次项目不需要添加任何节点和传感器,只需要修改代码即可完成。

先贴上代码


#include 
#include 
#include 
#include 

#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()函数输出出来即可。

写在最后

这次的项目并不难,最主要的是学会一个学习方法:在学习某些传感器或者想实现某些功能的时候,我们不仅要查阅官方文档,同时也要查看一下官方案例有没有类似的方法和功能实现,这将大大提高我们的效率。因此我们应该多熟悉官方案例,做到心中有数。

你可能感兴趣的:(Webots学习笔记)