Seguidor de línea 라인 추적
e = (sL − sR) / max(sL + sR, 1) ω* = 0.55·e + Kd·ė − 0.18·ω_giro v* = 6.0 − 2.5·|e| cm/s vL,R = v* ∓ ω*·L/2
Si pierde la línea, frena una rueda y avanza la otra hacia el último lado donde la vio.
액추에이터와 센서 // Actuadores y Sensores · Universidad EAFIT · 2026-2
Un seguidor de línea que estima su posición fusionando encoders, giroscopio y un LiDAR 360° con un filtro de Kalman extendido. Esta página corre el mismo algoritmo del robot sobre la pista real, con física, ruido de sensores y animación procedural.
El código de reto1_xrp.py portado línea a línea: seguidor de línea + PI por rueda a 100 Hz, odometría y EKF a 10 Hz, y PL-ICP con barridos del LiDAR. El robot solo “ve” lo que leerían sus sensores; el mundo agrega ruido, deslizamiento y errores de calibración.
En el robot real el LiDAR trabaja en modo diferido: durante el recorrido solo guarda barridos y al llegar a la meta repite el EKF con el ICP. Aquí el cálculo es en vivo; el resultado del filtro es el mismo.
Tres relojes separados para que los cálculos nunca frenen las ruedas.
Reflectancia ×2 · Encoders 585 cuentas/vuelta · Giroscopio z · LiDAR LD06 230 400 bd
Seguidor de línea PD + amortiguamiento con el giroscopio. PI de velocidad por rueda con prealimentación.
Δs de los encoders, Δθ del giroscopio. Modelo diferencial con θ en el punto medio.
PL-ICP entre barridos (keyframes cada 12 cm / 12°). EKF con H = I y validación χ².
x, y en cm desde la línea transversal.
e = (sL − sR) / max(sL + sR, 1) ω* = 0.55·e + Kd·ė − 0.18·ω_giro v* = 6.0 − 2.5·|e| cm/s vL,R = v* ∓ ω*·L/2
Si pierde la línea, frena una rueda y avanza la otra hacia el último lado donde la vio.
d = Δticks · 2πr / N (r = 3.0, N = 585) Δs = (dR + dL)/2 ; Δθ = Δyaw_IMU x += Δs·cos(θ + Δθ/2) y += Δs·sin(θ + Δθ/2)
El giro sale del giroscopio (XRPLib lo integra a ~200 Hz): las ruedas patinan en las curvas.
min Σ [ nⱼᵀ (R(φ)·pᵢ + t − qⱼ) ]² Gauss-Newton, 5 iteraciones umbral 25 → 5 cm, ≥ 30 pares Σ_ICP ≈ σ²(JᵀJ)⁻¹ · 4
Error punto-a-línea (Censi, 2008): no penaliza deslizar a lo largo de una pared.
P⁻ = F P Fᵀ + Q(Δs, Δθ) z = x_ref ⊕ Δx_LiDAR , H = I K = P⁻ (P⁻ + R)⁻¹ P = (I−K)P⁻(I−K)ᵀ + K R Kᵀ
Q crece con lo recorrido; R la entrega el ICP en cada barrido. d² > 11,34 atenúa la medición.
Los 1090 puntos que guardó el robot, en la escala real de la pista. A la derecha, los mismos puntos reubicados sobre la línea con emparejamiento con el mapa (post-procesamiento).
¿Por qué los puntos no coincidían con el dibujo de la pista? El plano en imagen no está a escala (relación 1,58) y la pista real mide 99,4 × 198,5 cm (relación 2,0). Con la escala correcta en cada eje, la salida ubicada a 54 cm de la esquina inferior izquierda y el giro de 90° del marco del robot, el recorrido coincide los primeros 170 cm; después se abre por errores de rumbo en las curvas.
Video del recorrido real del XRP.
datos.txt.Todo el material del reto.