The bridge already defaults to the six SO-101 joints, so the only thing left to set is where each arm’s travel comes from. Point it at LeRobot’s calibration with calibration_profile:=lerobot_so101_rad and each host reads its own arm. You still need your own ROS 2 driver for the arm. The bridge owns no servo bus.

Calibrate

Calibrate both arms with LeRobot first. It writes JSON under ~/.cache/huggingface/lerobot/calibration/, leaders and followers in separate directories. The bridge reads that same file and converts it to radians, which is what a joint_states topic normally carries. The role decides which directory is searched, so a leader_side node looks under the teleoperator tree and a follower_side node under the robot tree.
Set either calibration_profile or joint_min and joint_max, never both. The node refuses to start when it is given both.

Launch

Nothing moves until ~/enable is called on the leader. See Overview for the full launch sequence.

Joints

joint_names already carries the SO-101 order, so you only set it if your driver names its joints differently.
That order is a contract between the two hosts, since the wire carries a positional array. The travel behind it is the opposite: each host keeps its own, and copying one machine’s numbers to the other gives an arm that tracks but with the wrong gain near the end stops.

Without a calibration

Give the travel directly, in whatever units your topics already carry.
These are the travel of a reference SO-101 in radians. Measure your own arm rather than trusting them.

Overview

Every parameter, topic and service on the bridge node.

SO-101 on LeRobot

The same arm driven through LeRobot instead, with no ROS install.

Safety

What the bridge stops, and what your driver has to stop.