• 欢迎访问开心洋葱网站,在线教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入开心洋葱 QQ群
  • 为方便开心洋葱网用户,开心洋葱官网已经开启复制功能!
  • 欢迎访问开心洋葱网站,手机也能访问哦~欢迎加入开心洋葱多维思维学习平台 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏开心洋葱吧~~~~~~~~~~~~~!
  • 由于近期流量激增,小站的ECS没能经的起亲们的访问,本站依然没有盈利,如果各位看如果觉着文字不错,还请看官给小站打个赏~~~~~~~~~~~~~!

Webots 机器人仿真平台(七) 键盘控制小车

人工智能 熊猫飞天 1710次浏览 0个评论

键盘控制小车

  • 1. 新建C++控制器
  • 2. 代码说明
  • 3. 演示效果
  • 参考资料

上一篇博客中我们利用距离传感器让小车在环境中实现避障行走,但是在实际的使用情况下我们更加希望让小车按我们指定的路线行进,即遥控小车行走,在这篇博客中我们使用键盘上的方向键控制小车前后左右运动,实现遥控操作机器人或者小车。  

1. 新建C++控制器

新建一个C++控制器并命名为 keyboard ,将以下代码填入 keyboard.cpp中然后编译  
Webots 机器人仿真平台(七) 键盘控制小车   控制器代码:  

#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机器人仿真平台(五) 新建四轮小车模型)建立的四轮小车做实验,为小车指定我们新构建的控制器  
Webots 机器人仿真平台(七) 键盘控制小车  

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. 演示效果

下图是一个利用键盘方向键控制小车前后左右移动的效果  
Webots 机器人仿真平台(七) 键盘控制小车  

参考资料

[1] 1https://cyberbotics.com/doc/reference/index?version=R2020a-rev1 [2] https://www.cyberbotics.com/doc/reference/motion 如果大家觉得文章对你有所帮助,请大家帮忙点个赞。O(∩_∩)O 欢迎大家在评论区交流讨论(cenruping@vip.qq.com)


开心洋葱 , 版权所有丨如未注明 , 均为原创丨未经授权请勿修改 , 转载请注明Webots 机器人仿真平台(七) 键盘控制小车
喜欢 (0)

您必须 登录 才能发表评论!

加载中……