编写一个简单的避障算法,但机器人在靠近物体时只是旋转

问题描述 投票:0回答:1

我正在对 Elegoo 智能机器人汽车版本 4 进行编程,为学校项目执行一些简单的任务。汽车必须能够跟随一段胶带、接收两个红外信号并具有避障算法。

我成功完成了前两个任务,但我编写的避障算法的代码似乎无法正常工作。作为参考,该算法应该在汽车接近某物时停止并倒车,然后它应该找到障碍物最远的方向,然后朝那个方向行驶。
但是,我的只是在通电时连续向左旋转,然后在通电时连续向左旋转有东西离得太近,它会向后看去……并继续向左旋转,无论哪种方式最安全。我很困惑,不明白为什么它不起作用,任何建议将不胜感激。

这段代码使用了一些给我的预制函数。它们应该非常简单,但如果您有任何困惑,请告诉我,我会尝试从库中找到它们的代码。

AFAICT,

//OBSTACLE AVOIDANCE
之前的所有内容都可以正常工作,但我把它留在了以防万一它以某种方式搞乱了一切

#include "GENG1201_Project.h"
void setup() {
Init(); // KEYS IN IGNITION
Serial.begin(9600);//COMMUNITCATION SPEED
servoControl(90);//EYES FORWARD
}

void loop() {

  uint16_t leftdis , rightdis , frontdis;
  int i=0;
  TrackingData_R = infraRed_R() ;
  TrackingData_M = infraRed_M() ;
  TrackingData_L = infraRed_L() ;

  readUltrasonicSensor(get_Distance);

//IDLE MOVEMENT
//if nothing is happening go straight along my way
move(Forward,50);

  //LINE TRACKER
  //if there is white tape follow it
  if (function_xxx(TrackingData_M, 0, 50)) {move(Forward, 50);}
  if (function_xxx(TrackingData_L, 0, 50)) {move(Left, 50);}
  if (function_xxx(TrackingData_R, 0, 50)) {move(Right, 50);}

//BOOTH COMMUNICATIONS  
//while the light is red...
 while(ReadRemote()==8){
    //stop
    move(stop_it,0);
    //look at the booth
    servoControl(0);
    //max brightness and intensity for 1.5s
    myColor(255,255,255,100);
    delay(1500);
    //off for 0.5s
    myColor(0,0,0,0);
    delay(500);
  }
 //while the light is green
 while(ReadRemote()==0){
  //Green means GOOOOOOOOOOOOOOO
  move(Forward,50);
  //look forward
  servoControl(90);
}

//OBSTACLE AVOIDANCE
//if I get too close to someting...
if(function_xxx(get_Distance,0,10)){
  
  //get scared and create space
  move(Backward,50);
  delay(100);
  move(stop_it,0);

  //check front
  readUltrasonicSensor(frontdis);
  servoControl(90);
  //degbug
  Serial.print(frontdis);
  delay(100);

  //check left
  servoControl(0);
  readUltrasonicSensor(leftdis);
  //debug
  Serial.print(leftdis);
  delay(100);

  //check right
  servoControl(180);
  readUltrasonicSensor(rightdis);
  //debug
  Serial.print(rightdis);
  delay(100);

  //left is furthest?
  if(leftdis>rightdis&&leftdis>frontdis){
    i=1;
  }

  //right is furthest?
  if(rightdis>leftdis&&rightdis>frontdis){
    i=2;
  }

  //front is the furthest? (shouldnt happen!)
  if(frontdis>rightdis&&frontdis>leftdis){
    i=3;
  }

  //where to go?
  switch(i){

    //left is far go left
    case 1:
    servoControl(90);
    move(Left,50);
    delay(100);
    break;

    //no no no right is far go right
    case 2:
    servoControl(90);
    move(Right,50);
    delay(100);
    break;

    //CHARGE BACK TO WHAT SCARED ME
    case 3:
    servoControl(90);
    move(Forward,50);
    delay(100);
    break;
  }  
}
}

超声波传感器安装在机器人前部的伺服器上。

  • servoControl
    将舵机移动到输入整数的度数(0 尽可能向左,180 尽可能向右)。角度值是绝对的并且与其他任何因素无关。
  • move
    使电机运转并使小车朝指定方向移动 指定和电机连接的引脚将具有 功率输出等于方向后输入的整数。
  • 如果
  • function_xxx(get_Distance, 0, 10)
     介于 0 和 10 之间,则 
    true
    返回
    get_Distance
  • readUltrasonicSensor
    输出以厘米为单位的距离。

我修复了一些小错误,并尝试重新安排事物并重新制定算法,但没有任何效果。

请随意修改我的代码并向我展示如何做得更好!我总是很高兴学习一两个新技巧!

c++ arduino-uno arduino-ide robot arduino-ultra-sonic
1个回答
0
投票

谢谢你们的帮助,这个问题是通过在头部转动和距离检查之间添加延迟以及非常愚蠢的地板解决方案解决的,我在我的左线跟踪器上使用读数 45,导致它不断地思考它在一条白线上。强烈感谢 Atmo 提供的解决方案并帮助格式化我的帖子。我对这个网站还很陌生,很欣赏热情和乐于助人的社区!

© www.soinside.com 2019 - 2024. All rights reserved.