Programación Funcional - Sistema de coordenadas

 
Vista:
sin imagen de perfil

Sistema de coordenadas

Publicado por Eduardo (3 intervenciones) el 09/03/2023 22:12:45
Hola gente, buenas, espero alguno pueda ayudarme, estoy tratando de hacer un robot corta cesped, tengo la mayor parte de la programación solucionada se puede decir, pero el único inconveniente que encuentro de momento es, programarlo para que a determinado punto de carga de las baterias, retome al punto 0(donde estaria el cargador de las baterías) y que transcurrido el timpo de carga y este listo para volver a salir, retome donde quedo o programar de alguna forma eñun recorrido, pero tendria que tener un sistema mas complejo calculo para que pueda cubrir todo el jardin, espero se entienda el concepto de lo que quiero tratar de hacer, desde ya muchas gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Sistema de coordenadas

Publicado por Rolando José (12 intervenciones) el 09/04/2023 00:46:37
podrías hacer un sistema que se ubica por triangulacion de acuerdo a la potencia de varias routers wifi. en arduino es fácil hacer un escaneo wifi y de acuerdo a la potencia de las señales se pueda ubicar y ir al sitio de carga.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Sistema de coordenadas

Publicado por Eduardo (3 intervenciones) el 11/04/2023 04:02:43
Hola,gracias por la respuesta, queria saber si me podrias decir o darme un link de algun video explicando como hacerlo,desde ya muchas gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Sistema de coordenadas

Publicado por Rolando José (12 intervenciones) el 11/04/2023 19:05:35
Bueno no es una excusa:
Lo que pasa es que el 24 de diciembre de 2020 me dio un ACV y quede medio bobo, aparte de perder la memoria completa, perdí la movilidad del 30% del cuerpo, por lo que para teclear y sobre todo código para mi es una tortura lo que me gasto respondiendo a estas preguntas mucho tiempo.

Muchas veces tampoco me coinciden las cosas que tecleo con las que pienso, y me toca tener paciencia para que cuando coincidan, poder contestar preguntas en esta web. por lo que no pude decirte antes como era el escaner wifi, pero me puse a buscar en el computador y encontre el codigo que hice antes de mi evento cerebral.

