Add a framework

An adapter connects a learning framework to Rosetta. It’s a Python package with two classes and two entry points. lerobot_rosetta is the working example.

Implement the two protocols

From rosetta.policies.protocols:

class DatasetWriter:
    def open(self, *, contract, repo_id, root=None, contract_path=None,
             embed_contract=True, **opts): ...
    def add_frame(self, frame): ...
    def save_episode(self): ...
    def discard_episode(self): ...
    def finalize(self): ...

class PolicyRunner:
    def setup(self, node, contract): ...
    def run(self, frames, *, task, stop_event): ...   # returns RunnerResult
    def feedback(self): ...                            # returns RunnerFeedback
    def request_stop(self): ...
    def teardown(self): ...

frames in run is a FrameIO with sample_frame(), warmed_up, publish_frame(frame), send_safety_action() and reset_state(). Both classes need a zero-argument constructor.

Register them

entry_points={
    "rosetta.dataset_writers": ["myfw = my_adapter.writer:MyWriter"],
    "rosetta.policy_runners":  ["myfw = my_adapter.runner:MyRunner"],
},

Use them

ros2 run rosetta rosetta_port --framework myfw ...
ros2 launch rosetta policy_runner_launch.py ...   # with framework: myfw in the params file

An unknown name lists the registered ones. A class missing part of the protocol is rejected at load. Contracts don’t name a framework, so one written for LeRobot runs unchanged on yours.