Skip to content

SeeedJP/lerobot_ros2_so101

Repository files navigation

This repository is a ROS node project that enables control of the LeRobot SO-101 Leader Arm and Follower Arm with ROS2.

Environment setup

  • JetPack 6.0 (L4T 36.3 - Ubuntu 22.04 based)

Upgrade packages

sudo apt update
sudo apt upgrade
sudo reboot

Install ROS2

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

Install uv. (source)

curl -LsSf https://astral.sh/uv/install.sh | sh

Restart the shell.

Install lerobot_ros2_so101

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 lerobot_ros2_so101

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

Run leader node

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

Run RViz

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

Run follower node

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: []
}"

Appendix

Calibration

Calibrate the leader arm

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

Calibrate the follower arm

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

Calibration file

/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 ROS2 package + uv

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

Links

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published