Plan de hoy: tres bloques¶
| # | Bloque | Pregunta que responde |
|---|---|---|
| 1 | Modelo cinemático | ¿Qué hace el robot si muevo cada rueda a cierta velocidad? |
| 2 | Odometría | ¿Dónde está el robot si solo sé cuánto giraron sus ruedas? |
| 3 | Errores y calibración | ¿Por qué el robot no vuelve al punto de partida, y qué hacemos al respecto? |
Al final: las prácticas con el EV3 real y en el simulador Webots.
El robot del curso¶
| Diseño en BrickLink Studio | Gemelo en Webots |
|---|---|
![]() |
![]() |
- Ladrillo EV3 + 2 motores grandes (puertos A y D) con encoder de 1°
- Llanta de 30.4 mm → $r = 0.0152\,m$ · trocha 14 cm → $l = 0.07\,m$
- Rueda loca de bola al frente · giroscopio en el puerto 1
Configuración del Robot Diferencial¶
| Símbolo | Descripción | EV3 del curso |
|---|---|---|
| $r$ | Radio de la rueda | $0.0152\,m$ |
| $l$ | Distancia de cada rueda al centro del eje | $0.07\,m$ |
| $\dot\phi_R, \dot\phi_L$ | Velocidad angular de las ruedas derecha e izquierda | hasta $17.5\,rad/s$ |
| $v, \omega$ | Velocidad lineal y angular del robot | — |
Modelo Cinemático Directo¶
De las velocidades de las ruedas a la velocidad del robot:
$$v = \frac{r}{2}(\dot\phi_R + \dot\phi_L)$$
$$\omega = \frac{r}{2l}(\dot\phi_R - \dot\phi_L)$$
- $v$ es el promedio de las velocidades de las ruedas
- $\omega$ es su diferencia, dividida por la distancia entre ellas
Casos especiales¶
- Ruedas iguales → recto ($\omega = 0$) · ruedas opuestas → gira en el sitio ($v = 0$) · una rueda quieta → pivota sobre ella
Modelo Cinemático Inverso¶
De la velocidad deseada del robot a las velocidades de las ruedas:
$$\dot\phi_R = \frac{v + \omega l}{r} \qquad \dot\phi_L = \frac{v - \omega l}{r}$$
Ejemplo con el EV3¶
| Se pide | Rueda derecha | Rueda izquierda |
|---|---|---|
| avanzar a 0.2 m/s | 13.2 rad/s | 13.2 rad/s |
| girar en el sitio a 1 rad/s | 4.6 rad/s | −4.6 rad/s |
| avanzar a 0.2 m/s y girar a 1 rad/s | 17.8 rad/s ⚠️ (máx. 17.5) | 8.6 rad/s |
Radio Instantáneo de Curvatura¶
$$R = \frac{v}{\omega} = l \cdot \frac{\dot\phi_R + \dot\phi_L}{\dot\phi_R - \dot\phi_L}$$
- $R \to \infty$: movimiento recto · $R = 0$: giro sobre el centro del eje · $R = l$: giro sobre la rueda izquierda
La cadena completa¶
- La cinemática da velocidades; la posición exige integrar
- Los encoders miden $\phi_R$ y $\phi_L$: la pose se estima, no se mide
Odometría¶
![]()
Odometría¶
La odometría estima la pose $(x, y, \theta)$ sumando pequeños desplazamientos.
Incrementos en cada paso (medidos por los encoders)¶
$$\Delta s_R = r \cdot \Delta\phi_R, \quad \Delta s_L = r \cdot \Delta\phi_L$$
$$\Delta s = \frac{\Delta s_R + \Delta s_L}{2}, \quad \Delta\theta = \frac{\Delta s_R - \Delta s_L}{2l}$$
Actualización de la pose¶
$$x_{k+1} = x_k + \Delta s \cos\left(\theta_k + \frac{\Delta\theta}{2}\right), \quad y_{k+1} = y_k + \Delta s \sin\left(\theta_k + \frac{\Delta\theta}{2}\right)$$
$$\theta_{k+1} = \theta_k + \Delta\theta$$
Odometría en código¶
def odometria(phi_R, phi_L, r, l, x0=0, y0=0, theta0=0):
"""Trayectoria estimada a partir de los ángulos de las ruedas [rad]."""
x, y, theta = x0, y0, theta0
trayectoria = [(x, y, theta)]
for dphiR, dphiL in zip(np.diff(phi_R), np.diff(phi_L)):
ds_R, ds_L = r * dphiR, r * dphiL
ds = (ds_R + ds_L) / 2
dtheta = (ds_R - ds_L) / (2 * l)
x += ds * np.cos(theta + dtheta / 2)
y += ds * np.sin(theta + dtheta / 2)
theta += dtheta
trayectoria.append((x, y, theta))
return np.array(trayectoria)
Cuadrado ideal¶
- Lados de 50 cm: $\Delta\phi = 0.5 / r = 32.9\,rad$ ≈ 1885° por rueda
- Giros de 90° en el sitio: $\Delta\phi = \pm\frac{\pi}{2} \cdot \frac{l}{r} = \pm 7.2\,rad$ ≈ ±414°
Errores en la Odometría¶
![]()
Errores en la Odometría¶
La incertidumbre en la posición crece sin límite con la distancia recorrida.
Errores sistemáticos¶
- La odometría (roja) no ve el error: usa los mismos parámetros equivocados
- Cada cuadrado queda girado respecto al anterior: el error de orientación se acumula
Errores aleatorios¶
- 300 recorridos idénticos de 2 m con patinaje aleatorio del 3 %
- La nube se ensancha con la distancia: el error de orientación se convierte en error lateral
Calibración del Robot¶
![]()
Calibración del Robot¶
$$r_{efectivo} = r_{medido} \times \frac{d_{real}}{2\,m} \qquad t_{efectiva} = t_{medida} \times \frac{3600°}{\alpha_{real}}$$
Primero el radio, luego la trocha: el giro depende de los dos.
¿Basta con calibrar?¶
- Calibrar $r$ y $t$ reduce el error a la mitad
- Lo que queda: $r_R \neq r_L$. El modelo usa un solo radio para las dos ruedas
Giroscopio: medir el giro directamente¶
| Encoders (odometría) | Giroscopio EV3 | |
|---|---|---|
| Qué mide | giro de cada rueda | giro del robot |
| Orientación | se calcula con el radio y la trocha | se integra del sensor |
| Le afecta el patinaje | sí | no |
| Le afectan ruedas distintas o una trocha errada | sí | no |
| Su propio error | — | deriva lenta (grados por minuto) |
| Convención | antihorario positivo | horario positivo ⚠️ |
La combinación de los dos (fusión de sensores) es mejor que cada uno por separado.
Del robot real al simulador¶
| En el laboratorio | En Webots |
|---|---|
| Marcador en el centro del eje | El robot dibuja su trayectoria en el piso |
| Regla y transportador | ev3.medir_pose_real() |
time.sleep(t) |
ev3.sleep(t) |
El robot en Webots¶
Dos cuadrados con los parámetros medidos: el marcador muestra cómo el segundo queda girado respecto al primero.
Prácticas de la semana¶
| # | Práctica | Qué se aprende |
|---|---|---|
| 1 | Cuadrados por tiempo | los límites del lazo abierto |
| 2 | Cuadrados con encoder | la odometría y su error |
| 3 | Calibración del radio | $r_{efectivo}$ con 2 m en línea recta |
| 4 | Calibración de la trocha | $t_{efectiva}$ con 10 vueltas |
| 5 | Cuadrados con giroscopio | comparar y corregir la orientación |
| 6 | Cuadrados calibrados | el error que queda después de calibrar |
Guías: Semana 12 → EV3 Real y Semana 12 → EV3 en Webots
¿Qué nos llevamos hoy?¶
Su robot debe recorrer un arco de 50 cm de radio hacia la izquierda. ¿Qué rueda debe girar más rápido, en qué proporción, y qué pasa si el radio que le piden es menor que $l$?
Después de cuatro cuadrados, la gráfica de odometría cierra perfectamente, pero el marcador muestra cuadrados girados unos 8° entre sí. Un compañero dice que el programa de odometría tiene un error. ¿Tiene razón? ¿Qué experimento haría para saberlo?
Ya calibraron el radio y la trocha, pero en 2 m en línea recta el robot sigue terminando 7 cm a la izquierda. ¿Qué parámetro falta, y qué harían para corregirlo sin cambiar las llantas?

