# Definir el tamaño de una matriz?



## AndryuK (Jun 27, 2009)

BUeno e aqui mi proble estoy trabajando con un lego NXT v 1.0 y lo estoy programando con el BricxCC mi problema epieza al intentar manejar una matriz para poder que esta recorra un lugar plano la matriz es en 2 dimencione queiro que el robot pueda explorara el lugar primero y que al mismo tiempo valla dando los limites de la matriz para que depues este sepa en donde estan los obstaculos y pueda acer los siguientes infinitos recorridos mucho mas rapido y sin tropesarse infinitamente con los mismos obtaculos ademas de uqe aligual que el robot scooba pueda saber endonde esta el cargador.
  me han dicho que aga un recorrido al estilo prueba y error sin definir matrices, pero este me debuelbe alprimer problea nosolo se tropesara con los mismos obstaculos sino que tambien se demorara mucho en encontrar el cargador si es que lo encuentra antes de que sele acabe la bateria,
YouTube - Cleanmate QQ-2 - dokowanie
la intensión es que el robot diga algo asi
task main() {

     SetSensorLight(IN_1);
     SetSensorTouch(IN_2);

      while (Sensor(IN_1) > 35)
        {
           OnFwd(OUT_AB, 50);
        }

      Off(OUT_AB);
      OnFwd(OUT_A, -50);
      OnFwd(OUT_B, 50);
      Wait(1000);
      while (Sensor(IN_1) > 35)
        {
           OnFwd(OUT_AB, 50);
        }
      Off(OUT_AB);
      OnFwd(OUT_A, -50);
      OnFwd(OUT_B, 50);
      Wait(1000);
      OnFwd(OUT_AB, 50);
      Wait(800);
      OnFwd(OUT_A, -50);
      OnFwd(OUT_B, 50);
      Wait(1000);
      Off(OUT_AB);
con esto encontraria un aesquina apartir de aqui
entoncs empesaria con algo como empieze a contar cuanto tiempo duro el recorrido entre un obstaculo y otro vallamemorizando los datos convierta los tiempos entre obstaculo y obstaculo los convierta en unidades y genere la matris entre alto y ancho la programacion de exploracion seria asi

//repetición
while(Sensor(IN_2) == 0)
{
//primera línea de barrido
   if (Sensor(IN_2) == 0)
{      while (Sensor(IN_1) > 35)
        {
           OnFwd(OUT_AB, 50);
        }

      Off(OUT_AB);
      OnFwd(OUT_A, 50);
      OnFwd(OUT_B, -50);
      Wait(1000);
     OnFwd(OUT_AB, 50);
     Wait(800);
      OnFwd(OUT_A, 50);
    OnFwd(OUT_B, -50);
    Wait(1000);
 }
 else
 {      Off(OUT_AB);
 }
// segunda línea de barrido
   if (Sensor(IN_2) == 0)
{
      while (Sensor(IN_1) > 35)
        {
           OnFwd(OUT_AB, 50);
        }

      Off(OUT_AB);
      OnFwd(OUT_A, -50);
      OnFwd(OUT_B, 50);
      Wait(1000);
      OnFwd(OUT_AB, 50);
      Wait(800);
      OnFwd(OUT_A, -50);
     OnFwd(OUT_B, 50);
     Wait(1000);

 }
   else
   {   Off(OUT_AB);
   }
 }
      Off(OUT_AB);
} esta exploracion esta con un sensor de luz y otro de tacto lo he modificado con uno de tacto y otro de ultrosonido los motivos no necesito especificarlo como la exploracion se salto ciertos lugares para eso es la matriz cono son cuadros este completaria los lugares in "explorados" descubiertos en la matriz en obstaculos por verificar si son obstaculos o son lugares in explorados y agragarlos a la matriz. esto se haria una ves para repetirlo infinitamente. no se que usar si puertos paralelos oque... para eso pido ayuda calquier idea me ayudaria mucho


----------



## karl (Jul 1, 2009)

