Run human-in-the-loop episodes
Run a policy with a teleop device ready to take over, and record what happens. Parameters are under hil_manager_node.
Declare the teleop device
Add a teleop section to the contract: an input whose target is the
action topic, and events mapping event names to buttons.
contracts/so_101_hil.yaml is a complete example. The schema is on the
Contract page.
Launch
ros2 launch rosetta hil_launch.py \
contract_path:=robot_hil.yaml \
action_remap_from:=/forward_position_controller/commands \
pretrained_name_or_path:=<checkpoint> \
policy_type:=act
action_remap_from is the contract’s action topic. The launch fails if it
isn’t one. With a reward classifier, reward_remap_from names the reward
topic the same way.
This starts the manager, the recorder, and a policy runner in namespace
robot_policy. With enable_reward_classifier:=true it also starts a
classifier in namespace reward_classifier. The runner publishes to
/hil/policy<topic>, and the manager forwards to <topic> while the policy
has control.
Run an episode
ros2 action send_goal /manage_episode \
rosetta_interfaces/action/ManageEpisode "{prompt: 'place cubes on tray'}"
Hold the is_intervention button to take over. Release it to hand back.
Press end_success or end_failure to finish. The services do the same:
ros2 service call /hil_manager/set_intervention std_srvs/srv/SetBool "{data: true}"
ros2 service call /hil_manager/end_episode std_srvs/srv/SetBool "{data: true}"
The result reports termination_reason and outcome separately. Nothing
here deletes a bag. For that, call the recorder’s delete_last_bag service.
End on a reward
Set success_reward_threshold on the goal. When the reward reaches it, the
episode ends with termination_reason: reward_threshold, and an unlabeled
outcome is recorded as success.