Volver a Guides

ROS2 y MoveIt2 Integración del brazo robótico: una guía práctica

Cómo integrar un brazo robótico con la configuración URDF, el control ros2_control, la planificación de movimiento y el modo servo de teleoperación.

[← Guías]

Una pauta a pausa para la integración de brazos utilizando ROS2 Humble y MoveIt2, desde la creación de URDF a través del control de servo cartesiano en vivo.

Pre-requisitos

Esta guía se dirige a Ubuntu 22.04 LTS con ROS2 Humble Hawksbill (EOL mayo 2027), Python 3.10, y la MoveIt2 versión binaria para Humble.

  • ROS2 Humble desktop-full: T1 incluye rviz2, rqt y todas las bibliotecas centrales.
  • MoveIt2: T2 pulsa en movit_core, movit_ros_planning, movit_ros_move_group, y todos los plugins de planificador.
  • ros2_control: T3 obligatorio para la abstracción de hardware.
  • Paquetes de Python: T4 para utilidades cinemáticas utilizadas en los fragmentos del tutorial.
  • colón: T5 para construir sus paquetes personalizados.

Verifique su entorno: T6 no debe mostrar errores. Si ve advertencias de "configuración de red" en una sola máquina, exporta T7 para evitar problemas de transmisión múltiple.

Configuración de la URDF

El formato de descripción unificado de robots (URDF) es la única fuente de verdad para la cinemática, la dinámica y la interfaz de hardware de su brazo.

Los límites de articulación son lo primero que se correcta. Los límites blandos (utilizados por MoveIt2 para la planificación) deben estar dentro de los límites duros (utilizados por el firmware para la parada de emergencia). Si el límite de hardware J2 de tu brazo es de -120 a +120 °, establece los URDF T8 y T9 (±120 ° en radianos), luego establece los límites de articulación de MoveIt2 a ±117 ° en T10.

Los tensores de inercia son comúnmente incorrectos y causan una dinámica de simulación inestable. Para un enlace de masa m aproximada como un cilindro de radio r y longitud L, utilice T11, T12, T13. Los términos fuera de diagonal son cero para los enlaces simétricos. La inercia incorrecta (por ejemplo, valores de cero total o de lugar) hará que la física de Gazebo explode y puede hacer que el verificador de colisión de MoveIt2 se comporte de manera impredecible.

Geometría visual vs. de colisión: Utilice redes de alto polí (DAE/OBJ) para etiquetas visuales y redes de casco convexa simplificadas para etiquetas de colisión.

La etiqueta de interfaz de hardware ros2_control debe aparecer dentro del elemento T15 de su URDF. Esta etiqueta declara el tipo de interfaz de control y la clase de plugins para su controlador de hardware:

  • ** Plugin de hardware:** Configurar en su controlador, por ejemplo T16 para los brazos [OpenArm]T60).
  • interfaz de mando: Declarar T17 para el control de posición. También declarar T18 y T19 si su conductor los admite.
  • interfaz de estado: Siempre declare T20 y T21. Agregue T22 si el hardware proporciona retroalimentación del par.
  • Tag de parámetro: Pasar parámetros específicos del hardware (por ejemplo, puerto de serie, velocidad de baud, IP del robot) a través de las etiquetas de parámetro dentro del elemento del hardware.

MovIt2 conceptos básicos

Comprender estos cuatro conceptos antes de escribir una sola línea de código de planificación ahorrará horas de depuración.

MoveGroup es la interfaz de planificación de alto nivel. Envuelve la tubería de planificación, la escena de planificación y el administrador de ejecución. Interactúa con ella a través de la clase T23 C++ o el envoltorio de Python T24. Un MoveGroup se define para un grupo nombrado en su SRDF (por ejemplo, "brazo", "gripper") y actúa como el punto de entrada para todas las solicitudes de planificación.

** Planning pipeline** en cadena un plugin de planificador con adaptadores opcionales de pre / post procesamiento. MoveIt2 envía tres planeros de fondo elegir en función de su tarea:

