This repository is a ROS node project that enables control of the LeRobot SO-101 Leader Arm and Follower Arm with ROS2.
- JetPack 6.0 (L4T 36.3 - Ubuntu 22.04 based)
sudo apt update
sudo apt upgrade
sudo reboot
Install ROS2 desktop and development tools. (source)
sudo apt install software-properties-common curl
sudo add-apt-repository universe
export ROS_APT_SOURCE_VERSION=$(curl -s https://api.github.com/repos/ros-infrastructure/ros-apt-source/releases/latest | grep -F "tag_name" | awk -F\" '{print $4}')
curl -L -o /tmp/ros2-apt-source.deb "https://github.com/ros-infrastructure/ros-apt-source/releases/download/${ROS_APT_SOURCE_VERSION}/ros2-apt-source_${ROS_APT_SOURCE_VERSION}.$(. /etc/os-release && echo $VERSION_CODENAME)_all.deb"
sudo dpkg -i /tmp/ros2-apt-source.deb
sudo apt update
sudo apt upgrade
sudo apt install ros-humble-desktop
sudo apt install ros-dev-tools
Install uv. (source)
curl -LsSf https://astral.sh/uv/install.sh | sh
Restart the shell.
Create a ROS2 workspace.
mkdir -p ~/ros2_ws/src
Clone the ROS2 package into ROS2 workspace.
cd ~/ros2_ws/src
git clone https://github.com/SeeedJP/lerobot_ros2_so101.git
Install dependency packages.
cd ~/ros2_ws/src/lerobot_ros2_so101
uv sync
Build the ROS2 package.
cd ~/ros2_ws
source /opt/ros/humble/setup.bash
source ~/ros2_ws/src/lerobot_ros2_so101/.venv/bin/activate
colcon build --packages-select lerobot_ros2_so101 --symlink-install
Set permissions for /dev/ttyACM0.
sudo chmod 666 /dev/ttyACM0
Run the ROS2 leader node.
cd ~/ros2_ws
source /opt/ros/humble/setup.bash
source ./install/setup.sh
source ~/ros2_ws/src/lerobot_ros2_so101/.venv/bin/activate
ros2 run lerobot_ros2_so101 leader_node.py --ros-args -p port:=/dev/ttyACM0
Visualize SO-101 using RViz.
cd ~/Lerobot_ros2
source /opt/ros/humble/setup.bash
source ./install/setup.sh
export DISPLAY=:0.0
ros2 launch so101_follower_description display.launch.py use_gui:=false joint_states_topic:=/joint_states
Set permissions for /dev/ttyACM1.
sudo chmod 666 /dev/ttyACM1
Run the ROS2 follower node.
cd ~/ros2_ws
source /opt/ros/humble/setup.bash
source ./install/setup.sh
source ~/ros2_ws/src/lerobot_ros2_so101/.venv/bin/activate
ros2 run lerobot_ros2_so101 follower_node.py --ros-args -p port:=/dev/ttyACM1 -p joint_states:=/f_joint_states -p joint_commands:=/joint_states
Move the follower arm.
ros2 topic pub -1 /joint_states sensor_msgs/msg/JointState "{
header: {stamp: {sec: 0, nanosec: 0}, frame_id: ''},
name: ['shoulder_pan','shoulder_lift','elbow_flex','wrist_flex','wrist_roll','gripper'],
position: [-0.1,-1.8,1.5,1.2,0,0],
velocity: [],
effort: []
}"
cd ~/ros2_ws/src/lerobot_ros2_so101
uv run -- python -m lerobot.calibrate \
--teleop.id=lerobot_leader \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM0
cd ~/ros2_ws/src/lerobot_ros2_so101
uv run -- python -m lerobot.calibrate \
--robot.id=lerobot_follower \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM1
/home/jetson/.cache/huggingface/lerobot/calibration/teleoperators/so101_leader/lerobot_leader.json
{
"shoulder_pan": {
"id": 1,
"drive_mode": 0,
"homing_offset": -1206,
"range_min": 1720,
"range_max": 2418
},
"shoulder_lift": {
"id": 2,
"drive_mode": 0,
"homing_offset": 987,
"range_min": 1706,
"range_max": 2392
},
"elbow_flex": {
"id": 3,
"drive_mode": 0,
"homing_offset": 1722,
"range_min": 1753,
"range_max": 2437
},
"wrist_flex": {
"id": 4,
"drive_mode": 0,
"homing_offset": 752,
"range_min": 1755,
"range_max": 2463
},
"wrist_roll": {
"id": 5,
"drive_mode": 0,
"homing_offset": 1960,
"range_min": 1780,
"range_max": 2377
},
"gripper": {
"id": 6,
"drive_mode": 0,
"homing_offset": 378,
"range_min": 1713,
"range_max": 2383
}
}
Create a ROS2 workspace.
mkdir -p ~/ros2_ws/src
Create a ROS2 package.
source /opt/ros/humble/setup.bash
ros2 pkg create lerobot_ros2_so101 --license MIT
Add uv to the ROS package.
cd ~/ros2_ws/src/lerobot_ros2_so101
uv init . --lib --python-preference only-system
uv venv --system-site-packages
Add dependency packages.
uv add 'lerobot[feetech]'
uv sync
Edit files.
mkdir ~/ros2_ws/src/lerobot_ros2_so101/scripts
vi ~/ros2_ws/src/lerobot_ros2_so101/scripts/leader_node.py
chmod +x ~/ros2_ws/src/lerobot_ros2_so101/scripts/leader_node.py
vi ~/ros2_ws/src/lerobot_ros2_so101/src/lerobot_ros2_so101/__init__.py
vi ~/ros2_ws/src/lerobot_ros2_so101/CMakeLists.txt


