🍎 Clasificación de frutas con J501 Mini y brazo StarAI Viola
🚀 Introducción
Este wiki muestra cómo usar la J501 Mini (Jetson AGX Orin) con el brazo robótico StarAI Viola para realizar tareas de clasificación de frutas utilizando el framework LeRobot. El proyecto muestra un flujo de trabajo de extremo a extremo desde la recopilación de datos hasta el despliegue, lo que permite que el robot agarre y organice frutas de forma inteligente.

| J501 Mini | StarAI Viola |
|---|---|
![]() | ![]() |
Lo que aprenderás:
- 🔧 Configuración de hardware para J501 Mini y brazo StarAI Viola
- 💻 Configuración del entorno de software para LeRobot en Jetson AGX Orin
- 🎯 Recopilación de datos y teleoperación para tareas de clasificación de frutas
- 🤖 Entrenamiento del modelo de política ACT
- 🚀 Despliegue del modelo entrenado para clasificación autónoma de frutas

📚 Este tutorial proporciona instrucciones paso a paso para ayudarte a construir desde cero un sistema inteligente de clasificación de frutas.
Este wiki se basa en JetPack 6.2.1 y utiliza el módulo Jetson AGX Orin.
🛠️ Requisitos de hardware
Componentes necesarios
- J501 Mini con módulo Jetson AGX Orin
- StarAI Viola brazo seguidor (6+1 DoF)
- StarAI Violin brazo líder (6+1 DoF) para teleoperación
- 2x cámaras USB (se recomienda 640x480 @ 30fps)
- Una cámara montada en la muñeca
- Una cámara de vista en tercera persona
- Placas de depuración UC-01 (x2, incluidas con los brazos)
- Fuente de alimentación de 12V para los brazos robóticos
- Cables USB para la comunicación con los brazos
- Frutas para la demostración de clasificación
Especificaciones de hardware
| Componente | Especificación |
|---|---|
| J501 Mini | Jetson AGX Orin, JetPack 6.2.1 |
| Viola Follower | 6+1 DoF, alcance de 470mm, carga útil de 300g |
| Violin Leader | 6+1 DoF, alcance de 470mm, teleoperación |
| Cámaras | USB, 640x480 @ 30fps, formato MJPG |
| Alimentación | 12V 10A para cada brazo |
💻 Configuración del entorno de software
Prerrequisitos
- Ubuntu 22.04 (en J501 Mini con JetPack 6.2.1)
- Python 3.12
- CUDA 12+
- PyTorch 2.6+ (versión GPU)
Instalar Miniconda
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-aarch64.sh
chmod +x Miniconda3-latest-Linux-aarch64.sh
./Miniconda3-latest-Linux-aarch64.sh
source ~/.bashrc
Crear entorno LeRobot
# Create conda environment
conda create -y -n lerobot python=3.12 && conda activate lerobot
# Clone LeRobot repository
git clone https://github.com/Seeed-Projects/lerobot.git ~/lerobot
cd ~/lerobot
# Install ffmpeg
conda install ffmpeg -c conda-forge
Instalar PyTorch y Torchvision para Jetson
Para dispositivos Jetson, necesitas instalar la versión GPU de PyTorch y Torchvision antes de instalar LeRobot. Sigue este tutorial de instalación de PyTorch para Jetson para instalar PyTorch-gpu y Torchvision.
Instalar LeRobot y dependencias
Después de instalar PyTorch-gpu y Torchvision, instala LeRobot:
cd ~/lerobot && pip install -e .
Para dispositivos Jetson JetPack 6.0+, instala dependencias adicionales:
conda install -y -c conda-forge "opencv>=4.10.0.84" # Install OpenCV and other dependencies through conda, this step is only for Jetson Jetpack 6.0+
conda remove opencv # Uninstall OpenCV
pip3 install opencv-python==4.10.0.84 # Then install opencv-python via pip3
conda install -y -c conda-forge ffmpeg
conda uninstall numpy
pip3 install numpy==1.26.0 # This should match torchvision
Instalar dependencias de los motores StarAI
pip install lerobot_teleoperator_bimanual_leader
pip install lerobot_robot_bimanual_follower
Comprobar PyTorch y Torchvision
Dado que instalar el entorno LeRobot mediante pip desinstalará el PyTorch y Torchvision originales e instalará las versiones para CPU, necesitas realizar una comprobación en Python:
import torch
print(torch.cuda.is_available()) # Should print True
Si el resultado impreso es False, necesitas reinstalar PyTorch y Torchvision de acuerdo con este tutorial para Jetson.
# Remove brltty if it causes USB port conflicts
sudo apt remove brltty
🔧 Configuración y calibración de hardware
Configurar puertos USB
Conecta los brazos robóticos e identifica sus puertos USB:
cd ~/lerobot
lerobot-find-port
Deberías ver una salida como:
- Brazo líder:
/dev/ttyUSB0 - Brazo seguidor:
/dev/ttyUSB1
Concede acceso a los puertos USB:
sudo chmod 666 /dev/ttyUSB*
Posición inicial de los brazos
Antes de la calibración, mueve ambos brazos a sus posiciones iniciales:
| Brazo líder Violin | Brazo seguidor Viola |
|---|---|
![]() | ![]() |
Calibrar brazo líder
lerobot-calibrate \
--teleop.type=lerobot_teleoperator_violin \
--teleop.port=/dev/ttyUSB0 \
--teleop.id=my_violin_leader
Mueve manualmente cada articulación a sus posiciones máximas y mínimas. Pulsa Enter para guardar después de calibrar todas las articulaciones.
Calibrar brazo seguidor
lerobot-calibrate \
--robot.type=lerobot_robot_viola \
--robot.port=/dev/ttyUSB1 \
--robot.id=my_viola_follower
Los archivos de calibración se guardan en ~/.cache/huggingface/lerobot/calibration/
Configurar cámaras
Encuentra los puertos de tus cámaras:
lerobot-find-cameras opencv
Salida de ejemplo:
Camera #0: /dev/video2 (wrist camera)
Camera #1: /dev/video4 (front camera)
Monta las cámaras:
- Cámara de muñeca: Fijar al efector final para una vista de cerca
- Cámara frontal: Colocar sobre el escritorio para una vista en tercera persona
🎮 Prueba de teleoperación
Prueba la configuración con teleoperación antes de la recopilación de datos:
lerobot-teleoperate \
--robot.type=lerobot_robot_viola \
--robot.port=/dev/ttyUSB1 \
--robot.id=my_viola_follower \
--robot.cameras="{ wrist: {type: opencv, index_or_path: /dev/video2, width: 640, height: 480, fps: 30, fourcc: 'MJPG'}, front: {type: opencv, index_or_path: /dev/video4, width: 640, height: 480, fps: 30, fourcc: 'MJPG'}}" \
--teleop.type=lerobot_teleoperator_violin \
--teleop.port=/dev/ttyUSB0 \
--teleop.id=my_violin_leader \
--display_data=true
Para el entrenamiento del modelo ACT, los nombres de las cámaras deben ser wrist y front. Usar nombres diferentes requerirá modificar el código fuente.
📊 Recopilación de datos para clasificación de frutas
Iniciar sesión en Hugging Face (opcional)
Si quieres subir conjuntos de datos a Hugging Face Hub:
huggingface-cli login --token ${HUGGINGFACE_TOKEN} --add-to-git-credential
HF_USER=$(huggingface-cli whoami | head -n 1)
echo $HF_USER
Registrar conjunto de datos de entrenamiento
Recopila 50 episodios de demostraciones de clasificación de frutas:
lerobot-record \
--robot.type=lerobot_robot_viola \
--robot.port=/dev/ttyUSB1 \
--robot.id=my_viola_follower \
--robot.cameras="{ wrist: {type: opencv, index_or_path: /dev/video2, width: 640, height: 480, fps: 30, fourcc: 'MJPG'}, front: {type: opencv, index_or_path: /dev/video4, width: 640, height: 480, fps: 30, fourcc: 'MJPG'}}" \
--teleop.type=lerobot_teleoperator_violin \
--teleop.port=/dev/ttyUSB0 \
--teleop.id=my_violin_leader \
--display_data=true \
--dataset.repo_id=${HF_USER}/fruit_sorting \
--dataset.episode_time_s=30 \
--dataset.reset_time_s=30 \
--dataset.num_episodes=50 \
--dataset.push_to_hub=true \
--dataset.single_task="Sort fruits into containers"
Parámetros de grabación
| Parámetro | Descripción |
|---|---|
--dataset.episode_time_s | Duración de cada episodio (30 segundos) |
--dataset.reset_time_s | Tiempo para reiniciar entre episodios (30 segundos) |
--dataset.num_episodes | Número de episodios a grabar (50) |
--dataset.push_to_hub | Subir a Hugging Face Hub (true/false) |
--dataset.single_task | Descripción de la tarea |
Controles de teclado durante la grabación
- Flecha derecha (→): Saltar al siguiente episodio
- Flecha izquierda (←): Volver a grabar el episodio actual
- ESC: Detener la grabación y guardar el conjunto de datos
Si los controles del teclado no funcionan, prueba: pip install pynput==1.6.8
Reproducir un episodio
Prueba los datos grabados reproduciendo un episodio:
lerobot-replay \
--robot.type=lerobot_robot_viola \
--robot.port=/dev/ttyUSB1 \
--robot.id=my_viola_follower \
--dataset.repo_id=${HF_USER}/fruit_sorting \
--dataset.episode=0
🎓 Entrenamiento de la política ACT
Configuración de entrenamiento
Entrena el modelo ACT con el conjunto de datos que has recopilado:
lerobot-train \
--dataset.repo_id=${HF_USER}/fruit_sorting \
--policy.type=act \
--output_dir=outputs/train/fruit_sorting_act \
--job_name=fruit_sorting_act \
--policy.device=cuda \
--wandb.enable=false \
--policy.repo_id=${HF_USER}/fruit_sorting_policy \
--steps=100000 \
--batch_size=8 \
--eval.batch_size=8 \
--eval.n_episodes=10 \
--eval_freq=5000
Parámetros de entrenamiento
| Parameter | Description |
|---|---|
--policy.type | Tipo de modelo (act) |
--steps | Número total de pasos de entrenamiento (100,000) |
--batch_size | Tamaño del lote de entrenamiento (8) |
--eval_freq | Frecuencia de evaluación (cada 5000 pasos) |
--wandb.enable | Habilitar el registro de Weights & Biases |
Tiempo de entrenamiento
En J501 Mini (AGX Orin):
- 50 episodios: ~8-10 horas
- 100 episodios: ~16-20 horas
Puedes habilitar --wandb.enable=true para monitorizar el progreso del entrenamiento con Weights & Biases. Asegúrate de ejecutar primero wandb login.
Reanudar el entrenamiento
Si el entrenamiento se interrumpe, reanúdalo desde el último checkpoint:
lerobot-train \
--config_path=outputs/train/fruit_sorting_act/checkpoints/last/pretrained_model/train_config.json \
--resume=true \
--steps=200000
🚀 Despliegue y evaluación
Evaluar el modelo entrenado
Ejecuta episodios de evaluación para probar la política entrenada:
lerobot-record \
--robot.type=lerobot_robot_viola \
--robot.port=/dev/ttyUSB1 \
--robot.id=my_viola_follower \
--robot.cameras="{ wrist: {type: opencv, index_or_path: /dev/video2, width: 640, height: 480, fps: 30, fourcc: 'MJPG'}, front: {type: opencv, index_or_path: /dev/video4, width: 640, height: 480, fps: 30, fourcc: 'MJPG'}}" \
--display_data=false \
--dataset.repo_id=${HF_USER}/eval_fruit_sorting \
--dataset.single_task="Sort fruits into containers" \
--dataset.num_episodes=10 \
--policy.path=outputs/train/fruit_sorting_act/checkpoints/last/pretrained_model
Funcionamiento autónomo
Una vez entrenado, el robot puede clasificar frutas de forma autónoma. El siguiente vídeo muestra el flujo completo de trabajo de clasificación de frutas usando la política ACT entrenada en J501 Mini con el brazo StarAI Viola:
Aspectos destacados de la demo:
- El robot identifica y agarra diferentes frutas de forma autónoma
- Movimientos suaves y precisos aprendidos a partir de demostraciones de teleoperación
- Clasifica correctamente las frutas en los contenedores designados
- Demuestra la eficacia de la política ACT entrenada en J501 Mini
Para ejecutar la clasificación autónoma de frutas:
- Coloca las frutas en el área de trabajo
- Ejecuta el comando de evaluación mostrado arriba
- El robot ejecutará el comportamiento aprendido para agarrar y clasificar las frutas
🎯 Consejos para un mejor rendimiento
Mejores prácticas para la recopilación de datos
-
Entorno consistente
- Mantén estables las condiciones de iluminación
- Minimiza los cambios de fondo
- Usa una colocación de frutas consistente
-
Calidad sobre cantidad
- Recopila demostraciones suaves y deliberadas
- Evita movimientos bruscos
- Asegúrate de que los agarres en los datos de entrenamiento sean exitosos
-
Posicionamiento de la cámara
- Mantén los ángulos de la cámara consistentes
- Asegura una buena visibilidad de las frutas y la garra
- Evita el movimiento de la cámara durante la grabación
Optimización del entrenamiento
-
Tamaño del conjunto de datos
- Comienza con 50 episodios
- Añade más datos si el rendimiento es insuficiente
- Normalmente 100-200 episodios son suficientes para tareas sencillas
-
Ajuste de hiperparámetros
- Ajusta el tamaño del lote según la memoria de la GPU
- Aumenta los pasos de entrenamiento para una mejor convergencia
- Supervisa las métricas de evaluación
-
Consistencia del entorno
- Despliega en condiciones similares a las de entrenamiento
- Mantén una iluminación consistente
- Usa tipos de frutas y contenedores similares
🔧 Solución de problemas
Problemas comunes
Puerto USB no detectado
# Remove brltty
sudo apt remove brltty
# Check USB devices
lsusb
sudo dmesg | grep ttyUSB
# Grant permissions
sudo chmod 777 /dev/ttyUSB*
Cámara no funciona
- No conectes las cámaras a través de un hub USB
- Usa una conexión USB directa
- Comprueba el índice de la cámara con
lerobot-find-cameras opencv
Falta de memoria durante el entrenamiento
- Reduce el tamaño del lote:
--batch_size=4 - Reduce la resolución de la imagen
- Cierra otras aplicaciones
Bajo rendimiento de inferencia
- Recopila más datos de entrenamiento
- Asegura un entorno consistente
- Revisa el posicionamiento de la cámara
- Verifica la precisión de la calibración
📚 Referencias
- 🔗 Documentación de LeRobot
- 🔗 Wiki del brazo StarAI
- 🔗 Documentación de J501 Mini
- 🔗 Artículo de ACT
- 🔗 JetPack SDK
🤝 Soporte técnico y debate sobre productos
Gracias por elegir nuestros productos. Estamos aquí para ofrecerte diferentes tipos de soporte y garantizar que tu experiencia con nuestros productos sea lo más fluida posible. Ofrecemos varios canales de comunicación para adaptarnos a diferentes preferencias y necesidades.



