极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 20347|回复: 4

求大神指导避障小车的算法

[复制链接]
发表于 2014-5-6 15:52:26 | 显示全部楼层 |阅读模式
采用红外传感器和超声波传感器结合来进行避障。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);
回复

使用道具 举报

发表于 2014-5-6 16:28:49 | 显示全部楼层
首先,所示的程序有實際測試過了嗎? 如有,有甚麼不足之處,而要尋求「能进行有效的避障」的算法?

再者,算法是要依隨實際情況來作出,才能得到「能进行有效的避障」的算法的。當中起碼包括了 :
1) 傳感器的安裝方式、位置等因素,
2) 障礙的定義和避開的可使用方式等

回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-6 17:29:47 | 显示全部楼层
eddiewwm 发表于 2014-5-6 16:28
首先,所示的程序有實際測試過了嗎? 如有,有甚麼不足之處,而要尋求「能进行有效的避障」的算法?

再者 ...

程序测试过了,能够正常运行。有效的避障,就是说在小于某个数值,比如说前边距离障碍物距离小于15的时候,小车会倒退;左边小于15的时候小车会向右转弯
回复 支持 反对

使用道具 举报

发表于 2014-5-6 17:58:51 | 显示全部楼层
佑掱.。 发表于 2014-5-6 17:29
程序测试过了,能够正常运行。有效的避障,就是说在小于某个数值,比如说前边距离障碍物距离小于15的时候 ...

因手上並沒有硬件,是很難掌握問題和跟樓主對問題有共同的體驗的,所以首先要明白情況才比較容易提出看法,請明白。

按回覆所述,既然車子已能正常運動,祇是仍努力於「距离小于15」的目標,但甚麼是「距离小于15」?為甚麼仍未達到呢?是硬件問題或限制?還是軟件問題?還有1) 傳感器的安裝方式、位置等因素,2) 障礙的定義和避開的可使用方式等 可說明一下嗎?
回复 支持 反对

使用道具 举报

发表于 2014-5-6 20:47:21 | 显示全部楼层
你的程序里用的太多的delay()函数,当delay()运行时程序是无法响应其它情况的,比如你测距完后加了个delay(1000);  ,这时如果测距发现已经达到了你的避障值时,你的小车还是要继续前进1S才会进行改变,这就会显得你的小车反应迟钝了,其它的也一样;你最好用定时器或millis()函数来控制延时。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-14 04:50 , Processed in 0.059902 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表