Cómo Importar y Controlar SO100Arm Kit en Isaac Sim 4.2(Solo)
Introducción
El SO-100ARM es un proyecto de brazo robótico completamente de código abierto lanzado por TheRobotStudio. Incluye el brazo seguidor y el brazo robótico líder, y también proporciona archivos detallados de impresión 3D y guías de operación. LeRobot está comprometido a proporcionar modelos, conjuntos de datos y herramientas para robótica del mundo real en PyTorch. Su objetivo es reducir la barrera de entrada de la robótica, permitiendo que todos contribuyan y se beneficien del intercambio de conjuntos de datos y modelos preentrenados.
Este wiki proporciona instrucciones sobre cómo importar el brazo robótico SO100 Arm Kit en la plataforma de simulación Isaac Sim de NVIDIA y controlarlo usando ROS2 y scripts de Python.
Introducción de Proyectos
El SO-ARM100 y el kit de robot inteligente AI reComputer Jetson combinan perfectamente el control de brazo robótico de alta precisión con una potente plataforma de computación AI, proporcionando una solución integral de desarrollo de robots. Este kit está basado en la plataforma Jetson Orin o AGX Orin, combinado con el brazo robótico SO-ARM100 y el framework AI LeRobot, ofreciendo a los usuarios un sistema de robot inteligente aplicable a múltiples escenarios como educación, investigación y automatización industrial. Este wiki proporciona el tutorial de ensamblaje y depuración para el SO ARM100 y realiza la recolección de datos y entrenamiento dentro del framework Lerobot.

Especificaciones
Especificación | Arm Kit | Arm Kit Pro |
---|---|---|
Tipo | Arm Kit | Arm Kit Pro |
Grados de libertad | 6 | 6 |
Torque Máximo | 19.5kg.cm 7.4V | 30kg.cm 12V |
Servo | STS3215 Bus Servo | STS3215 Bus Servo |
Fuente de Alimentación | 5.5mm*2.1mm DC 5V4A | 5.5mm*2.1mm DC 12V1A |
Sensor de Ángulo | Codificador magnético de 12 bits | Codificador magnético de 12 bits |
Rango de Temperatura de Operación Recomendado | 0℃~40℃ | 0℃~40℃ |
Método de Comunicación | UART | UART |
Método de Control | PC | PC |
Lista de Materiales (BOM)
Parte | Cantidad | Incluido |
---|---|---|
STS3215 Servo1 | 12 | ✅ |
Placa de Control de Motor | 2 | ✅ |
Cable USB-C 2 pcs | 1 | ✅ |
Fuente de Alimentación2 | 2 | ✅ |
Abrazadera de Mesa | 1 | ❌ |
Partes impresas en 3D del brazo | 1 | ❌ |
Las partes impresas en 3D y las abrazaderas de mesa no están incluidas en el producto. Sin embargo, el SO-100ARM proporciona archivos STL detallados para impresión 3D y parámetros de impresión. Además, también ofrecemos las partes impresas en 3D de la Abrazadera de Mesa.
Prerrequisitos
- Familiarizarse con nuestro tutorial de uso básico del Lerobot SO100Arm.
- Instalar Isaac Sim según el tutorial
- Completar la Instalación y Configuración de ROS2 Según el Tutorial
Instalar el entorno Lerobot
Paso 1. Clonar el proyecto Lerobot
cd ~/
git clone https://github.com/ZhuYaoHui1998/lerobot.git
cd lerobot
Asegúrate de haber instalado el entorno Lerobot según el tutorial
Importar el URDF a Isaac Sim
Paso 1. Abrir Isaac Sim
Asegúrate de que Isaac Sim haya sido instalado según el tutorial oficial de NVIDIA, ROS2 haya sido instalado, y la configuración básica del entorno haya sido completada. Abre la interfaz de Isaac Sim con parámetros como se muestra en la figura a continuación.

Paso 2. Usar URDF Importer
Abre Isaac Utils → Workflows → URDF Importer en la barra de herramientas de Isaac Sim

Paso 3. Importar URDF
Mantén los parámetros predeterminados, busca el archivo en Input, e importa el URDF del repositorio Lerobot clonado en /lerobot/SO-ARM100/URDF/SO_5DOF_ARM100_8j_URDF.SLDASM/urdf/SO_5DOF_ARM100_8j_URDF.SLDASM.urdf


Ahora puedes ver que nuestro brazo robótico SO100 ha sido importado a Isaac Sim.

Paso 4. Añadir elementos de Física
En la barra de herramientas de Isaac Sim, navega a Create → Physics y añade tanto Physics Scene
como Ground Plane
para configurar el entorno físico y el suelo.

