Skip to 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.

yaml
/**:
  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

AI Worker and AI Manipulator released under the Apache-2.0 license.