Plan de hoy: tres bloques¶
| # | Bloque | Pregunta que responde |
|---|---|---|
| 1 | ¿Por qué localizar? | ¿Por qué no basta la odometría de la semana pasada? |
| 2 | Mapas y landmarks | ¿Con qué referencia externa corrige el robot su posición? |
| 3 | Cerrar el lazo con la cámara | ¿Cómo se convierte lo que ve la cámara en una orden para las ruedas? |
Al final: las prácticas con el celular montado sobre el EV3.
¿Por qué localizar?¶
![]()
¿Por qué localizar?¶
- Aun con $r$ y $l$ perfectos, el patinaje aleatorio hace crecer la nube en cada esquina
- Calibrar quita lo sistemático; lo aleatorio solo se acota midiendo afuera
Incertidumbre de sensores y efectores¶
| Fuente | En nuestro laboratorio |
|---|---|
| Ruido del efector: una misma orden produce movimientos distintos | patinaje en las juntas del piso, batería que baja |
| Ruido del sensor: la lectura cambia aunque nada se mueva | la cámara con poca luz, desenfoque al moverse |
| Aliasing: lugares distintos producen la misma lectura | dos esquinas iguales, dos baldosas iguales |
Un solo dato casi nunca basta: se necesita una serie de lecturas.
Aliasing: muchos lugares, la misma lectura¶
Moverse y volver a mirar elimina las hipótesis que no son consistentes.
Predicción y corrección¶
- Los encoders predicen: rápido, siempre disponible, pero el error crece
- La cámara corrige: solo cuando ve una marca, pero no acumula error
Corregir con una marca¶
- Sin marcas, la incertidumbre crece sin límite
- Con una marca cada metro, queda acotada: diente de sierra
¿Localizar o no localizar?¶
| Navegación por comportamientos | Navegación basada en mapas |
|---|---|
| reglas que producen el movimiento: "seguir la línea" | el robot sabe dónde está en un mapa |
| no necesita saber su posición | la posición es explícita y se puede mostrar |
| rápida de programar en un entorno | escala a otros entornos y destinos |
| no escala: cada lugar exige otro programa | exige un mapa y un buen sistema de localización |
Hoy hacemos las dos: ArUco para localizar y control P para seguir una línea.
Mapas y Landmarks¶
![]()
Mapas y Landmarks¶
| Representación | Ventaja · desventaja |
|---|---|
| Continua | precisa y compacta · cara de comparar con el sensor |
| Grilla de ocupación | simple, ideal con sensores de rango · ocupa mucha memoria |
| Topológica | se ajusta a lo que el robot reconoce · pierde la geometría |
¿Dónde cree el robot que está?¶
- Hipótesis única: fácil para decidir, pero no sabe cuánto se equivoca
- Múltiples hipótesis: guarda la incertidumbre, pero cuesta más calcular y decidir
Landmarks en la industria¶
| Tipo | Ejemplo |
|---|---|
| Naturales | esquinas, puertas, columnas que ya existen |
| Artificiales pasivos | códigos en el piso: KIVA / Amazon Robotics · marcas en el techo |
| Balizas activas | GPS al aire libre · UWB en interiores |
| Rutas marcadas | cinta en el piso, cable guía enterrado: el robot sigue un "riel" |
Modificar el entorno es barato y confiable: por eso la industria lo prefiere.
Marcadores ArUco¶
- Un borde negro fácil de encontrar y 16 bits que codifican el ID
- El diccionario
DICT_4X4_50tiene 50 marcadores elegidos para no confundirse entre sí
Detectar un marcador¶
dic = cv2.aruco.getPredefinedDictionary(cv2.aruco.DICT_4X4_50)
detector = cv2.aruco.ArucoDetector(dic, cv2.aruco.DetectorParameters())
corners, ids, _ = detector.detectMarkers(gray)
if ids is not None:
c = corners[0][0] # 4 esquinas (x, y) en píxeles
centro = (c[0] + c[2]) / 2 # mitad de la diagonal
vx, vy = c[1] - c[0] # borde superior del marcador
lado_px = np.hypot(vx, vy)
escala = lado_px / 0.0254 # píxeles por metro
angulo = np.degrees(np.arctan2(vy, vx))
De píxeles a metros¶
$$\text{escala} = \frac{80\,px}{0.0254\,m} \approx 3150\,px/m$$
$$\Delta x = \frac{90}{3150} = 2.9\,cm$$
$$\Delta y = \frac{-120}{3150} = -3.8\,cm$$
Corregir la odometría con una marca¶
$$\theta = \theta_{marca} - \alpha$$
$$x = x_{marca} - (\Delta x \cos\theta - \Delta y \sin\theta) \qquad y = y_{marca} - (\Delta x \sin\theta + \Delta y \cos\theta)$$
Cerrar el Lazo con la Cámara¶
![]()
La cámara como sensor¶
| Resolución | Píxeles por imagen |
|---|---|
| 1920 × 1080 (Full HD) | 2 073 600 |
| 640 × 480 | 307 200 |
| 320 × 240 | 76 800 |
- Cada píxel tiene 3 canales de color: millones de datos por imagen
- En visión para robots se reduce la resolución para procesar más imágenes por segundo
Una fila de la imagen¶
- Lo que está por debajo del umbral es la línea; su centro de masa es su posición
- El error es la distancia entre ese centro y el centro de la imagen
Control proporcional¶
$$vr = K_p \cdot \text{error}_x \qquad \text{error}_x = \frac{\text{width}}{2} - \text{centro}_x$$
- P reacciona al error presente · I acumula el error pasado · D anticipa con su tendencia
¿Por qué no se alinea?¶
- Con $K_p$ bajo, el robot se queda quieto antes de llegar al centro
- Con $K_p$ alto, se pasa y oscila: la imagen llega tarde
Seguir la línea¶
$$v_d = v_t + v_r \qquad v_i = v_t - v_r \qquad \text{turn} = 100\left(1 - \frac{v_{min}}{v_{max}}\right)$$
| Se pide | speed | turn | El robot |
|---|---|---|---|
| vt = 20, vr = 0 | 20 | 0 | va recto |
| vt = 20, vr = 10 | 30 | 66 | curva a la izquierda |
| vt = 20, vr = −10 | 30 | −66 | curva a la derecha |
| vt = 10, vr = 10 | 20 | 100 | pivota sobre la rueda izquierda |
En el ejercicio: ↑ ↓ cambian $v_t$ · ← → cambian $K_p$
De la línea a un punto: ir a $(x, y)$¶
$$d = \sqrt{\Delta x^2 + \Delta y^2} \qquad \Delta\alpha = \operatorname{atan2}(\Delta y, \Delta x) - \theta$$
| Situación | Orden |
|---|---|
| mal orientado: más de 5° | girar en el sitio hacia el objetivo |
| bien orientado | avanzar ∝ distancia y corregir ∝ ángulo |
| a menos de 0.5 cm | siguiente objetivo |
C10: un cuadrado de 50 cm como lista de puntos, no de giros
El robot con celular¶
- App: IP Webcam (Android) o IP Camera Lite (iOS)
- Celular y PC en la misma red: si la de la universidad falla, un hotspot
- La IP del celular cambia con cada red: revísenla en la app antes de correr
C01
Prácticas de la semana¶
| # | Guía | Qué se aprende |
|---|---|---|
| 1 | Uso cámara del celular | transmitir el video al PC (C01, C02) |
| 2 | La información de la cámara | una fila, el umbral y el centro de masa (C03) |
| 3 | Control continuo | control P del giro y seguir una línea (C04, C05) |
| 4 | ArUco | detectar marcas y medir distancias (C06, C07, C08) |
| 5 | Ejercicio | mejorar los cuadrados con lo visto hoy |
Guías: Semana 13 en el sitio del curso
¿Qué nos llevamos hoy?¶
Ya calibraron $r$ y $l$, pero después de cuatro cuadrados el robot sigue terminando a unos 10 cm del inicio. Un compañero propone repetir la calibración con más cuidado. ¿Resolverá el problema? ¿Qué le falta al robot?
Imprimieron los marcadores con la opción "ajustar a la página" y quedaron de 2.3 cm de lado, pero el programa sigue usando
0.0254. ¿Qué les pasa a las distancias que mide la cámara, y a qué error de la semana 12 se parece?Con $K_p = 0.05$ el robot se queda quieto con la línea a 15 px del centro; con $K_p = 0.5$ se mueve de lado a lado sin parar. ¿Qué explica cada comportamiento y qué cambiarían en el programa?