Ya he aprendido muchas cosas nuevas, ya volví a aprender algo de matematicas, volvi a aprender a caminar, algo de python y algo de SVG y de C estoy estudiandolo en una pagina gratuita que me parece muy buena. https://www.w3schools.com/que de antes del 2020 no sabia bien, si colaboraba con cosas como:
https://mail.python.org/pipermail/python-es/2006-November/014883.html En el foro de python en español , lo que podia, pero mas que todo era porque desde antes del ACV era un programador avanzado en TCL/TK, y al compartir el GUI con python, entonces yo asesoraba entre otras cosas a personas que gracias a Dios hoy muy influyentes como un tal Chema Cortes que me escribia mucho, por ahi volvi a encontrar esos correos de 2002 a 2009.
aqui el codigo de el scanwifi con arduino.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
void scanwifi() {
    int m = 0;
    display.fillScreen(fondografico);
  while (pan==3 && menu==3 && item==0) {
    delay(500);
    int n = WiFi.scanNetworks();
    Serial.println("Iniciando Escaneo WIFI\n");
    if (n == 0) {
      display.setCursor(3, 20);
      display.setTextColor(RED);
      display.setTextSize(1);
      Serial.println("No hay Redes\n");
    } else {
      display.fillRect(0,0,dancho,20,BLACK);
      Serial.printf("Hay %i Redes:\n",n);
      display.setCursor(3, 3);
      display.setTextColor(YELLOW);
      display.setTextSize(1);
      display.printf("Hay %i Redes:",n);
 
/*
      display.setCursor(40, 20);
      display.setTextColor(RED);
      display.setTextSize(1);
      display.println(n);
*/
      if (n>10){m=10;}else{m=n;}
      for (int i = 0; i <= m; ++i) {
        delay(200);
 
        boton[4]=1;
        botones();
 
        delay(200);
        if (pan!=3) {display.fillScreen(BLACK);pan=3;menu=1;return;}
        if (menu!=3) {display.fillScreen(BLACK);pan=3;menu=1;return;}
        if (item!=0) {display.fillScreen(BLACK);pan=3;menu=1;item=1;return;}
 
        Serial.print("|\t");
        Serial.print(WiFi.SSID(i));
        Serial.print("\t\t\t|\t");
        Serial.print(WiFi.BSSIDstr(i));
        Serial.print("\t|\t");
        Serial.print(WiFi.RSSI(i));
        Serial.print("\t|\t");
        Serial.print(WiFi.channel(i));
        Serial.print("\t|\t");
        Serial.print((WiFi.encryptionType(i) == WIFI_AUTH_OPEN)?" ":"*");
        Serial.print("\t|\n");
 
        int ancho = (display.width()/(m+2));
        int posy = (ancho*i)+15;
        int largo = int(abs(WiFi.RSSI(i))*128/256);
        display.setCursor(50, posy);
        display.setTextSize(1);
 
        if (grafoscan==1) {
          display.fillRect(0,posy,dancho,ancho,BLACK);
          if (i==0) {display.fillRect(0,posy,largo,ancho,WHITE);}
          if (i==1) {display.fillRect(0,posy,largo,ancho,RED);}
          if (i==2) {display.fillRect(0,posy,largo,ancho,GREEN);}
          if (i==3) {display.fillRect(0,posy,largo,ancho,BLUE);}
          if (i==4) {display.fillRect(0,posy,largo,ancho,YELLOW);}
          if (i==5) {display.fillRect(0,posy,largo,ancho,MAGENTA);}
          if (i==6) {display.fillRect(0,posy,largo,ancho,ORANGE);}
          if (i==7) {display.fillRect(0,posy,largo,ancho,CYAN);}
          if (i==8) {display.fillRect(0,posy,largo,ancho,GREY);}
          if (i==9) {display.fillRect(0,posy,largo,ancho,WHITE);}
          if (i==10) {display.fillRect(0,posy,largo,ancho,RED);}
          if (i==11) {display.fillRect(0,posy,largo,ancho,GREEN);}
          if (i==12) {display.fillRect(0,posy,largo,ancho,BLUE);}
          if (i==13) {display.fillRect(0,posy,largo,ancho,YELLOW);}
          if (i==14) {display.fillRect(0,posy,largo,ancho,MAGENTA);}
          if (i==15) {display.fillRect(0,posy,largo,ancho,ORANGE);}
          if (i==16) {display.fillRect(0,posy,largo,ancho,CYAN);}
          if (i==17) {display.fillRect(0,posy,largo,ancho,GREY);}
        }
        if (grafoscan==2) {
          display.fillRect(0,posy,dancho,ancho,BLACK);
          if (i==0) {display.drawLine(largo,posy,largo,(ancho+posy),WHITE);}
          if (i==1) {display.drawLine(largo,posy,largo,(ancho+posy),RED);}
          if (i==2) {display.drawLine(largo,posy,largo,(ancho+posy),GREEN);}
          if (i==3) {display.drawLine(largo,posy,largo,(ancho+posy),BLUE);}
          if (i==4) {display.drawLine(largo,posy,largo,(ancho+posy),YELLOW);}
          if (i==5) {display.drawLine(largo,posy,largo,(ancho+posy),MAGENTA);}
          if (i==6) {display.drawLine(largo,posy,largo,(ancho+posy),ORANGE);}
          if (i==7) {display.drawLine(largo,posy,largo,(ancho+posy),CYAN);}
          if (i==8) {display.drawLine(largo,posy,largo,(ancho+posy),GREY);}
          if (i==9) {display.drawLine(largo,posy,largo,(ancho+posy),WHITE);}
          if (i==10) {display.drawLine(largo,posy,largo,(ancho+posy),RED);}
          if (i==11) {display.drawLine(largo,posy,largo,(ancho+posy),GREEN);}
          if (i==12) {display.drawLine(largo,posy,largo,(ancho+posy),BLUE);}
          if (i==13) {display.drawLine(largo,posy,largo,(ancho+posy),YELLOW);}
          if (i==14) {display.drawLine(largo,posy,largo,(ancho+posy),MAGENTA);}
          if (i==15) {display.drawLine(largo,posy,largo,(ancho+posy),ORANGE);}
          if (i==16) {display.drawLine(largo,posy,largo,(ancho+posy),CYAN);}
          if (i==17) {display.drawLine(largo,posy,largo,(ancho+posy),GREY);}
        }
        if (grafoscan==3) {
          display.fillRect(0,posy,dancho,ancho,BLACK);
          if (i==0) {display.drawCircle((largo/2),posy+(ancho+posy)/2,(largo/2),WHITE);}
          if (i==1) {display.drawCircle((largo/2),posy+(ancho+posy)/2,(largo/2),RED);}
          if (i==2) {display.drawCircle((largo/2),posy+(ancho+posy)/2,(largo/2),GREEN);}
          if (i==3) {display.drawCircle((largo/2),posy+(ancho+posy)/2,(largo/2),BLUE);}
          if (i==4) {display.drawCircle((largo/2),posy+(ancho+posy)/2,(largo/2),YELLOW);}
          if (i==5) {display.drawCircle((largo/2),posy+(ancho+posy)/2,(largo/2),MAGENTA);}
          if (i==6) {display.drawCircle((largo/2),posy+(ancho+posy)/2,(largo/2),ORANGE);}
          if (i==7) {display.drawCircle((largo/2),posy+(ancho+posy)/2,(largo/2),CYAN);}
          if (i==8) {display.drawCircle((largo/2),posy+(ancho+posy)/2,(largo/2),GREY);}
          if (i==9) {display.drawCircle((largo/2),posy+(ancho+posy)/2,(largo/2),WHITE);}
          if (i==10) {display.drawCircle((largo/2),posy+(ancho+posy)/2,(largo/2),WHITE);}
          if (i==11) {display.drawCircle((largo/2),posy+(ancho+posy)/2,(largo/2),RED);}
          if (i==12) {display.drawCircle((largo/2),posy+(ancho+posy)/2,(largo/2),GREEN);}
          if (i==13) {display.drawCircle((largo/2),posy+(ancho+posy)/2,(largo/2),BLUE);}
          if (i==14) {display.drawCircle((largo/2),posy+(ancho+posy)/2,(largo/2),YELLOW);}
          if (i==15) {display.drawCircle((largo/2),posy+(ancho+posy)/2,(largo/2),MAGENTA);}
          if (i==16) {display.drawCircle((largo/2),posy+(ancho+posy)/2,(largo/2),ORANGE);}
          if (i==17) {display.drawCircle((largo/2),posy+(ancho+posy)/2,(largo/2),CYAN);}
          if (i==18) {display.drawCircle((largo/2),posy+(ancho+posy)/2,(largo/2),GREY);}
          if (i==19) {display.drawCircle((largo/2),posy+(ancho+posy)/2,(largo/2),WHITE);}
        }
        display.setTextColor(YELLOW);
/*
        if (grafoscan==1) {display.fillRect(0,posy,largo,ancho,int("ucolor0"+i));}
        if (grafoscan==2) {display.drawLine(0,posy,largo,(ancho+posy),int("ucolor0"+i));}
        if (grafoscan==3) {display.drawCircle((largo/2),(ancho+posy)/2,(largo/2),int("ucolor0"+i));}
        display.setTextColor(int("ucolor0"+i));
*/
        if (tiposcan==1) { display.print(WiFi.SSID(i));}
        if (tiposcan==2) { display.printf("%s %s",WiFi.RSSI(i),WiFi.SSID(i));}
        if (tiposcan==3) { display.print(WiFi.BSSIDstr(i));}
        if (tiposcan==4) { display.printf("%s %s",WiFi.channel(i)+WiFi.SSID(i));}
      }
    }
  }
}

