# Prepare a dataset `rosetta_port` turns bags into a LeRobot dataset. Every option is on the [rosetta_port](../reference/rosetta-port.md) page. ## Port ```bash ros2 run rosetta rosetta_port \ --raw-dir datasets/bags \ --contract robot.yaml \ --repo-id my_org/my_dataset \ --root datasets/lerobot ``` The dataset lands in `datasets/lerobot/my_org/my_dataset`. Each bag directory under `--raw-dir` becomes one episode. The porter runs the same alignment code as live inference, so a dataset frame is what the robot would see at runtime. ## Check the result ```bash ls datasets/lerobot/my_org/my_dataset/meta/ ``` `info.json` lists the features and their shapes. `rosetta_contract.yaml` is the contract the porter used. ## Revise and port again Edit the contract and run the same command with a new `--repo-id`. A new key, a different `fps`, a different alignment or a different image size doesn't need a new recording. ## Port in parallel Split the bags into shards. Each process takes every nth bag. ```bash for i in 0 1 2 3; do ros2 run rosetta rosetta_port --raw-dir datasets/bags --contract robot.yaml \ --repo-id my_org/my_dataset --root datasets/lerobot \ --num-shards 4 --shard-index $i & done wait ``` ## Push to the Hugging Face Hub ```bash ros2 run rosetta rosetta_port ... --repo-id / --push-to-hub ``` The upload is private unless you add `--hub-public`. ## If an episode fails The porter logs `FAILED` for that bag and moves on. An observation topic missing from the bag, or present with no messages, fails the episode. A missing action, reward or signal topic doesn't: the key is zero-filled with a warning. Check the bag with `ros2 bag info` against the topic names in the contract.