Planner Best For Limitations
OMPL (default) General-purpose, cluttered environments, no dynamics needed Non-deterministic; replanning may give different paths
CHOMP Smooth, gradient-optimized trajectories Can get stuck in local minima; slow in tight spaces
PILZ Industrial Motion Planner Deterministic LIN/PTP/CIRC industrial moves No obstacle avoidance; requires clear workspace

Escena de planificación es una representación en 3D en vivo del entorno. Se inicia desde su URDF y se actualiza en el tiempo de ejecución con objetos de colisión (cajas, esferas, mallas) añadidos a través de la T25. Siempre añada su tabla, fijación y obstáculos conocidos a la escena antes de planificar MoveIt2 planes a través del espacio libre, no alrededor de objetos desconocidos.

** Planificación de restricciones:** MoveIt2 admite restricciones de trayectoria (por ejemplo, mantener el efecto final vertical durante todo el movimiento), restricciones articulares, restricciones de posición y restricciones de orientación. Las restricciones se especifican en el T26. Para el mantenimiento de la orientación simple (por ejemplo, mantener el nivel de la agarre mientras se mueve), una restricción de orientación con tolerancia ±10° alrededor de los ejes de lanzamiento y rodadura funciona confiablemente.

Tutorial de planificación de movimiento

Este flujo de trabajo de cuatro pasos te lleva de una terminal nueva a ejecutar un camino cartesiano controlado por colisión.

** Paso 1 Lanzar la demostración:** T28 presenta rviz2 con el brazo demo Panda. Cambiar el archivo de lanzamiento para el paquete de configuración MoveIt2 de su propio brazo (generado por el Asistente de configuración MoveIt2).

** Paso 2 Configurar escena de planificación:** Publique un mensaje T29 en T30. Añade una casilla que represente su mesa de trabajo en la posición correcta.

** Paso 3 Planifique un camino cartesiano:** Utilice T31 donde T32 significa un punto de paso por centímetro de viaje del efecto final. Un valor de retorno de 1.0 significa que se calculó el 100% del camino. Valores por debajo de 0.9 típicamente significan que se alcanzó un límite conjunto o una colisión a mitad del camino ajuste sus puntos de paso o relaje la restricción.

** Paso 4 Ejecutar con la verificación de colisión:** Llamar T33 que pasa la trayectoria a través del gestor de ejecución de trayectoria. El gestor transmite comandos conjuntos a ros2_control en la frecuencia configurada (normalmente 250500 Hz). Si la escena de planificación monitoreada detecta una colisión durante la ejecución (requiere la corriente de actualización de escena T34), MoveIt2 abortará la trayectoria.

Modo de servicio de teleoperación

moveit_servo permite el control de velocidad cartesiana en tiempo real sin replanar. Acoge T35 mensajes a hasta 100 Hz y genera continuamente comandos de velocidad conjunta que rastrean la velocidad del efecto final solicitado, sujeto a límites conjuntos y evitación de singularidad.

Para iniciar el modo servo para su brazo, agregue el nodo servo a su archivo de inicio con la configuración servo YAML. Parámetros clave:

  • move_group_name: El grupo de planificación para servo debe coincidir con el nombre del grupo SRDF.
  • Cartesian_command_in_topic: Default T36. Publica T37 aquí a 50100 Hz.
  • comando conjunto_out_topic: salida T38 reenviado a ros2_control.
  • incoming_command_timeout: Se establece en 0,1 segundos. Si no se recibe ningún comando dentro de esta ventana, el servo detiene el brazo una característica de seguridad crítica para la teleop.
  • ** menor_singularidad_ umbral / duro_stop_singularidad_ umbral:** Establecido en 17 y 30 (umbral de número de condición).

Para colección de datos de teleoperación, publique comandos de torsión derivados de su dispositivo de entrada (controlador VR, SpaceMouse o guante) a una frecuencia constante de 100 Hz. El despegue en la frecuencia de comando causa discontinuidades de velocidad que degradan la calidad de la demostración.

Problemas comunes y soluciones

  • Controller timing / "Punto de trayectoria no está aumentando estrictamente": Asegúrese de que su interfaz de hardware implemente T39 (no T40) para brazos controlados por posición. Interfaces de velocidad requieren un tiempo preciso que los brazos basados en USB no pueden garantizar.
  • Violaciones de límites conjuntos durante la planificación: Aplicar un margen de seguridad de 5° (0.0873 rad) en T41 mediante la configuración de T42 y T43 dentro de los límites duros. Esto evita que el planificador genere trayectorias que desencadenen los interruptores de límite del hardware en la ejecución media.
  • ** Dinámica inestable en la simulación:** Los valores de inercia URDF erróneos son la causa más común.
  • ** Movegrupo no se conecta:** Compruebe que el nodo mov_group está funcionando (T45) y que su RMW (DDS Cyclone predeterminado) tiene el mismo ID de dominio que sus otros nodos. Establezca T46 de manera consistente.
  • Servo produce movimiento de jerky: Asegúrese de que su bucle de comando servo se ejecuta a una velocidad fija. Utilice un temporizador ROS2 con T47 en lugar de un bucle mientras con T48.

Referencia de los paquetes clave

Package Purpose Install
moveit_servo Real-time Cartesian servo / teleop Included in ros-humble-moveit
moveit_planners_ompl OMPL sampling-based planners Included in ros-humble-moveit
moveit_visual_tools rviz2 debugging markers and trajectory visualization ros-humble-moveit-visual-tools
joint_state_broadcaster Broadcasts /joint_states from ros2_control ros-humble-ros2-controllers
robot_state_publisher Publishes TF tree from URDF + joint states ros-humble-robot-state-publisher
moveit_ros_perception OctoMap integration for 3D obstacle avoidance Included in ros-humble-moveit

Configuración de OpenArm 1 MoveIt2

El OpenArm 1 navega con configuración MoveIt2 preconstruida, pero entender la estructura ayuda al personalizar para sus tareas.

  • URDF/XACRO: T49 define 6 juntas de revoluciones + 1 juntas de agarre prismático. Los límites de juntas se establecen a 5 grados dentro de los límites del hardware.
  • SRDF: T50 define el grupo de planificación "brazo" (articulaciones 1-6) y el grupo "gripper" (articulaciones de agripper). Dos posiciones nombradas: "casa" (todos los ceros) y "pronto" (articulaciones en [0, -0.5, 0.7, 0, 0.8, 0] rad).
  • joint_limits.yaml: Los límites de velocidad fijados en 1,0 rad/s para la seguridad durante la teleoperación.
  • kinematics.yaml: solver de KDL por defecto. Para tareas que requieren IK cerca de la singularidad, cambie a T51: T52 y actualice kinematics.yaml.

Ejemplo de interfaz de Python MoveGroup

Un ejemplo completo de Python que planea y ejecuta una secuencia de pick-and-place utilizando la API Python MoveIt2:

#!/usr/bin/env python3
"""MoveIt2 pick-and-place example for OpenArm 1."""
import rclpy
from rclpy.node import Node
from moveit2 import MoveIt2
from geometry_msgs.msg import PoseStamped
import numpy as np

class PickPlace(Node):
    def __init__(self):
        super().__init__("pick_place")
        self.moveit2 = MoveIt2(
            node=self,
            joint_names=[f"joint_{i}" for i in range(1, 7)],
            base_link_name="base_link",
            end_effector_name="gripper_link",
            group_name="arm",
        )
        # Wait for MoveIt2 to be ready
        self.moveit2.wait_for_execution(timeout=10.0)

    def execute(self):
        # 1. Move to ready pose
        self.moveit2.move_to_configuration(
            [0.0, -0.5, 0.7, 0.0, 0.8, 0.0]
        )
        self.moveit2.wait_for_execution()

        # 2. Move to pick pose (Cartesian)
        pick_pose = PoseStamped()
        pick_pose.header.frame_id = "base_link"
        pick_pose.pose.position.x = 0.3
        pick_pose.pose.position.y = 0.0
        pick_pose.pose.position.z = 0.05
        pick_pose.pose.orientation.w = 1.0
        self.moveit2.move_to_pose(pick_pose)
        self.moveit2.wait_for_execution()

        # 3. Close gripper
        self.moveit2.move_to_configuration(
            joint_positions=[0.0],  # closed
            joint_names=["gripper_joint"],
            group_name="gripper",
        )
        self.moveit2.wait_for_execution()

        # 4. Move to place pose
        place_pose = PoseStamped()
        place_pose.header.frame_id = "base_link"
        place_pose.pose.position.x = 0.3
        place_pose.pose.position.y = -0.2
        place_pose.pose.position.z = 0.1
        place_pose.pose.orientation.w = 1.0
        self.moveit2.move_to_pose(place_pose)
        self.moveit2.wait_for_execution()

        # 5. Open gripper
        self.moveit2.move_to_configuration(
            joint_positions=[0.04],  # open
            joint_names=["gripper_joint"],
            group_name="gripper",
        )
        self.moveit2.wait_for_execution()

def main():
    rclpy.init()
    node = PickPlace()
    node.execute()
    rclpy.shutdown()

if __name__ == "__main__":
    main()

Planificación de la ruta cartesiana: flujo de trabajo detallado

Los caminos cartesianos son esenciales para las tareas que requieren que el efector final siga una trayectoria específica en el espacio 3D (borrado, dibujo, inserción).

  • Apartamiento entre los puntos de ruta: Establezca T53 (1 cm entre los puntos de ruta) para un movimiento suave. Los pasos más grandes (5 cm) producen movimientos de jerky en las esquinas. Los pasos más pequeños (<5 mm) aumentan el tiempo de planificación sin mejoras visibles.
  • Párrafo de salto: Establezca T54 para desactivar el detector de salto (recomendado para la mayoría de las tareas). Un umbral no cero aborta la planificación si alguna articulación se mueve más allá del umbral entre los puntos de paso adyacentes, lo que detecta discontinuidades IK pero también rechaza caminos válidos cerca de los límites de las articulaciones.
  • ** Verificación de fracciones:** T55 devuelve una fracción (0.0-1.0) que indica cuánto de la ruta solicitada fue posible. Si la fracción < 0.95, la ruta probablemente cruza un límite de unión o límite de colisión. Ajuste la dirección de aproximación o relaje la restricción de orientación.
  • Constrangimientos de orientación durante el movimiento cartesiano: Para tareas como verter o insertar, añadir una restricción de orientación para mantener el nivel del agarre.

Verificación de colisión: añadir objetos a la escena de planificación

MoveIt2 sólo evita colisiones con objetos que conoce. Siempre añada los objetos de su espacio de trabajo antes de planificar:

  • ** Superficie de la mesa:** Añadir como caja un primitivo con dimensiones que coinciden con la mesa, posicionado a la altura correcta. Este es el objeto de colisión más comúnmente perdido y causa choques de la mesa de brazos.
  • Montajes de cámara: Añadir formas de caja simplificadas para montajes de cámara superior y lateral.
  • Objetos adjuntos: Cuando el agarre agarra un objeto, adjúntelo al enlace de efecto final utilizando T56. Esto evita que el planificador genere rutas que choquen con el objeto agarrado con el entorno.
  • OctoMap (obstaculos dinámicos): Para entornos con obstáculos en movimiento, alimenta la nube de puntos de una cámara de profundidad a la integración OctoMap de MoveIt2. MoveIt2 construye un mapa de ocupación en 3D y planea alrededor de él. Utilice T57 y configure T58 (2 voxels de cm) para un buen equilibrio de detalles y velocidad de planificación.

Guías relacionados

Trabajar con el RCSV

RCSV proporciona soporte de integración ROS2 y MoveIt2 para todas las plataformas de brazo que vendemos y atendemos.

  • OpenArm Resources -- URDF de código abierto, configuración MoveIt2, y controlador ros2_control para OpenArm 1
  • Tienda de hardware -- compra OpenArm 1 ($ 4,500) con controlador ROS2 preconfigurado
  • Reparación y mantenimiento -- Servicios de integración de ROS2, desarrollo de conductores y calibración
  • Plataforma de datos -- subir los datos de teleoperación recogidos a través del modo servo MoveIt2
  • [Contacta con nosotros] T72) -- solicitar soporte de integración ROS2 para su plataforma de brazo

¿Estás listo para empezar a construir?

Explore OpenArm nuestro brazo robótico de código abierto diseñado para la integración de ROS2 y MoveIt2, con URDF preconstruido, configuración de MoveIt2 y controlador de control ros2_.

[Resources OpenArm]