README.md

August 1, 2026 ยท View on GitHub

Rosetta

Rosetta interfaces ROS 2 robots to robot-learning frameworks like LeRobot.

Documentation: iblnkn.github.io/rosetta

Between a pub/sub robot and a policy sits a translation: topics must become training frames, and model output must become messages again. It has to happen identically at training and at deployment. Rosetta is built around the philosophy that this translation should be defined once and enforced as late as possible.

A YAML contract defines the translation. A contract looks like this:

robot_type: my_robot
robot_interface: ros2
fps: 30

observations:
  observation.state:
    channel: {topic: /joint_states, type: sensor_msgs/msg/JointState}
    align: {strategy: hold, timeline: header}
    select: [position.j1, position.j2]

  observation.images.cam:
    channel: {topic: /camera/image_raw/compressed,
              type: sensor_msgs/msg/CompressedImage}
    align: {strategy: hold, timeline: header}
    apply: [resize: [480, 640]]

actions:
  action:
    channel: {topic: /cmd, type: sensor_msgs/msg/JointState}
    align: {strategy: hold, timeline: header}
    select: [position.j1, position.j2]

Getting started

The rosetta_ws workspace installs ROS 2 Jazzy, Rosetta, and LeRobot in one command; the installation guide covers existing ROS 2 workspaces. The tutorial train and deploy your first policy walks through recording demonstrations with the episode recorder, converting bags to a dataset with rosetta_port, training with LeRobot, and deploying with the policy runner.

Packages

PackagePurpose
rosetta (this repo)Core library, ROS 2 nodes, bag conversion
rosetta_interfacesROS 2 action and service definitions
lerobot_rosettaLeRobot framework adapter: dataset writer, policy runner, inference servers
lerobot_robot_rosettaLeRobot Robot plugin
lerobot_teleoperator_rosettaLeRobot Teleoperator plugin (experimental)

License

Apache-2.0