Simulador de robot autoequilibrado: control PID
Equilibra un robot de dos ruedas en tu navegador. Inclínalo, dale un empujón y desajusta las ganancias PID en cascada para ver exactamente cómo cae el robot.
- Categoría
- Sistemas de control
- Tiempo
- 2–4 horas
- Plataforma
- Browser · Arduino
01 / Empieza aquí
Introducción
Un robot autoequilibrado es un péndulo invertido: su masa se ubica sobre el eje, por lo que estar de pie es un equilibrio inestable que solo un lazo activo puede sostener. Inclina el chasis y suéltalo, dale un empujón o reduce la ganancia derivativa a cero para observar cómo crece la oscilación hasta caer. La gráfica muestra la inclinación frente al ángulo límite a partir del cual ningún par motor puede salvarlo.
Live lab / Inverted pendulum & cascaded PID
Self-balancing robot simulator
A two-wheeled robot with its centre of mass above the axle — an inverted pendulum that falls the moment the loop stops. Drag the body over and let go, shove it, or detune the gains and watch exactly how it fails.
Drag the robot to lean it over and let go — the loop takes it from wherever you leave it. The dashed line is the tilt target the outer loop is asking for; the bar at the axle is the motor command. The trace above plots tilt against the ±35° fall threshold.
- Measured tilt
- Tilt target (outer loop)
- Motor command
- Fall threshold
- Tilt
- 0.0°
- Tilt target
- 0.0°
- Motor
- 0%
- Position
- 0 cm
- Upright for
- 0.0 s
- Worst tilt
- 0.0°
Keyboard: focus the robot, then use Space to run/pause, S to shove it, L to switch the loop on or off, R to reset, and F for full screen.
Controles
Iniciar, Pausar y Restablecer ejecutan el lazo. Empujar aplica un impulso momentáneo como lo haría un dedo, y Lazo activado/desactivado deshabilita ambos controladores para observar la caída libre de la planta sin control.
El control más directo es el propio robot: arrastra el cuerpo hasta cualquier ángulo y suéltalo. La postura en la que lo dejes será el punto exacto donde el controlador retomará el mando, sin etapas intermedias de rearme, y los deslizadores de ganancia se aplican a la simulación en tiempo real. Reduce la ganancia derivativa a cero mientras se equilibra y comenzará a tambalearse en ese mismo instante.
El menú Sintonización carga cuatro configuraciones predefinidas: una funcional y tres que fallan en las tres formas clásicas en que fallan los robots reales.
Haz clic en el lienzo y utiliza Espacio, S, L, R y F para accionar los mismos controles desde el teclado.
Teoría
Mantener un robot sobre dos ruedas implica estabilizar un péndulo invertido. El centro de masa se sitúa por encima del eje de tracción, de modo que la vertical es un equilibrio similar al de un lápiz apoyado sobre su punta: matemáticamente real, pero físicamente insostenible sin una corrección continua. Cualquier desviación angular provoca que la gravedad genere un par que acentúa la inclinación. Cuanto más se inclina, más rápido acelera hacia el suelo.
El robot dispone de un único mecanismo para contrarrestar dicho par: mover el eje de las ruedas. Al acelerar las ruedas hacia adelante, la base regresa bajo el centro de masa, rotando el cuerpo nuevamente hacia la vertical. Por esta razón la acción de control puede parecer contraintuitiva al principio: para evitar caer hacia adelante debes avanzar, del mismo modo que desplazas tu mano bajo una vara que intentas equilibrar.
Esto impone un límite estricto al robot. Más allá de aproximadamente 35°, la aceleración horizontal requerida supera la que las ruedas pueden transmitir antes de que el chasis golpee el suelo, y ninguna ganancia resulta suficiente. Las líneas discontinuas en la gráfica delimitan esa frontera física de recuperación.
Algoritmo
El controlador está configurado en cascada: dos lazos PID en los que la salida de uno alimenta la consigna del otro.
El lazo interno opera a alta frecuencia y estabiliza el ángulo de inclinación. Compara el ángulo medido contra la consigna y genera el comando de par para los motores:
error = angulo_medido − angulo_objetivo
motor = Kp·error + Ki·∫error + Kd·d(medido)/dt
Nota que el error se calcula como valor medido menos valor objetivo, a la inversa de la fórmula convencional de objetivo menos medido. Compensar una caída frontal exige mover las ruedas hacia adelante, de modo que una inclinación positiva debe generar un comando positivo en los motores. Este signo es la causa más frecuente por la cual un robot recién ensamblado se estrella contra el suelo al encenderse.
El lazo externo opera a menor frecuencia y controla la posición. No puede gobernar los motores de forma directa —ya que están asignados al lazo interno—, por lo que genera una consigna de inclinación para el lazo interno:
angulo_objetivo = Kp_pos·(posicion_deseada − posicion) − Kd_pos·velocidad
Si el robot se encuentra por detrás de su posición objetivo, solicita una ligera inclinación hacia adelante; el lazo interno impulsa las ruedas para sostener dicha inclinación, provocando el avance del vehículo. Esta inclinación se acota estrictamente a unos pocos grados. Si se permitiera al lazo externo exigir ángulos excesivos, impondría una consigna inalcanzable para el lazo interno y ambos perderían la estabilidad.
El término integral adquiere aquí una importancia crítica, pues compensa la discrepancia entre la vertical estimada por la IMU y la vertical gravitatoria real. Por este motivo, la integración debe detenerse cuando los actuadores saturan (anti-windup); de lo contrario, acumulará error durante una caída que no puede evitar y saboteará la posterior recuperación.
Código fuente
// Inner loop: tilt → motors. Runs every 5 ms off a timer, not in loop().
float angleError = angle - tiltTarget; // measured minus target
angleIntegral = constrain(angleIntegral + angleError * dt, -3, 3);
float command = Kp * angleError
+ Ki * angleIntegral
+ Kd * gyroRate; // rate straight from the gyro
command = constrain(command, -255, 255);
if (fabs(angle) > FALL_ANGLE) command = 0; // past saving; cut the motors
driveMotors(command, command);
// Outer loop: position → tilt target. Runs ten times slower, and may only
// ever ask for a small lean.
if (++slowTick >= 10) {
slowTick = 0;
float positionError = 0 - wheelPosition;
tiltTarget = constrain(KpPos * positionError - KdPos * wheelVelocity,
-0.12, 0.12); // radians, about ±7°
}
Dos aspectos clave se trasladan directamente desde este simulador al código real. Obtén el término derivativo a partir de la velocidad angular del giroscopio en lugar de derivar numéricamente el ángulo: el giroscopio mide esa velocidad de forma directa y sin amplificar el ruido inherente a la diferenciación. Asimismo, desconecta los motores cuando se supere el ángulo crítico de caída en lugar de forzar los actuadores; esto protege las reductoras mecánicas y hace que la falla sea evidente de inmediato.
Hardware
El sensor empleado es un MPU6050, que integra tanto acelerómetro como giroscopio, ya que ninguno de ellos resulta suficiente por separado. El acelerómetro detecta la gravedad pero es vulnerable a las aceleraciones del movimiento; el giroscopio registra giros rápidos de forma limpia pero sufre de deriva acumulativa. Un filtro complementario combina ambas señales para obtener una estimación angular estable y rápida.
Los motores deben contar con una relación de reducción que suministre el par adecuado manteniendo la agilidad necesaria para responder a tiempo: los micromotores N20 de unas 200 RPM representan una opción habitual, controlados mediante un driver TB6612FNG, cuya baja caída de tensión resulta fundamental cuando el lazo exige miles de microcorrecciones por segundo.
Puedes ensamblar el circuito físico siguiendo la guía del proyecto del robot autoequilibrado, o consultar el tutorial de medición de inclinación si es tu primer contacto con módulos IMU.
Suposiciones y diferencias con el hardware
El modelo matemático corresponde a un péndulo invertido en 2D con un único eje de giro, eslabones rígidos, rodadura perfecta sin deslizamiento y una IMU ideal con deriva y ruido configurables. Un robot físico experimenta variaciones de par por caída de tensión en la batería, cuantización en los encoders, desalineación física del sensor, variaciones térmicas y posibles caídas laterales (un grado de libertad excluido en este modelo bidimensional). La estructura PID en cascada y el uso del giroscopio para la derivada se aplican de forma idéntica, pero el trim mecánico, la sintonización del filtro y el umbral de corte por caída deben ajustarse sobre el chasis real.
Diagrama de circuito
Dos pautas de conexión determinan el funcionamiento correcto de este montaje:
La batería de tracción debe conectarse exclusivamente al pin VM del driver. La corriente de los motores jamás debe circular a través de las pistas del Arduino. Asimismo, todas las masas (GND de placa, driver, IMU y polo negativo de la batería) deben unirse en un punto común para establecer una referencia de tensión compartida.
Los encoders deben alimentarse desde la línea lógica, nunca desde la alimentación de los motores. Conectar un encoder a la línea de potencia de los motores puede dañarlo o saturar la lectura con ruido de conmutación. Conecta el canal A del encoder a un pin con soporte de interrupciones de hardware; leerlo por sondeo periódico en loop() provoca pérdidas de pulsos que descalibran progresivamente el lazo externo de posición.
Instala la IMU lo más cerca posible del eje de las ruedas. Colocarla a gran altura amplifica las aceleraciones lineales durante cada maniobra de corrección, distorsionando la estimación sin aportar beneficio alguno.
Lista de hardware
Componentes
- Arduino Nano o Uno
- Acelerómetro y giroscopio MPU6050
- Driver dual de motores TB6612FNG
- Dos motorreductores N20 con encoder
- Batería de litio 2S
Explora el grafo
Dónde se usa este simulador
Los proyectos, rutas de aprendizaje y tutoriales que se basan en este laboratorio.
Sigue construyendo
Descargar recursos
Usa estas referencias de la página mientras trabajas en el proyecto. Los paquetes descargables del proyecto se añadirán solo cuando se publiquen su código fuente y su versión.
Preguntas comunes
Preguntas frecuentes
¿Por qué un robot autoequilibrado necesita dos lazos PID en vez de uno?
Porque lo que deseas controlar y lo que realmente puedes accionar son cosas distintas. Los motores varían la velocidad de las ruedas, pero lo que mantiene en pie al robot es el ángulo de inclinación, y la única forma de modificar dicha inclinación es desplazar las ruedas bajo el cuerpo. Por ello, el lazo interno mantiene el ángulo de inclinación gobernando los motores, mientras que el lazo externo solicita un leve ángulo de inclinación para llevar el robot a la posición deseada. Un solo lazo no puede cumplir ambas metas: si accionas los motores directamente a partir del error de posición, el robot acelerará escapando de su propio centro de masa y caerá de inmediato.
¿Por qué mi robot avanza lentamente aunque parece estar nivelado?
Casi siempre se debe al desfase de montaje (trim). Si la IMU queda desalineada uno o dos grados respecto a la vertical verdadera, el lazo mantendrá con fidelidad ese ángulo incorrecto; mantener una inclinación constante implica una aceleración constante en esa dirección. Ajusta el deslizador de trim en este simulador y podrás comprobarlo. La solución en hardware real consiste en medir el desfase manteniendo el robot perfectamente vertical, restarlo de las lecturas y permitir que el término integral compense cualquier deriva residual.
¿Es posible lograr el equilibrio sin el término integral?
Sí, y el simulador demostrará que funciona, hasta que aparezca algún sesgo en la medición. Los términos P y D por sí solos pueden sostener el robot erguido, ya que D aporta la amortiguación necesaria para evitar que la oscilación crezca. Lo que no pueden hacer es eliminar un error constante: ante cualquier desalineación de montaje, el robot se estabilizará con una pequeña inclinación permanente y se desplazará de continuo. La acción integral es precisamente la que lleva ese residuo de error a cero.
¿Por qué cae el robot al fijar la ganancia derivativa en cero?
Porque desaparece la amortiguación del sistema. La ganancia proporcional responde a cuánto se ha inclinado el robot, pero para cuando aplica la corrección, el cuerpo ya cruza la vertical con inercia y velocidad. Sin un término que responda a la rapidez con la que cambia el ángulo, cada oscilación sobrepasa a la anterior hasta superar el ángulo de recuperación admisible. Fija D en cero en este laboratorio y podrás contar las oscilaciones antes del impacto.
¿Por qué las ruedas avanzan cuando el robot se inclina hacia adelante?
Ese es el principio fundamental, y es el signo que la mayoría invierte en su primer intento. Para equilibrar una escoba sobre la palma de la mano, debes mover la mano hacia la dirección en la que cae, no alejarla. El robot actúa igual: inclinarse hacia adelante exige avanzar para situar las ruedas nuevamente debajo del centro de masa. Si inviertes ese signo, el controlador empujará activamente el robot hacia el suelo, provocando una caída instantánea y violenta.
¿En qué se diferencia este simulador del simulador de controlador PID?
El laboratorio PID general controla una planta estable: si la dejas desatendida, permanece en reposo, por lo que el lazo solo optimiza la velocidad y suavidad para alcanzar un objetivo. Esta planta es inestable: si la desatiendes, cae siempre. Esto convierte la sintonización en un requisito crítico de estabilidad, y explica por qué el equilibrio exige una arquitectura en cascada con un lazo externo que el simulador de un solo lazo no necesita.
Lecturas adicionales
Referencias
Fuentes autorizadas para profundizar más allá del modelo educativo acotado de este simulador.