Buenas!Estoy construyendo un Boe Bot utilizando una placa Chipkit UNO32 trabajando con entorno Arduino. Ya tengo hecho que el robot ande y se detenga antes de llegar a la pared usando los ultrasonidos.
Ahora me queda la parte de cuando encuentre un obstáculo gire la cabeza de un lado hacia otro y busque el mejor camino, pero he aquí mi duda.
Mi primer intención era que el robot girara los 90º hacia un lado y otros 90º hacia el otro y recoger por ejemplo 8 valores de distancia (4 a cada lado) y optar por la mejor opción. Después me di cuenta de un error (que aún no sé como lo arreglaría) y es que si por ejemplo el robot llega a una esquina (imaginaos una esquina con pared de frente y derecha y la parte de la izquierda libre) y entre la esquina y un objeto a la izquierda (es decir, donde no hay esquina) hay un espacio vacío y el robot me dice que hay mucha distancia y opta por ir hacia ese lado con la mala suerte de que ese espacio leído entre el obstáculo y la pared es muy chico, el robot intentaría pasar por un sitio que su cuerpo no cabe. No sé si me he explicado bien, porque no sé como hacerlo xD
Respecto a las 8 mediciones iniciales que tenía pensado al principio se me ocurrió reducirlas el número para intentar rellenar una matriz. Me explico, sería muy bonito (y difícil) que el robot pudiera mapear una habitación, por lo que había pensado que si la habitación fuera cuadrada crear una matriz llena de 0 y dividir la habitación por sectores (más grande que el propio robot cada sector para que pueda pasar en caso de encontrar un obstáculo) de manera que mientras que el robot vaya rellenando la matriz con 1 por ejemplo es por donde va pasando y cuando encuentre un obstáculo le ponga 2. De esta manera, el robot tendría que medir a 0º, 45º, 90º, 135º y 180º, así obtendría que en el caso de que me encontrase un obstáculo con el robot.
Me intentaré explicar, si tengo una matriz 100x100 y estoy en la fila 50 y columna 50 (en el centro suponiendo que la primera fila y columna empiecen en 1 y no en 0) y tengo un obstáculo delante, el robot me marcaría un 2 en la fila 49 y columna 50. Si decide el robot irse a la derecha seguiría en la misma fila y distinta columna. La finalidad de medir a 45º y 135º es que es en caso de encontrar obstáculo y querer moverme con el robot, éste podría irse a la fila anterior y columna anterior también en el caso de 45º y a una fila anterior y una columna más en caso de 135º.
Es un poco caótico explicarlo por aquí, además, aún más difícil sería la posición inicial del robot. Lo único que se me ocurre es soltarlo en la esquina de la habitación siempre y que parta desde el mismo punto.
Siento el tocho y la explicación, espero que la idea se entienda un poco al menos. Espero vuestra opiniones y cambios en mi planteamiento. Muchas gracias, saludos.
tocho tocho!! jeje
buff a mi me da que tienes que replantearte como almacenar los datos que el robot recoge porque lo de la matriz 100x100 e ir rellenandola no lo veo.
respecto a si el robot ve un hueco y cabe o no cabe es tan sencillo como cuando detecte un hueco, que realice unas cuantas mediciones mas cercanas al hueco. usando trigonometria sacas la distancia al objeto, angulos y demas y sabras si el robot cabe.
suerte porque me da que no es sencillo tu objetivo final
¿Por que no utilizas un sistema de coordenadas polares? es como usar vectores, solo necesitas dos datos: dirección y distancia.
Puedes hacer que el robot de una vuelta completa a intervalos regulares tomando una medida, cuando haya dado una vuelta completa tendrás una idea bastante precisa de donde se encuentra respecto a la forma de la habitación y posibles obstáculos.
También puedes montar el senser de distancia en un servo y hacer las medidas partiendo del giro del servo, ganarás en precisión, aunque solo cubrirás un arco de 180º.
josemanu:
¿Por que no utilizas un sistema de coordenadas polares? es como usar vectores, solo necesitas dos datos: dirección y distancia.
Puedes hacer que el robot de una vuelta completa a intervalos regulares tomando una medida, cuando haya dado una vuelta completa tendrás una idea bastante precisa de donde se encuentra respecto a la forma de la habitación y posibles obstáculos.
También puedes montar el senser de distancia en un servo y hacer las medidas partiendo del giro del servo, ganarás en precisión, aunque solo cubrirás un arco de 180º.
Suerte.
o montar 2 servos y asi tienes 360.
de esa forma ahorras en bateria ya que los servos consumen menos que girar todo el robot, en tiempo porque tardaras menos, y encima te aseguras de que no tienes un error al hacer que el robot gire 360 pero no se quede exactamente en la misma posición que la incial. cosa que es mas dificil que pase si solo mueves los servos.
Pero si ya tienes el sensor de ultrasonidos montado sobre un servo... solo te tienes que poner con el código y no es complicado.
Una idea, en el primer recorrido del servo puedes tomar 18 medidas cada 10º y en el recorrido de vuelta haces que el primer cambio sea de 15º y haces 17 medidas de 10º, puedes almacenar los resultados en una matriz de 35x2 y tendrás medidas en intervalos de 5º con lo que la precisión del mapeo será mayor y el riesgo de hacer que el robot intente entrar por un hueco por el que no cabe muy pequeño.
Venga ánimo, si has montado el boebot programarlo es cuestión de constancia y ser meticuloso. De todos modos si te atascas con algo del código lo posteas y te echamos una mano.