ok, creo que tu problema no esta bien definido, ya que la respuesta varia de caso en caso, dependiendo de la siguiente información:
1 cuantos objetos hay en el espacio que tiene que recorrer
2 a que velocidad se mueve (dependiendo de esto vas a tener que manejar registros mas grandes)
3 cuantos "rumbos" puede tomar el robot, no es lo mismo un robot que solo avance y retroceda que se controla con un bit que uno que tenga 4 direcciones, 8 o más, ya que vas a necesitar un numero de bits que puedan describirlo (por ejemplo, a 30 segundos de avanzar en dirección 1 avanza en direccion 4)
4 el algoritmo que use tu robot para navegar hasta su fuente de poder, si tu robot solo sigue un camino fijo, tu matriz se reduce a los objetos que encuentre en esa ruta, hasta que determine si su bateria esta muy baja, entonces retrocede por su ruta o avanza de acuerdo a la distancia hasta el cargador, por el otro lado, si recorre una ruta variable y se dirige a su cargador por la ruta mas corta, necesitas cartografiar todo el plano, lo que puede requerir varios megas de memoria.


----------



## AndryuK (Jul 1, 2009)

bueno el problema de meoria es facil de soulucionar el problema principal es que el robot por si mismo se de cuenta de cuanto mide la matriz, por descarte amedida que sepa cuanto mide la matriz asimismo va a saber cuantos obstaculos hai y donde estan


----------



## karl (Jul 2, 2009)

un robot no es consciente de cuanto "mide" su matriz, simplemente declaras "matriz de 3X3" o algo así durante la programación, ahora, el Lego tiene un microcontrolador (el Brick) con una memoria determinada, por lo cual el tamaño está delimitado por esta.

El problema es que al momento de programar, el compilador o el interprete necesitan declarar un espacio de memoria para la matriz, en el Qbasic de Microsoft, se podia direccionar un maximo de 32k, en otros lenguajes y con otros recursos vas a tener distintos valores.

La posibilidad que puedes hacer es hacer una matriz de un numero alto de elementos, para este ejemplo 100 elementos y 101 direcciones, en la dirección 101 registras el numero de celda en el que está el ultimo obstaculo y su acción, de esa forma puedes decirle al robot: toma el elemento 101, sumale 1 y coloca el valor del nuevo obstaculo en esa dirección, luego registra esta en el elemento 101.
y cuando lea, que accese esa dirección para saber que debe hacer cuando llegue a este (si tu matriz se lleno hasta el 50, entonces cuando marque 51 debe regresar a 0)


----------



## AndryuK (Jul 2, 2009)

gracias, he investigao un poco mas acerca del caso y decidi hacer el tamaño de la matriz lo mas grande posible y que el espacio sobrante nova apode llegar hhasta alla porque hai obstaculos enmedio posiblemente seuqede en un bible tratando de llegar haste alla y no podes poque hay obstaculos hasta que se el agote la bateria que es una prioridad mayor y tenga que volver a cargarla


----------



## karl (Jul 2, 2009)

la matriz en la que yo pensaba era una especie de mapa, basado en la tecnica de "Dead Reckoning", que es lo más parecido a buscar el tesoro del pirata con el mapa del muerto:
"al llegar a la palmera rota, dar vuelta al sur y caminar 30 pasos, hasta la piedra que parece calavera"
en lenguaje maquina seria:
"avanza hasta el obstaculo 1, gira 90° hacia la derecha (apuntando al sur), y avanza hasta el obstaculo 2, a 25 metros"
esta matriz puede estar relacionada a una serie de instrucciones, por ejemplo:
objeto       motor izquierdo     motor derecho      a cargador (mot izq) a cargador (mot der)
01                 avanza .05         retrocede .05                  avanza .7             retrocede .9
                     avanza 1            avanza 1                         avanza 1              avanza 1
02                 retrocede .02     avanza.02                       avanza  .72          retrocede .85
                     avanza 2            avanza 2                            etc                      etc


----------



## AndryuK (Jul 2, 2009)

la matariz sobre la que yo lei, se trataba de que todos los puntos eran puntos pendientes por visitar, pero hay una serie de reglas, si el espacio enfrente tuyo estalibre avansa, si el de la derecha esta vacio dale mas prioridad a este lugar , si el de la izquierda esta vacio este menos prioridad que el que esta en frente. entoncs en cualquier lugar va a tener este tipo de reglas , y asi el robot por medio se algun sensor se auto explicara enque lugar estan los obstaculos


----------

