10. Calibración y teleoperación de líder y seguidor
Capítulo 10 del curso para principiantes de SO-ARM Physical AI — calibra los brazos líder y seguidor con lerobot-calibrate, entiende el mapeo de articulaciones y los archivos de calibración, y ejecuta tu primera teleoperación maestro-esclavo.
Retira objetos de valor y personas ajenas a menos de 1 metro del espacio de trabajo. Antes de ejecutar este capítulo, asegúrate de que el brazo esté bien fijado y que la alimentación y los cables estén conectados correctamente.
10.1 Por qué importa la calibración del brazo completo
10.1 Por qué importa la calibración del brazo completo
El Capítulo 6 grabó IDs y baud rates; el Capítulo 7 verificó los neutros. La calibración del brazo completo es el último paso: aprende, para cada articulación, el mapeo entre la lectura cruda del servo y un ángulo físico, de modo que líder y seguidor reporten valores idénticos cuando coinciden físicamente.
Esta calibración es esencial por una razón más profunda: permite que una red entrenada en un SO-ARM funcione en otro. Como todo SO-ARM calibrado coincide en qué es "cero grados" y "el centro del rango", un dataset grabado en tu seguidor es válido en el mío.
Repaso de reglas de alimentación: en la edición Standard de SO101 toda la alimentación es de 5V. En la edición Pro de SO101, calibra y opera el líder con fuente de 5V y el seguidor con fuente de 12V en cada paso.
10.2 Calibrar el brazo seguidor
10.2 Calibrar el brazo seguidor
Conecta los 6 servos por sus cables de 3 hilos y la placa, concede permisos y ejecuta:
sudo chmod 666 /dev/ttyACM*
lerobot-calibrate \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_awesome_follower_arm # <- dale un nombre único al robot
El procedimiento (mostrado en el video):
- Posición media: mueve el brazo para que cada articulación quede en el centro de su rango (aproximadamente la postura "vertical"), y pulsa Enter;
- Rango completo: mueve cada articulación por su rango completo, una a una, mientras la herramienta muestrea el mínimo/máximo.
Por actualizaciones del repositorio de LeRobot, es normal que el terminal no reciba señal del servo 5 al calibrar el brazo líder. Puedes continuar la operación.
10.3 Calibrar el brazo líder
10.3 Calibrar el brazo líder
Los mismos dos pasos (posición media, luego rango completo por articulación), con las claves del teleoperator:
lerobot-calibrate \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.id=my_awesome_leader_arm # <- dale un nombre único al líder
Si ves Could not connect on port '/dev/ttyACM0'. Make sure you are using the correct port. Try running lerobot-find-port, vuelve a conceder permisos con sudo chmod 666 /dev/ttyACM*.
Dónde vive la calibración (y cómo rehacerla)
Los archivos de calibración se guardan como JSON en ~/.cache/huggingface/lerobot/calibration/robots/ y ~/.cache/huggingface/lerobot/calibration/teleoperators/. Para recalibrar:
- Opción 1 — borra los archivos para empezar de cero:
rm -rf ~/.cache/huggingface/lerobot/calibration/robots
rm -rf ~/.cache/huggingface/lerobot/calibration/teleoperators
- Opción 2 — responde al prompt. Al reejecutar el comando sobre un brazo calibrado aparece:
Press ENTER to use provided calibration file associated with the id my_awesome_leader_arm, or type 'c' and press ENTER to run calibration:
Escribe c + Enter para recalibrar; pulsa Enter para conservar los datos existentes.
Si la calibración falla: Magnitude ... exceeds 2047
Si la calibración o la teleoperación lanza Magnitude 30841 exceeds 2047 (max for sign_bit_index=11), el offset cero de un servo es anómalo. Apaga y reinicia el brazo y reintenta; si persiste, haz primero una calibración de posición media — con la herramienta del Capítulo 7, o con los scripts de Seeed_RoboController:
git clone https://github.com/Seeed-Projects/Seeed_RoboController.git
cd Seeed_RoboController
pip install -r requirements.txt
python -m src.tools.servo_disable # (opcional) desactiva el par para mover a mano
python -m src.tools.servo_middle_calibration # escribe la posición actual como 2048
python -m src.tools.servo_center_test # mueve a 2048 para verificar
Luego vuelve a lerobot-calibrate y repite la calibración completa.
10.4 Mapeo de articulaciones: dirección, rango y pinza
10.4 Mapeo de articulaciones: dirección, rango y pinza
Tras la calibración, verifica a mano:
- Dirección: girar la articulación 1 del líder en sentido horario debe girar la 1 del seguidor en sentido horario. Si alguna va al revés, la calibración se hizo con el brazo en postura espejo — repite esa articulación.
- Rango: lleva cada articulación del líder a ambos topes; el seguidor debe alcanzar los topes correspondientes sin forzar contra las piezas impresas.
- Pinza: cierra por completo el mango del líder — la pinza del seguidor debe cerrar por completo; la apertura total mapea a la apertura total.
Recuerda del Capítulo 9: el --robot.id / --teleop.id elegido aquí queda ligado al archivo de calibración. Usa exactamente los mismos ids al teleoperar, grabar y evaluar más adelante.
10.5 Iniciar la teleoperación maestro-esclavo
10.5 Iniciar la teleoperación maestro-esclavo
Ahora llega el momento en que los dos brazos se vuelven un solo sistema. Concede permisos y arranca:
sudo chmod 666 /dev/ttyACM*
lerobot-teleoperate \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_awesome_follower_arm \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.id=my_awesome_leader_arm
El comando teleoperate automáticamente:
- Detecta calibraciones faltantes e inicia el procedimiento;
- Conecta el robot y el teleoperator y comienza la teleoperación.
Directrices de seguridad en teleoperación
- Sujeta el seguidor la primera vez que se activa el par — saltará a su postura calibrada.
- Mueve el líder despacio; el seguidor sigue con par completo.
- Mantén los dedos fuera de la pinza y de los puntos de pellizco.
- Si el seguidor se retrasa, vibra o una articulación deja de responder: detente, apaga, y revisa el cable de bus de ese servo (un LED apagado indica el cable flojo previo).
10.6 Frecuencia de control y latencia
10.6 Frecuencia de control y latencia
¿De dónde viene la latencia? ¿Por qué es inevitable?
Cada ciclo lee el líder, envía objetivos al seguidor y (luego) lee cámaras. Las cámaras USB entregan fotogramas a su propio ritmo. El bucle es rápido — decenas de milisegundos — pero no cero, así que los movimientos rápidos del líder siempre se ven algo suavizados en el seguidor. Es normal.
¿Qué es la frecuencia de control? ¿Se puede configurar?
LeRobot ejecuta el bucle a un fps configurado (30 por defecto en los flujos de SO-ARM; el --dataset.fps posterior debe coincidir). Si la teleoperación se traba:
- Evita concentradores USB — conecta brazos y cámaras directo al ordenador;
- Comprueba que ningún otro proceso retenga los puertos serie;
- Verifica con
lerobot-find-portque ningún otro dispositivo comparta el bus.
10.7 Práctica
10.7 Práctica
- Calibra líder y seguidor; encuentra ambos JSON bajo
~/.cache/huggingface/lerobot/calibration/. - Teleopera 5 minutos: toca con la pinza las cuatro esquinas de la alfombrilla y recoge un objeto pequeño.
- Prueba deliberadamente la vía del fallo: ejecuta teleoperate con un
--robot.idequivocado y lee el error — así no lo olvidarás. - Practica la recalibración vía el prompt
c.
Con la cadena de control verificada, el próximo capítulo diseña los datos de tu primera política.