ESe codigo mas que nada detecta las redes wifi, y su potencia y hace un histograma de las potencias identificando el nombre del router, su MAC y su potencia.

lo que te tocaria hacer es ir probando y que el robot, se fuera dirigiendo hacia donde "siente" mas potencia de un router wifi especifico, es el mismo método usado por las balizas beacon, luego la triangulacion en teoria funciona cuando dibujas tres circulos con el radio dado por las potencias de los routers, y se teoriza que el lugar donde se ubica el sensor en este caso el robot deberia ser donde se intersectan los 3 circulos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Sistema de coordenadas

Publicado por Eduardo (3 intervenciones) el 12/04/2023 03:12:49
Hola,muchísimas gracias y espero sigas mejorando,la verdad que ya es mucha ayuda,de verdad
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Sistema de coordenadas

Publicado por Rolando José (12 intervenciones) el 12/04/2023 18:51:32
Bueno realmente no pude dormir, porque creo que el codigo no te va a funcionar mucho, si no tienes los parametros iniciales, como el modelo del procesador, y mi hermano que es el electronico me dice que te de indicaciones de todo el archivo, porque como ese proyecto ya se vendio, ya no tenemos el circuito.

Me gusto este problema, lo cual me hizo pensar que habria otras formas de resolverlo: te las menciono y te las explico mas adelante:
yo pense en estos metodos de ubicacion:
1, por wifi o bluetooth de acuerdo a la potencia de la señal para eso el scaner wifi.
2. con una IA que aprenda sobre como volver a la base, de acuerdo a la potencia detectadas por el wifi.
3, con un acelerometro que mida aceleracion y rumbo, porque con eso se puede hacer un mapa de todo el terreno.
4. con un podometro que mida distancia y direccion, igual al anterior, pero mas exacto en la distancia.
5. con una cuerda que va dejando y luego enrollando el robot. la cuerda pasa por unas argollas y sabe en que rumbo girar a la izq o der.
6. con una linterna en la base un una camara en el robot. lo mismo que el anterior la camara buscaria la luz mas brillante y en cambio de argollas unos espejos u otras camaras como los espejos de direccion de los autos.
7. con un lidar encima del robot, esta version puede ser muy costosa y dificil, porque la camara para detectar el laser es lineal o puntual, y mide es el tiempo desde que sale el laser hasta que se ve el brillo en los objetos y se rastrea en 360 grados.
8. con unos sensores de ultrasonido que van haciendo el mapa, lo mismo que el anterior pero mucho mas barato y facil, los kits ya estan tanto en youtube como en el comercio.