Paso 5. Eliminar Articulation Root
de root_joint
En el panel Stage a la derecha, localiza root_joint
. Haz clic en él, luego en las Propiedades abajo, encuentra Articulation Root
bajo Physics, y haz clic en la × a la derecha para eliminar esta raíz.

Paso 6. Añadir Articulation Root
de root_joint
En el panel Stage, haz clic en SO100, clic derecho, luego Add → Physics → Articulation Root.

Añadir Action Graph
Paso 1. En la barra de herramientas, navega a Create → Visual Scripting y añade Action Graph.

Paso 2. Añadir Componentes de Acción.
En la caja de búsqueda, añade en orden: On Playback Tick, Isaac Read Simulation Time, ROS2 Publish Joint State, Articulation Controller, ROS2 Subscribe Joint State.

Para una comprensión más clara de esta parte, por favor realiza las conexiones de acción y configuraciones básicas de parámetros según el contenido del video.
Paso 3. Reproducir
Haz clic en el botón Play a la derecha para iniciar la acción normalmente. En este punto, usa el comando ros2 topic list
para ver la información de tópicos.

Control Python ROS2 del Movimiento del Brazo Robótico
Ahora, puedes ejecutar los siguientes scripts de Python en el entorno ROS2 para controlar el brazo robótico. Los archivos de script se encuentran bajo lerobot/lerobot/scripts/
como control_motor.py
y lerobot_publisher.py
.
control_motor.py
te permite enviar el ángulo de un servo específico individualmente, con valores de ángulo que van entre -π y π.
control_motor.py
import threading
import rclpy
from sensor_msgs.msg import JointState
rclpy.init()
node = rclpy.create_node('position_velocity_publisher')
pub = node.create_publisher(JointState, 'joint_command', 10)
thread = threading.Thread(target=rclpy.spin, args=(node, ), daemon=True)
thread.start()
joint_state_position = JointState()
joint_state_position.name = ["Rotation", "Pitch","Elbow","Wrist_Pitch","Wrist_Roll","Jaw"]
joint_state_position.position = [0.2,0.2,float('nan'),0.2,0.2,0.2]
#joint_state_position.position = [0.0,0.0,0.0,0.0,0.0,0.0]
rate = node.create_rate(10)
try:
while rclpy.ok():
pub.publish(joint_state_position)
rate.sleep()
except KeyboardInterrupt:
pass
rclpy.shutdown()
thread.join()
lerobot_publisher.py
implementa el envío continuo de comandos de acción a los servos.
lerobot_publisher.py
import rclpy
from rclpy.node import Node
from sensor_msgs.msg import JointState
import numpy as np
import time
class TestROS2Bridge(Node):
def __init__(self):
super().__init__("test_ros2bridge")
# Create the publisher. This publisher will publish a JointState message to the /joint_command topic.
self.publisher_ = self.create_publisher(JointState, "joint_command", 10)
# Create a JointState message
self.joint_state = JointState()
self.joint_state.name = [
"Rotation",
"Pitch",
"Elbow",
"Wrist_Pitch",
"Wrist_Roll",
"Jaw"
]
num_joints = len(self.joint_state.name)
# make sure kit's editor is playing for receiving messages
self.joint_state.position = np.array([0.0] * num_joints, dtype=np.float64).tolist()
self.default_joints = [0, 0, 0, 0, 0, 0]
# limiting the movements to a smaller range (this is not the range of the robot, just the range of the movement
self.max_joints = np.array(self.default_joints) + 0.3
self.min_joints = np.array(self.default_joints) - 0.3
# position control the robot to wiggle around each joint
self.time_start = time.time()
timer_period = 0.05 # seconds
self.timer = self.create_timer(timer_period, self.timer_callback)
def timer_callback(self):
self.joint_state.header.stamp = self.get_clock().now().to_msg()
joint_position = (
np.sin(time.time() - self.time_start) * (self.max_joints - self.min_joints) * 0.5 + self.default_joints
)
self.joint_state.position = joint_position.tolist()
# Publish the message to the topic
self.publisher_.publish(self.joint_state)
def main(args=None):
rclpy.init(args=args)
ros2_publisher = TestROS2Bridge()
rclpy.spin(ros2_publisher)
# Destroy the node explicitly
ros2_publisher.destroy_node()
rclpy.shutdown()
if __name__ == "__main__":
main()
Cita
Proyecto TheRobotStudio: SO-ARM100
Proyecto Huggingface: Lerobot
Dnsty: Jetson Containers
Soporte Técnico y Discusión de Productos
¡Gracias por elegir nuestros productos! Estamos aquí para brindarle diferentes tipos de soporte para asegurar que su experiencia con nuestros productos sea lo más fluida posible. Ofrecemos varios canales de comunicación para satisfacer diferentes preferencias y necesidades.