Saltar al contenido principal

Guía completa de entrenamiento para SO-ARM con AmazingHand

Este documento explica cómo combinar el brazo seguidor SO-ARM101 con la mano hábil AmazingHand y realizar teleoperación usando LeRobot.

1. Conexión de hardware

  1. El archivo STL para el adaptador SOARM-a-AmazingHand está disponible aquí:

lerobot/soarm_amazinghand_link_step_stl/step at soarm_amazinghand · xiehuangbao888/lerobot

  1. Retira la garra original del SOARM.
  1. Monta el adaptador SOARM-a-AmazingHand en el brazo.
  1. Instala la mano hábil AmazingHand.
  1. Cablea los dispositivos de la siguiente manera:
DispositivoPuerto serieDescripción
Brazo seguidor SO-101 (servo de garra n.º 6 retirado)/dev/ttyACM0Solo se conservan los servos de las articulaciones 1~5
Brazo líder SO-101 (servo de garra n.º 6 conservado)/dev/ttyACM1La apertura/cierre de la garra se usa como señal de entrada
Mano hábil AmazingHand/dev/ttyACM28 servos con ID 1~8

Si tus puertos serie son diferentes, sustitúyelos por los nombres de puerto reales en los siguientes comandos.


El robot:

  • Controlará las 5 articulaciones del brazo seguidor (servos 1~5) a través de /dev/ttyACM0.
  • Controlará la mano hábil AmazingHand a través de /dev/ttyACM2.
  • Mapeará el gripper.pos del brazo líder de forma proporcional al ángulo de apertura de la mano hábil (0 = completamente abierta, 100 = completamente cerrada).

Los archivos de calibración se guardan automáticamente en:

~/.cache/huggingface/lerobot/calibration/robots/so101_amazing_hand/<robot.id>.json
~/.cache/huggingface/lerobot/calibration/teleoperators/so101_leader/<teleop.id>.json

2. Entorno y conexión

git clone https://github.com/xiehuangbao888/lerobot.git

Cambia al entorno virtual lerobot existente.

Primero, concede permisos al dispositivo:

sudo chmod 666 /dev/ttyACM*

Paso 1: Calibrar el brazo líder

cd ~/lerobot
conda activate lerobot
python -m lerobot.scripts.lerobot_calibrate \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.id=amazing_hand_leader

Sigue las indicaciones:

  1. Coloca todas las articulaciones del brazo líder en sus posiciones medias y pulsa Enter.
  2. Mueve cada articulación a sus rangos máximo y mínimo por turno, luego pulsa Enter para finalizar.

Paso 2: Calibrar el brazo seguidor

python -m lerobot.scripts.lerobot_calibrate \
--robot.type=so101_amazing_hand \
--robot.port=/dev/ttyACM0 \
--robot.id=amazing_hand_follower \
--robot.hand_port=/dev/ttyACM2

Sigue las indicaciones:

  1. Coloca las 5 articulaciones del brazo seguidor en sus posiciones medias y pulsa Enter.
  2. Mueve las 5 articulaciones a sus rangos máximo y mínimo por turno, luego pulsa Enter para finalizar.

Nota: El brazo seguidor solo tiene 5 articulaciones; el servo de la garra n.º 6 ha sido retirado.

Paso 3: Ejecutar la teleoperación

python -m lerobot.scripts.lerobot_teleoperate \
--robot.type=so101_amazing_hand \
--robot.port=/dev/ttyACM0 \
--robot.id=amazing_hand_follower \
--robot.hand_port=/dev/ttyACM2 \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.id=amazing_hand_leader \
--display_data=true

Puedes personalizar el movimiento de agarre. El archivo correspondiente se encuentra en:

src/lerobot/robots/so_amazing_hand/config_so_amazing_hand.py

3. Recopilar conjunto de datos con la mano hábil

python -m lerobot.scripts.lerobot_record \
--robot.type=so101_amazing_hand \
--robot.port=/dev/ttyACM0 \
--robot.id=amazing_hand_follower \
--robot.hand_port=/dev/ttyACM2 \
--robot.cameras='{
wrist: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30},
top: {type: opencv, index_or_path: 4, width: 640, height: 480, fps: 30}
}' \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.id=amazing_hand_leader \
--display_data=true \
--dataset.repo_id=seeed/amazing_soarm \
--dataset.num_episodes=20 \
--dataset.single_task="Pick up the cube with the dexterous hand"

Descripciones de parámetros:

ParámetroDescripción
--robot.camerasConfiguración de cámara; admite opencv, realsense, etc. index_or_path es el índice de la cámara o la ruta del flujo de vídeo.
--dataset.repo_idID del conjunto de datos en Hugging Face, con el formato {username}/{dataset_name}.
--dataset.num_episodesNúmero de episodios a grabar.
--dataset.single_taskDescripción de la tarea escrita en los metadatos del conjunto de datos.
--robot.hand_use_proportional_controlPor defecto es true; no es necesario configurarlo explícitamente. Establécelo en false para un comportamiento binario de abrir/cerrar.

4. Entrenamiento de la política

lerobot-train \
--dataset.repo_id=seeed/amazing_soarm \
--policy.type=act \
--output_dir=outputs/train/amazing_soarm \
--job_name=amazing_soarm \
--policy.device=cuda \
--wandb.enable=false \
--policy.push_to_hub=false \
--steps=60000 \

5. Evaluación y despliegue

Evaluar la política entrenada en el robot real

python -m lerobot.scripts.lerobot_record \
--robot.type=so101_amazing_hand \
--robot.port=/dev/ttyACM0 \
--robot.id=amazing_hand_follower \
--robot.hand_port=/dev/ttyACM2 \
--robot.cameras='{
wrist: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30},
top: {type: opencv, index_or_path: 4, width: 640, height: 480, fps: 30}
}' \
--policy.path=outputs/train/amazing_soarm/checkpoints/last/pretrained_model \
--dataset.repo_id=seeed_val/amazinghand_pick_cube_eval \
--dataset.num_episodes=10 \
--dataset.single_task="Pick up the cube with the dexterous hand" \
--display_data=true
Loading Comments...