autonomous car - evitación de obstáculos con sensor ultrasónico _ jeff mcalvay

16

Upload: vegazela

Post on 28-Nov-2015

131 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Autonomous Car - evitación de obstáculos con sensor ultrasónico _ Jeff McAlvay

10/01/14 Autonomous Car - evitación de obstáculos con sensor ultrasónico | Jeff McAlvay

jeffsinventions.com/autonomous-car-obstacle-avoidance/ 1/16

Jeff [email protected]

Autonomous Car - evitación de obstáculos con sensor deultrasonidos

Como parte de mi proyecto de coche autónomo ( http://jeffsinventions.com/?p=577 ), necesito el coche para evitar los obstáculos. Este es un video

de mi coche autónomo utilizando datos de los sensores ultrasónicos para elegir el título más cercano libre de obstáculos hacia su destino.

Page 2: Autonomous Car - evitación de obstáculos con sensor ultrasónico _ Jeff McAlvay

10/01/14 Autonomous Car - evitación de obstáculos con sensor ultrasónico | Jeff McAlvay

jeffsinventions.com/autonomous-car-obstacle-avoidance/ 2/16

Básicamente, un sensor ultrasónico montado en un servo toma mediciones de distancia a un número de ángulos y escoge el ángulo libre de

obstáculos más cercana a la necesaria para llegar al siguiente punto de paso.

Direcciones futuras

Antes de que yo estoy satisfecho con la capacidad de evasión de obstáculos del coche, tengo que hacer algunas pruebas más para

asegurarse de que se está comportando como se esperaba.

Después de que el coche está en marcha, voy a experimentar con la adición de cámaras estéreo y violín con algoritmos de detección de

bordes, la visión estereoscópica (cuando se comparan las imágenes de las dos cámaras, las partes, con un montón de diferencias tienden a

estar más cerca, mientras que las partes con más similitudes tienden a estar más lejos), y el flujo óptico (mientras se mueve, las cosas que se

mueven más rápido tienden a estar más cerca y las cosas que se mueven más lento tienden a estar más lejos)

Para más detalles,

¿Qué sensor de proximidad usaré?

opté por usar un sensor de proximidad ultrasónico. En concreto, he optado por un Parallax PING (

http://www.parallax.com/tabid/768/ProductID/92/Default.aspx ). He aquí por qué no elegir otras tecnologías de sensores:

Capacitiva (el rango es sólo unos pocos centímetros)

Inductivo (el rango es sólo unos pocos centímetros)

Infra-rojo (luchas en la luz del día)

Láser telémetro (caro)

¿Por qué hacer una representación de 2-D del mundo?

Si el coche sólo tenía una distancia medida de sensor directamente en la parte delantera del coche, tendría que evitar los obstáculos por conjetura

y la salida sería conducir hasta que ve un obstáculo, una copia de seguridad, girar un poco y vuelva a intentarlo hasta que no ve un obstáculo. Esto

tomaría para siempre. Con una representación 2-D del espacio en frente de ella, el coche puede elegir entre una variedad de direcciones.

Page 3: Autonomous Car - evitación de obstáculos con sensor ultrasónico _ Jeff McAlvay

10/01/14 Autonomous Car - evitación de obstáculos con sensor ultrasónico | Jeff McAlvay

jeffsinventions.com/autonomous-car-obstacle-avoidance/ 3/16

¿Cómo obtener una representación de 2-D del mundo?

Una opción sería la de comprar un montón de sensores y variedad de ellos en diferentes ángulos en parte delantera del coche, pero sería costoso

de lograr cualquier resolución respetable con este enfoque. Una opción más atractiva sería la de montar un sensor en un servo y recoger lecturas

mientras que el sensor gira.

Afortunadamente, hay un kit para montar el sensor de ultrasonidos en un servo Sin embargo, este kit se ha diseñado para Boe Bot de Parallax, no

es mi coche de RC. Por lo tanto, me quité el parachoques delantero de mi coche RC, mecanizadas un soporte para montar el servo desde un

ángulo de aluminio, y se atornilla el soporte en los agujeros donde el tope era.

¿Qué resolución?

Una de las preguntas que averiguar es ¿cuántas mediciones Quiero que el sensor para tomar en una sola pasada. Si tomo demasiadas mediciones,

el pase será lenta y el coche podría estrellarse a la espera de que el sensor de completar su pase. Si tomo a algunas mediciones, el coche podría no

detectar obstáculos o rutas disponibles. Elegí 36 mediciones por pase, porque parecía que encontrar el equilibrio entre estos dos extremos. Tengo

una buena resolución, pero soy capaz de completar un pase en menos de un segundo.

Page 4: Autonomous Car - evitación de obstáculos con sensor ultrasónico _ Jeff McAlvay

10/01/14 Autonomous Car - evitación de obstáculos con sensor ultrasónico | Jeff McAlvay

jeffsinventions.com/autonomous-car-obstacle-avoidance/ 4/16

¿Qué distancia umbral?

Otra equilibrio que debe lograrse es la elección de la distancia por debajo del cual el coche clasifica algo como un obstáculo. Si la distancia es

demasiado corta, el coche podría ser incapaz de detenerse antes de chocar contra algo. Si la distancia es demasiado lejos, el coche

innecesariamente podría descartar caminos viables.

¿Cómo voy a alimentar el servo y el sensor?

Una guía de cableado para el sensor ultrasónico sugiere el sensor puede accionar por el Arduino ( http://arduino.cc/en/Tutorial/Ping ). La biblioteca

de servo de Arduino también sugiere que el servo ser alimentado por el Arduino ( http://arduino.cc/it/Reference/Servo ). Sin embargo, cuando

traté de encender ambos dispositivos utilizando el Arduino, el sensor reportó datos erróneos y el servo se portaba mal.

Para solucionar el problema, me encontré con dos de los dispositivos de apagado de las baterías de los coches de RC, la intensificación de la

tensión hacia abajo usando un divisor de tensión. Gracias a DuaneB del foro Arduino ( http://arduino.cc/forum/index.php/topic,

102369.msg767877.html # msg767877 ) por señalar que el poder inadecuada fue la causa del problema.

¿Qué algoritmo de evitación de obstáculos usaré?

El coche va en constante ciclo a través de los siguientes pasos:

Barrer un sensor de proximidad una y de nuevo al frente del coche montándolo en un servo

A los 36 ángulos a lo largo del camino, la distancia ultrasónico sensor mide

Filtrar los ángulos en que la distancia sea inferior a cuatro pies

De los ángulos restantes, elegir el ángulo más cercano al punto de recorrido

Uno de los retos que me encontré mientras configurar esto fue que el coche parecía no llegar nunca al final de cada pasada para decidir a dónde ir.

Dos cambios fijos este problema: dejé de mostrar todas las mediciones en el Serial Monitor acelerado la velocidad de transferencia de serie desde

9600 a 11520 baudios. Gracias a dxw00d y Nick Gammon del foro Arduino ( http://arduino.cc/forum/index.php/topic, 102369.msg768401.html #

msg768401 ) para estas revisiones.

Page 5: Autonomous Car - evitación de obstáculos con sensor ultrasónico _ Jeff McAlvay

10/01/14 Autonomous Car - evitación de obstáculos con sensor ultrasónico | Jeff McAlvay

jeffsinventions.com/autonomous-car-obstacle-avoidance/ 5/16

Esquema de conexiones

Código

https://github.com/JeffsInventions/autonomouscar/blob/master/obstacleavoidance.ino

Esta entrada fue publicada en Sistemas Embebidos , Proyectos , Vehículos (autónomo y no) en07 de mayo 2012

[http://jeffsinventions.com/autonomous-car-obstacle-avoidance/] .

7 thoughts on " Autónoma coche - evitación de obstáculos con sensor de ultrasonidos "

Page 6: Autonomous Car - evitación de obstáculos con sensor ultrasónico _ Jeff McAlvay

10/01/14 Autonomous Car - evitación de obstáculos con sensor ultrasónico | Jeff McAlvay

jeffsinventions.com/autonomous-car-obstacle-avoidance/ 6/16

Pingback: Autonomous Car - Resumen | Inventos de Jeff

Esto es genial Jeff. Soy nuevo en la programación y estoy tratando de hacer un coche robot que localizar un obstáculo y avanzar hacia ella y luego

se detiene a una distancia designada, lejos. No entiendo lo que cada parte del código no gira, así que no puede determinar qué partes del código

que tengo que modificar y lo que he de código en localizar y trasladar a un objeto. Que o bien puede ayudarme a entender esas porciones de

código bien o reescritas proporciono las secciones? También estoy buscando a su proyecto de dirección y aceleración para ver en qué se diferencia

de la mía. Ya tengo el código de trabajo que va a localizar y trasladar a un objeto, pero es desigual y parece temperamental, así que estoy tratando

de hacer lo mejor.

Gracias,

Andrew

Andrés

10 de octubre 2012 a las 21:59

Hola Andrés,

Dado que el código era difícil de leer aquí, lo puse en github:

https://github.com/JeffsInventions/autonomouscar/blob/master/obstacleavoidance.ino .

En esencia, el código tiene las siguientes partes:

1) Crear una serie de ángulos y distancias barriendo el servo a la izquierda y la derecha y con las medidas de asimilación sensor de ultrasonidos en

el camino (líneas 155-180). Los ángulos se miden en anchuras de impulso (microsegundos) enviados al servo (800 es el más a la izquierda; 1700 es la

jeff

21 de octubre 2012 a las 23:50

Mensaje autor

Page 7: Autonomous Car - evitación de obstáculos con sensor ultrasónico _ Jeff McAlvay

10/01/14 Autonomous Car - evitación de obstáculos con sensor ultrasónico | Jeff McAlvay

jeffsinventions.com/autonomous-car-obstacle-avoidance/ 7/16

más a la derecha). Las distancias son en pulgadas. Cuando se hace, tendrá (sin las unidades):

(800US, 48 "), (810us, 24") ... (1700,50 ")

2) Mira a través de la gama de ángulos y distancias y, cuando la distancia es inferior a la distancia de obstáculos (minimumDistance), ajuste la

distancia al 0 (líneas 64-95). En el ejemplo, la matriz se convierte en:

(800US, 48 "), (810us, 0") ... (1700us, 50 ")

3) Averiguar qué distancia cada ángulo es desde el ángulo del coche se supone que se va (líneas 96-119). Digamos que el coche se supone que debe

estar pasando el ángulo que la correspondencia a un ancho de pulso de 900 nosotros, la matriz se convierte en:

(800US, 48 ", 100us), (810us, 0", 90US) ... (1700us, 50 ", 800US)

4) Mire a través de la matriz para encontrar el ángulo y sin un obstáculo (distancia! = 0 "), que es la más cercana a la dirección que el coche se

supone que se va (líneas 120-137). En el ejemplo, devolvería:

800US

5) Si no hubiera ángulos sin obstáculo, devuelva 0 (líneas 138-147).

Si usted quiere que vaya hacia un obstáculo, que iba a cambiar el paso 2. En lugar de establecer la distancia a 0 cuando hay un obstáculo, debe

ajustar la distancia a 0 cuando no hay un obstáculo. Dicho de otra manera, la línea 67 cambia de esto:

if (directionsAndDistances [i] [1]> = minimumDistance)

a esto:

if (directionsAndDistances [i] [1] <= minimumDistance)

Page 8: Autonomous Car - evitación de obstáculos con sensor ultrasónico _ Jeff McAlvay

10/01/14 Autonomous Car - evitación de obstáculos con sensor ultrasónico | Jeff McAlvay

jeffsinventions.com/autonomous-car-obstacle-avoidance/ 8/16

Si el problema están teniendo con su movimiento desigual implica el robot oscilando hacia atrás y adelante, usted podría considerar el control PID.

Brett Beauregard (el autor de la biblioteca PID Arduino) ha hecho una escritura agradable para arriba en él:

http://brettbeauregard.com/blog/2011/04/improving-the-beginners-pid-introduction/. Si no es oscilante, puede publicar su código y yo podemos

tener una mirada en ella.

por favor me ayude >>>

hago una muestra de coches sin conductor con 2 motores de corriente continua

y yo uso 4 sensor de ping

y me hago un control sobre el movimiento del coche usando sensores solamente!

ahora el coche puede evitar cualquier obstáculo ...

pero yo necesitará el coche se mueve recto y si se enfrentan a ningún obstáculo ... es evitarlo y volver a la línea recta

que utilizo brújula HMC883L ... y me sale la lectura de la brújula ...

ahora cómo puedo utilizar la lectura de la brújula para esto??

usted y lo siento por las gracias mi mala Inglés ...

el código hasta ahora:

# Include

# include

# include

# include

xbee NewSoftSerial (17, 16) / / RX, TX

NewSoftSerial GPS (19,18);

HMC5883L del compás;

gps TinyGPS;

shadi

22 de junio 2013 a las 10:11 am

Page 9: Autonomous Car - evitación de obstáculos con sensor ultrasónico _ Jeff McAlvay

10/01/14 Autonomous Car - evitación de obstáculos con sensor ultrasónico | Jeff McAlvay

jeffsinventions.com/autonomous-car-obstacle-avoidance/ 9/16

void gpsdump (TinyGPS y gps);

bool feedgps ();

getGPS void ( );

largo lat, lon, años, meses, días, horas, segundos, minutos,

flotar LAT, LON,

int error = 0;

const int pingPin1 = 3;

const int pingPin2 = 4;

const int pingPin3 = 5;

const int pingPin4 = 6;

int ledPin = 13;

int M1 = 7;

int M2 = 8;

int E1 = 9;

int E2 = 10;

int E3 = 11;

int E4 = 12;

largo cm1 cm2, cm3, cm4;

void setup ( )

{

GPS.begin (9600);

Serial.begin (9600);

Serial.println ("Inicio de la interfaz I2C.");

Serial.begin (9600);

Serial.println ("Arduino comenzó a enviar a través de bytes XBee");

/ / establecer la velocidad de datos para el puerto SoftwareSerial

xbee.begin (9600);

Serial.begin (9600);

pinMode (M1, OUTPUT);

pinMode (M2, OUTPUT);

Serial.begin (9600);

Page 10: Autonomous Car - evitación de obstáculos con sensor ultrasónico _ Jeff McAlvay

10/01/14 Autonomous Car - evitación de obstáculos con sensor ultrasónico | Jeff McAlvay

jeffsinventions.com/autonomous-car-obstacle-avoidance/ 10/16

pinMode (ledPin, SALIDA ); / / Establecer el pin LED como salida

Wire.begin ();

Serial.println ("La construcción de nueva HMC5883L");

brújula = HMC5883L (); / / Construir un nuevo HMC5883 brújula.

Serial.println ("Escala de ajuste de + / - 1,3 Ga");

error = compass.SetScale (1.3); / / Establecer la escala de la brújula.

if (error = 0!) / / Si hay un error, imprimir hacia fuera.

Serial.println (compass.GetErrorText (error));

Serial.println (". Ajuste del modo de medición a continua");

error = compass.SetMeasurementMode (Measurement_Continuous); / / Establecer el modo de medición de Continuo

if (error = 0!) / / Si hay un error, imprimirlo.

Serial.println (compass.GetErrorText (error));

}

void loop ()

{

ping1 ();

retardo (0);

Ping2 ();

retardo (0);

ping3 ();

retardo (0);

ping4 ();

retardo (0);

h ();

Page 11: Autonomous Car - evitación de obstáculos con sensor ultrasónico _ Jeff McAlvay

10/01/14 Autonomous Car - evitación de obstáculos con sensor ultrasónico | Jeff McAlvay

jeffsinventions.com/autonomous-car-obstacle-avoidance/ 11/16

MagnetometerRaw prima = compass.ReadRawAxis ();

MagnetometerScaled escala = compass.ReadScaledAxis ();

int MilliGauss_OnThe_XAxis = scaled.XAxis ;/ / (o eje Y, o ZAXIS)

flotar partida = atan2 (scaled.YAxis, scaled.XAxis);

flotar declinationAngle = 0,0626;

encabezamiento + = declinationAngle;

if (partida 2 * PI)

título - = 2 * PI;

flotador headingDegrees = partida * 180/M_PI;

Salida (partida, headingDegrees);

/ / enviar caracteres a través XBee a otros XBee conectado al Mac

/ / a través de cable USB

xbee.print ("\ tHeading: \ t");

xbee.print (partida);

xbee.print ("Radianes \ t ");

xbee.print (headingDegrees);

xbee.println ("Grados \ t");

largo lat, lon;

fix_age largo sin signo, hora, fecha, velocidad, rumbo,

caracteres de largo sin firmar;

frases cortas sin firmar, failed_checksum;

/ / recupera + / - lat / long en 100000ths de grado

gps.get_position (& lat, y lon, y fix_age);

/ / hora en el formato hh: mm: ss, fecha dd / mm / aa

Page 12: Autonomous Car - evitación de obstáculos con sensor ultrasónico _ Jeff McAlvay

10/01/14 Autonomous Car - evitación de obstáculos con sensor ultrasónico | Jeff McAlvay

jeffsinventions.com/autonomous-car-obstacle-avoidance/ 12/16

gps.get_datetime (y la fecha, y la hora, Y fix_age);

año = date% 100;

mes = (fecha / 100)% 100;

días = Fecha / 10000;

horas = tiempo / 1000000;

minutos = (tiempo / 10000)% 100;

segundo = (tiempo / 100)% 100 ;

Serial.print ("Fecha:");

Serial.print (años); Serial.print ("/");

Serial.print (meses); Serial.print ("/");

Serial.print (días);

Serial.print (":: Tiempo:");

Serial.print (horas); Serial.print (":");

Serial.print (minutos); Serial.print (":");

Serial.println (segundos) ;

getGPS ();

Serial.print ("Latitude:");

Serial.print (LAT/100000, 7);

Serial.print (":: Longitud:");

Serial.println (LON/100000, 7);

XBee. print ("Latitud:");

xbee.print (LAT/100000, 7);

xbee.print (":: Longitud:");

xbee.println (LON/100000, 7);

}

getGPS void () {

newdata bool = false;

Principio del disco = millis ();

/ / Cada 1 segundos, imprimimos una actualización

Page 13: Autonomous Car - evitación de obstáculos con sensor ultrasónico _ Jeff McAlvay

10/01/14 Autonomous Car - evitación de obstáculos con sensor ultrasónico | Jeff McAlvay

jeffsinventions.com/autonomous-car-obstacle-avoidance/ 13/16

mientras (millis () - comienzan 150 && cm2> 150)

{

digitalWrite (M1, HIGH);

digitalWrite (M2 , LOW);

analogWrite (E1, 175) / / PWM de control de velocidad

analogWrite (E2, 0); / / PWM de control de velocidad

de retardo (0);

}

más

{

if (cm3> 55)

{digitalWrite (M1, HIGH);

digitalWrite (M2, HIGH);

analogWrite (E1, 150) / / PWM de control de velocidad

analogWrite (E2, 0); / / PWM de control de velocidad

analogWrite (E3, 0); / / PWM de control de velocidad

analogWrite (E4, 255); / / PWM de control de velocidad

}

más

{

if (cm4> 55)

{digitalWrite (M1, HIGH);

digitalWrite (M2, HIGH);

analogWrite (E1, 150) / / PWM de control de velocidad

analogWrite (E2, 0) / / PWM de control de velocidad

analogWrite (E3, 255) / / PWM de control de velocidad

analogWrite (E4, 0); / / PWM de control de velocidad

}

más

{

digitalWrite (M1, HIGH);

Page 14: Autonomous Car - evitación de obstáculos con sensor ultrasónico _ Jeff McAlvay

10/01/14 Autonomous Car - evitación de obstáculos con sensor ultrasónico | Jeff McAlvay

jeffsinventions.com/autonomous-car-obstacle-avoidance/ 14/16

digitalWrite (M2, LOW);

analogWrite (E1, 0) / / PWM de control de velocidad

analogWrite (E2, 255) / / PWM de control de velocidad

analogWrite (E3, 0); / / PWM de control de velocidad

analogWrite (E4, 0); / / PWM de control de velocidad

}}}

}

void salida (título, flotador headingDegrees)

{

Serial.print ("\ tHeading: \ t");

Serial.print (partida);

Serial.print ("Radianes \ t");

Serial.print (headingDegrees);

Serial.println ("Grados \ t");

}

Hola Shadi,

Usted puede utilizar este modelo (esto es pseudo-código):

si se detecta obstáculo, entonces evitarlo (utilizando el código que ya tiene)

Jeff

25 de junio 2013 a las 10:24 am

Page 15: Autonomous Car - evitación de obstáculos con sensor ultrasónico _ Jeff McAlvay

10/01/14 Autonomous Car - evitación de obstáculos con sensor ultrasónico | Jeff McAlvay

jeffsinventions.com/autonomous-car-obstacle-avoidance/ 15/16

más, utilizar esta biblioteca de control PID ( http://playground.arduino.cc/Code/PIDLibrary ) de tal manera que el punto de referencia es la

dirección que usted define como recta, la entrada es la dirección en la que se lee en el compás, y la salida es el ángulo de dirección.

PID es un esquema de control que tiene como objetivo minimizar el error entre un valor deseado (por ejemplo, la temperatura que desea en una

habitación) y un valor de medición (por ejemplo, la temperatura actual de la habitación), mediante el control del grado en el cual se modifica el

sistema (por ejemplo, mediante la ejecución de un refrigerador a 50%).

He aquí un buen ejemplo de cómo utilizar la biblioteca PID: http://playground.arduino.cc//Code/PIDLibaryBasicExample

Buen trabajo que has hecho. pero yo también quiero construir evasión de obstáculos mediante sensores de ultrasonidos y PIC. cual es el mejor

algoritmo que puedo usar. Por ahora no estoy pensando en alcanzar una meta. Evitar obstáculos Only. Por favor, ayúdame.

Hola Norman,

Un enfoque ingenuo es:

-montar un sensor de ultrasonido en un servo tal que, para cada ángulo, usted sabe qué tan lejos está el objeto más cercano se

-elegir una gama de ángulos que sería en el camino del robot si continuaba recto (por ejemplo, si el sensor barre 180 grados, nada es entre 60

grados y 120 grados)

normando

24 de octubre 2013 a las 1:09 am

Jeff

24 de octubre 2013 a las 9:06 am

Page 16: Autonomous Car - evitación de obstáculos con sensor ultrasónico _ Jeff McAlvay

10/01/14 Autonomous Car - evitación de obstáculos con sensor ultrasónico | Jeff McAlvay

jeffsinventions.com/autonomous-car-obstacle-avoidance/ 16/16

SeguirSiga Jeff McAlvayRecibe cada nuevo post en este blog entregado a su bandeja de entrada.Únete a otros seguidores:

Enter email address

¡Inscríbeme!

-identificar un umbral de distancia de un obstáculo (por ejemplo, si algo es menos de 1 metro de distancia, empezar a evitar)

-si se detecta un obstáculo (definida como un objeto entre 60 y 120 grados y menos de 1 metro de distancia), entonces el robot retrocede un pie,

dirige un par de grados y luego va por delante.

Si quieres profundizar más en el tema, debes revisar Sebastian Thrun de (quien dirigió el equipo que ganó el primer coche Autónoma DARPA Grand

Challenge) curso acerca de cómo desarrollar un coche autónomo, en particular, las conferencias de localización: https://

www.udacity.com/wiki/cs373