求大神指导避障小车的算法
采用红外传感器和超声波传感器结合来进行避障。val1、val2分别为左右两个红外传感器测得的距离值;distance为超声波传感器测得的距离值。求大神知道如何编写程序才能进行有效的避障。(能够使小车直行、倒退、左转和右转)int E1=5; //设置电机管脚
int M1=4;
int E2=6;
int M2=7;
int valGP1;//红外模拟量读取
int valGP2;
int val1; ////模拟量转换实际距离值存储
int val2;
int analog1=15; //模拟量接线引脚号
int analog2=14;
int inputPin=2; //超声波传感器信号引脚
int outputPin=3;
void setup()
{
pinMode(M1,OUTPUT);
pinMode(M2,OUTPUT);
Serial.begin(9600);
pinMode(inputPin,INPUT);
pinMode(outputPin,OUTPUT);}
void advanced()//小车前进
{
digitalWrite(M1,HIGH);
digitalWrite(M2,HIGH);
analogWrite(E1,100);
analogWrite(E2,100);
delay(30);}
void back() //小车后退
{
digitalWrite(M1,LOW);
digitalWrite(M2,LOW);
analogWrite(E1,100);
analogWrite(E2,100);
delay(30);}
void left() //小车左转
{
digitalWrite(M1,HIGH);
digitalWrite(M2,LOW);
analogWrite(E1,150);
analogWrite(E2,50);
delay(30);}
void right() //小车右转
{
digitalWrite(M1,LOW);
digitalWrite(M2,HIGH);
analogWrite(E1,50);
analogWrite(E2,150);
delay(30);}
void loop()
{
valGP1 =analogRead(analog1); //常用公式
valGP2=analogRead(analog2);
val1=(6787/(valGP1-3))-4;
val2=(6787/(valGP2-3))-4;
Serial.print(val1 );
Serial.print(val2 );
delay(1000);
digitalWrite(outputPin,LOW);
delayMicroseconds(2);
digitalWrite(outputPin,HIGH);
delayMicroseconds(10);
int distance=pulseIn(inputPin,LOW);
distance=distance/50;
Serial.println(distance);
delay(1000);
首先,所示的程序有實際測試過了嗎? 如有,有甚麼不足之處,而要尋求「能进行有效的避障」的算法?
再者,算法是要依隨實際情況來作出,才能得到「能进行有效的避障」的算法的。當中起碼包括了 :
1) 傳感器的安裝方式、位置等因素,
2) 障礙的定義和避開的可使用方式等
eddiewwm 发表于 2014-5-6 16:28 static/image/common/back.gif
首先,所示的程序有實際測試過了嗎? 如有,有甚麼不足之處,而要尋求「能进行有效的避障」的算法?
再者 ...
程序测试过了,能够正常运行。有效的避障,就是说在小于某个数值,比如说前边距离障碍物距离小于15的时候,小车会倒退;左边小于15的时候小车会向右转弯 佑掱.。 发表于 2014-5-6 17:29 static/image/common/back.gif
程序测试过了,能够正常运行。有效的避障,就是说在小于某个数值,比如说前边距离障碍物距离小于15的时候 ...
因手上並沒有硬件,是很難掌握問題和跟樓主對問題有共同的體驗的,所以首先要明白情況才比較容易提出看法,請明白。
按回覆所述,既然車子已能正常運動,祇是仍努力於「距离小于15」的目標,但甚麼是「距离小于15」?為甚麼仍未達到呢?是硬件問題或限制?還是軟件問題?還有1) 傳感器的安裝方式、位置等因素,2) 障礙的定義和避開的可使用方式等 可說明一下嗎? 你的程序里用的太多的delay()函数,当delay()运行时程序是无法响应其它情况的,比如你测距完后加了个delay(1000);,这时如果测距发现已经达到了你的避障值时,你的小车还是要继续前进1S才会进行改变,这就会显得你的小车反应迟钝了,其它的也一样;你最好用定时器或millis()函数来控制延时。
页:
[1]