README.md
August 1, 2026 ยท View on GitHub
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
| Package | Purpose |
|---|---|
rosetta (this repo) | Core library, ROS 2 nodes, bag conversion |
rosetta_interfaces | ROS 2 action and service definitions |
lerobot_rosetta | LeRobot framework adapter: dataset writer, policy runner, inference servers |
lerobot_robot_rosetta | LeRobot Robot plugin |
lerobot_teleoperator_rosetta | LeRobot Teleoperator plugin (experimental) |