Skip to main content

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ónArm KitArm Kit Pro
TipoArm KitArm Kit Pro
Grados de libertad66
Torque Máximo19.5kg.cm 7.4V30kg.cm 12V
ServoSTS3215 Bus ServoSTS3215 Bus Servo
Fuente de Alimentación5.5mm*2.1mm DC 5V4A5.5mm*2.1mm DC 12V1A
Sensor de ÁnguloCodificador magnético de 12 bitsCodificador magnético de 12 bits
Rango de Temperatura de Operación Recomendado0℃~40℃0℃~40℃
Método de ComunicaciónUARTUART
Método de ControlPCPC

Lista de Materiales (BOM)

ParteCantidadIncluido
STS3215 Servo112
Placa de Control de Motor2
Cable USB-C 2 pcs1
Fuente de Alimentación22
Abrazadera de Mesa1
Partes impresas en 3D del brazo1
caution

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

  1. Familiarizarse con nuestro tutorial de uso básico del Lerobot SO100Arm.
  2. Instalar Isaac Sim según el tutorial
  3. 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

Jetson AI Lab

Diffusion Policy

ACT or ALOHA

TDMPC

VQ-BeT

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.

Loading Comments...