lo cual me lleva a pensar que lo mejor sin saber mas de tu proyecto robotico quizas seria, bueno que hiciera un simulador y en el pueda simular las diferentes metodos para que pueda tambien en él desarrollar los diferentes algoritmos o hacer una IA de aprendizaje automatico que optimice distancia y ruta.

me inclino por hacer el simulador mi problema es que lo que se solamente es SVG y TCL, y creo que tu solo sabes C de arduino.

yo pensaba en SVG porque permite dibujar todo en HTML, y programar luego en javascript.
En TCL lo pense porque tiene tanto el gUI como el lenguaje y el manejo matematico para la triangulación, y seria compatible con python, luego podria ser llevado a web, windows o linux.

voy a ver en que direccion me decido. este tipo de problema me parece muy interesantes.

por lo pronto creo que lo mejor es crear el area de simulacion con SVG, que es lo que se, pero que uds tambien podrian ver solo con html, y con javascript mover el robot.

por el momento se mueve pero luego miro como capturo las coordenadas donde se mueve.
a alguien le respondi de como mover una bola con python y tkinter pero ahora lo hice con SVG sobre html

tambien esa podria ser la otra solucion:

python, y tkinter, que como se TCL se me facilita mucho pues son casi iguales.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<html><body><svg viewBox="0 0 1600 310"
onkeydown="drag(event)">
<rect x="0" y="0" width="1600" height="300" fill="#0F0" rx="20"/>
<circle id="circle" cx="50" cy="50" r="25" fill="red" />
<script type="text/javascript">
	<![CDATA[
	var moveSpeed = 5;
	var circle = document.getElementsByTagName("circle")[0];
	var x = circle.getAttribute('cx')*1;
	var y = circle.getAttribute('cy')*1;
	var r = circle.getAttribute('r')*1;
	document.documentElement.addEventListener('keydown',function(evt){
		switch (evt.keyCode){
			case 37:
				document.getElementById("circle").setAttribute('cx',x-=moveSpeed);
				break;
			case 38:
				document.getElementById("circle").setAttribute('cy',y-=moveSpeed);
				break;
			case 39:
				document.getElementById("circle").setAttribute('cx',x+=moveSpeed);
				break;
			case 40:
				document.getElementById("circle").setAttribute('cy',y+=moveSpeed);
				break;
			case 187:
				document.getElementById("circle").setAttribute('r',r+=moveSpeed);
				break;
			case 189:
				document.getElementById("circle").setAttribute('r',r-=moveSpeed);
				break;
			case 82:
				document.getElementById("circle").setAttribute('fill',"#f00");
				break;
			case 70:
				document.getElementById("circle").setAttribute('fill',"#ff0");
				break;
			case 71:
				document.getElementById("circle").setAttribute('fill',"#0f0");
				break;
			case 72:
				document.getElementById("circle").setAttribute('fill',"#f0a");
				break;
			case 66:
				document.getElementById("circle").setAttribute('fill',"#00f");
				break;
			case 84:
				document.getElementById("circle").setAttribute('fill',"#fa0");
				break;h
			case 86:
				document.getElementById("circle").setAttribute('fill',"#0ff");
				break;
			default:
				alert(evt.keyCode);
		}
	},false);
	]]>
</script>
</svg></Body></html>

bueno tambien va tocar mirar como ir dibujando los muros o algo como pintar con otro robot, pero que permita dibujar muros puertas y ventanas y donde ubicar los routers
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Sistema de coordenadas

Publicado por Rolando José (12 intervenciones) el 02/08/2023 03:22:09
me da pena porque la verdad la fisioterapia no me deja mucho tiempo y cuando tengo tiempo me pongo a hacer sueños mios.

en este momento estoy barado porque mi sueño es hacer un OCR mas rapido que tesseract y que no sea por IA sino por un codigo heuristico, un algoritmo basico que en una imagen jpg dibuje un cuadrado al rededor de cada letra, para luego empezar a reconocerlas.

cuando estoy bloqueado, busco otros proyectos y recurro a esta pagina a ver que aportaciones quedaron como en el aire...

Vi que en esta hice una propuesta de un simulador para un robot, ya en html ya muevo el robot con las flechas, falta que vaya dibujando un rastro, para luego hacer un algoritmo que se devuelva hasta la base.

Yo muchas veces empiezo en TCL o en JS, salto a python, luego en VB y/o C.

voy a intentar iniciar de nuevo:

un robot que se mueva y vaya dejando el rastro, una vez se haga en TCL sera facil pasarlo a python.

ya vengo...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar