En esta práctica he montado la descripción de un robot SCARA usando archivos .xacro, que básicamente es como una versión más flexible de URDF.
La idea era tener todo bien organizado en piezas reutilizables, en vez de meter todo el robot en un solo archivo grande.
/rover_description/
├── robots
│ └── robot.urdf.xacro
└── urdf
├── base
│ └── robot_base.urdf.xacro
├── clamp
│ └── clamp.urdf.xacro
├── leg
│ └── robot_leg.urdf.xacro
├── ros2_control.urdf.xacro
├── scara
│ └── scara.urdf.xacro
├── sensors
│ ├── camera.urdf.xacro
│ └── imu.urdf.xacro
└── utils
└── utils.urdf.xacro
El robot completo está definido en robot.urdf.xacro, pero este archivo lo que hace principalmente es incluir los distintos módulos:
robot_base.urdf.xacro: define la base fija del robot,robot_leg.urdf.xacro: con las ruedasclamp.urdf.xacro: pinza simpleimu.urdf.xacroycamera.urdf.xacro: sensores especificados por el enunciadoscara.urdf.xacro: defino las articulaciones principales
Esta modulación hace que el fichero robot se obtenga el robot con unas sencillas intrucciones:
Y el arbol de Transofadas corresponde con:
frames_2025-06-29_21.29.44.pdf

Para controlar el robot tanto desde ROS como en simulación, he configurado el sistema de control usando ros2_control y MoveIt.
En rover_controllers.yaml y ros2_controllers.yaml se definen los controladores principales que se van a lanzar:
joint_state_broadcaster: publica el estado de todas las articulacionesdiff_cont: controlador de tipoDiffDriveControllerpara el movimiento diferencial del rover, con sus parámetros de ruedas, límites de velocidad y aceleración.scara_controller: controladorJointTrajectoryControllerpara el brazo SCARA. Controla las articulacionesq1_joint,q2_joint,d3_prismatic_jointyq4_orientation_joint.gripper_controller: también unJointTrajectoryControllerpero para el gripper, controlando las dos pinzas.
Cada controlador tiene definidos los command_interfaces (posición) y state_interfaces (posición y velocidad).
Para la planificación de movimientos con el brazo, he usado MoveIt a través de la configuración generada con el asistente.
En el archivo gazebo_launch.launch.py se inicializa MoveIt junto con la simulación de Gazebo, y se lanza RViz ya preconfigurado con el robot.
También se incluyen los nodos necesarios para publicar la descripción del robot (robot_state_publisher) y las interfaces necesarias para visualizar y simular el estado.
En rover_bridge.yaml he configurado los bridges necesarios para que Gazebo y ROS2 puedan comunicarse correctamente:
/clocksincronizar el tiempo simulado./tfpara transmitir las tfs del mundo simulado./imu/datapara recibir los datos del sensor inercial.
Vemos que todos los controladores se han activado con éxito, también podemos ver como la simulación se ha lanzado correctamente:

También vemos que los sensores están correctamente funcionando y colocados segun los estándares de ROS:
Cambiando la posición se actualiza la imagen:
También vemos que se está publicando los datos de la imu:

También podemos ver que el plugin de Movit para Rviz2 está bien configurado:
Tanto los controles del gripper como el de la cadena cinemática del scara



