Skip to main content

Software Overview

OMX is a 5-DOF robotic manipulator designed for real-world Physical AI research.
It supports teleoperation, trajectory learning, and deployment of AI policies through a unified ROS 2 control architecture.

The platform runs on ROS 2 Jazzy and uses the ros2_control framework for real-time joint-level control.
The arm is driven by DYNAMIXEL-X series actuators connected over TTL using the Dynamixel SDK.

This system is designed for:

  • Collecting motion data through teleoperation
  • Training and testing trajectory-based AI models
  • Running learned or predefined trajectories on real hardware

OMX provides an efficient and compact platform for Physical AI research in both academic and industrial environments.

System Architecture​

info

The diagram below illustrates the overall control structure of OMX. Teleoperation or AI-generated commands are processed through ros2_control, translated by the hardware interface, and executed by DYNAMIXEL actuators via TTL.

software_architecture

LayerComponentDescription
ComputeUser PCROS 2 Jazzy
Motion Controlros2_controljoint control at 100Hz
ActuatorsDYNAMIXEL-X seriesservo via TTL
CommunicationTTLDynamixel Protocol 2.0

Why ros2_control?​

OMX uses ros2_control for modular, real-time control of its joints.

  • Clean separation between hardware and control logic
  • Supports multiple controller types (trajectory, GPIO, command)
  • Integrates easily with teleop, GUI, and AI-based trajectory sources

This makes it easy to switch between manual, scripted, or learned motion strategies.

Motion Execution Pipeline​

Input Source (Teleoperation / AI Policy)
↓
ROS 2 JointTrajectory / Command Topics
↓
controller_manager (100Hz loop)
↓
OMX Controllers
↓
DynamixelHardwareInterface
↓
TTL Bus
↓
DYNAMIXEL-X Actuators

Controller Configuration & Joint Mapping​

ControllerSegmentDOFInput Topic
arm_controller5-DOF Arm5(6)/leader/arm_controller/joint_trajectory
gpio_command_controllerGripper (GPIO pin)1/gpio_command_controller/commands
joint_command_broadcasterAll joints (read-only)–Publishes to /joint_states
info

In AI TELEOPERATION mode, the number of joints in the Arm Controller becomes 6.

  • The gripper operates in current-based position mode; all other actuators operate in position mode by default.

/**:
controller_manager:
ros__parameters:
update_rate: 100 # Hz

joint_state_broadcaster:
type: joint_state_broadcaster/JointStateBroadcaster

arm_controller:
type: joint_trajectory_controller/JointTrajectoryController

/**:
arm_controller:
ros__parameters:
joints:
- joint1
- joint2
- joint3
- joint4
- joint5
- gripper_joint_1

interface_name: position

command_interfaces:
- position

state_interfaces:
- position
- velocity

allow_partial_joints_goal: true

Debugging & Visualization Tools​

Tool / TopicDescription
ros2 control list_controllersCheck controller status
ros2 topic echo /joint_statesMonitor joint position/velocity
Rviz23D view of robot model (URDF), TF, and movement

Safety & Limits​

  • Joint limits are defined in the URDF and enforced at the controller layer
  • Velocity/position clamping can be configured per joint
  • Communication errors are detected by the Dynamixel hardware interface