Skip to content

Software

Software Overview

AI Worker is a Jetson Orin–based robot platform built for real-world Physical AI research. It supports full-body motion control and enables smooth integration of both teleoperation and AI policy execution.

The platform runs on ROS 2 Jazzy and uses the ros2_control framework for real-time joint-level control. All joints are powered by DYNAMIXEL X, Y, and P series motors connected via a single RS-485 bus, using the Dynamixel SDK. Each joint can operate in either position or current control mode, managed through a unified hardware interface.

This platform is designed for:

  • Collecting motion data through teleoperation
  • Training reinforcement learning or imitation learning models
  • Running AI-generated trajectories in real time without changing system code

It is suitable for researchers, developers, and integrators working with AI-enabled robotics.

System Architecture

The diagram below illustrates the overall control structure of AI Worker.

External teleoperation or trajectory commands are received via ROS 2 topics, processed in real time by ros2_control, and executed by DYNAMIXEL actuators over RS‑485.

software_architecture

LayerComponentDescription
ComputeNVIDIA Jetson AGX Orin 32GBJetpack 6.2 + Docker container (ROS 2 Jazzy)
Motion Controlros2_control100Hz joint control loop
ActuatorsDYNAMIXEL X / P / Y seriesPosition / Current mode via RS‑485
CommunicationU2D2 (RS‑485)4 Mbps, Dynamixel Protocol 2.0
NetworkingEthernet / Wi-Fi 6Remote control and AI policy streaming
Sensors (Optional)Realsense D405 (wrist), ZED Mini (head)Integrated via official ROS 2 drivers

Why ros2_control?

ros2_control is a real-time, modular control framework used in ROS 2. AI Worker uses it without major changes.

  • Separates control logic from hardware drivers
  • Operates at a fixed 100Hz update rate
  • Supports dynamic loading or replacement of controllers
  • Allows AI policies to send trajectory commands using standard ROS topics

This structure supports both manual operation and AI-based control in the same system.

Motion Execution Pipeline

Input Source (Teleoperation / AI Policy)

ROS 2 JointTrajectory Topic

controller_manager (100Hz)

JointTrajectoryController(s)

resource_manager (interface arbitration)

DynamixelHardwareInterface (position / current)

RS‑485 via Dynamixel SDK

DYNAMIXEL Actuators

Step-by-Step

  1. Trajectory generation — Created by joystick, GUI, or AI model
  2. ROS topic publishing — Commands sent to /leader/joint_trajectory_command_broadcaster_*
  3. Controller manager — Runs the main read → update → write loop at 100Hz
  4. JointTrajectoryController — Splits trajectory and commands each joint
  5. Resource manager — Controls access to command interfaces and prevents conflicts between controllers
  6. Hardware interface — Converts commands to RS-485 packets using Dynamixel SDK
  7. Actuators — Execute the motion and return position/current feedback

Controller Configuration & Joint Mapping

ControllerSegmentDOFInput Topic
arm_l_controllerLeft arm (w/ gripper)8/leader/joint_trajectory_command_broadcaster_left
arm_r_controllerRight arm (w/ gripper)8/leader/joint_trajectory_command_broadcaster_right
head_controllerHead (pan/tilt)2/leader/joystick_controller_left
lift_controllerVertical lift1/leader/joystick_controller_right
joint_state_broadcasterAll jointsPublishes to /joint_states
swerve_drive_controllerMobile base6/cmd_vel

All controllers (except joint_state_broadcaster and swerve_drive_controller) use the JointTrajectoryController type.

By default, all joints operate in position mode, except for the mobile base which operates in velocity mode.

The last joint in each arm controller corresponds to the gripper.

yaml
/**:
  controller_manager:
    ros__parameters:
      use_sim_time: False
      update_rate: 100  # Hz

      arm_l_controller:
        type: joint_trajectory_controller/JointTrajectoryController

      arm_r_controller:
        type: joint_trajectory_controller/JointTrajectoryController

      head_controller:
        type: joint_trajectory_controller/JointTrajectoryController

      lift_controller:
        type: joint_trajectory_controller/JointTrajectoryController

      joint_state_broadcaster:
        type: joint_state_broadcaster/JointStateBroadcaster

      swerve_drive_controller:
        type: ffw_swerve_drive_controller/SwerveDriveController

/**:
  arm_l_controller:
    ros__parameters:
      joints:
        - arm_l_joint1
        - arm_l_joint2
        - arm_l_joint3
        - arm_l_joint4
        - arm_l_joint5
        - arm_l_joint6
        - arm_l_joint7
        - gripper_l_joint1
      command_interfaces:
        - position
      state_interfaces:
        - position
        - velocity
      allow_nonzero_velocity_at_trajectory_end: true

Debugging & Visualization Tools

Tool / TopicDescription
ros2 control list_controllersList loaded controllers and their status
/joint_statesReal-time joint position and velocity feedback
RViz23D view of robot model (URDF), TF, and movement

Safety & Fault Handling

  • Joint limits are enforced using the URDF and controller configuration
  • Out-of-range values are clamped by the hardware interface (YAML-defined limits)
  • The Dynamixel hardware interface checks for communication errors with each motor

AI Worker released under the Apache-2.0 license.