The LinkerHand Dexterous Hand ROS SDK is developed by LinkerHand (Beijing) Technology Co., Ltd. It provides driver software and functional example source code for LinkerHand dexterous hands such as the L7, O7, L10, and O10 models, supporting both physical devices and simulators.
The LinkerHand ROS2 SDK currently supports Ubuntu 22.04, ROS Humble, and Python 3.10 or higher environments.
Ensure the system environment meets the requirements: Ubuntu 20.04, ROS 2 Foxy, and Python 3.8.20 or higher.
- Download
$ mkdir -p linker_hand_ros2_sdk/src
$ cd linker_hand_ros2_sdk/src
$ git clone https://github.com/linkerbotai/linker_hand_ros2_sdk.git
- Build
$ sudo apt install python3-can
$ cd linker_hand_ros2_sdk/src/
$ pip install -r requirements.txt
Before use, modify the setting.yaml configuration file according to your needs.
- Modify the password in
setting.yaml
. The default password is"12345678"
, which corresponds to the Ubuntu system password for automatically enabling the CAN port in the SDK.
Before use, configure the linker_hand.launch.py file according to the actual dexterous hand parameters.
- Launch the SDK
Connect the LinkerHand dexterous hand's USB-to-CAN device to the Ubuntu machine (supported models: L7, L10, L20, L21, L25).
# Enable the CAN port
$ sudo /usr/sbin/ip link set can0 up type can bitrate 1000000 # The USB-to-CAN device's blue LED will stay lit
$ cd linker_hand_ros2_sdk/
$ colcon build --symlink-install
$ source ./install/setup.bash
$ ros2 launch linker_hand_ros2_sdk linker_hand.launch.py
$ [linker_hand_sdk-1] 2025-06-24 17:21:14 Current SDK version: 2.1.4
$ [linker_hand_sdk-1] 2025-06-24 17:21:14 left L10 set speed to [200, 250, 250, 250, 250, 250, 250, 250, 250, 250]
$ [linker_hand_sdk-1] 2025-06-24 17:21:14 left L10 set maximum torque to [200, 200, 200, 200, 200]
Before use, configure the linker_hand.launch.py file according to the actual dexterous hand parameters.
- Launch the SDK
Connect the LinkerHand dexterous hand's USB-to-CAN device to the Windows machine (supported models: L7, L10, L20, L21, L25).
Note: Ensure the USB-to-CAN driver is installed before use.
$ mkdir -p linker_hand_ros2_sdk/src
$ cd linker_hand_ros2_sdk/src
$ git clone https://github.com/linkerbotai/linker_hand_ros2_sdk.git
$ cd linker_hand_ros2_sdk/
$ set PYTHONUTF8=1 # Set environment variable to UTF-8 encoding
$ colcon build --symlink-install
$ call ./install/local_setup.bat
$ ros2 launch linker_hand_ros2_sdk linker_hand.launch.py # Modify the CAN port name in the launch file first
$ [linker_hand_sdk-1] 2025-06-24 17:21:14 Current SDK version: 2.1.4
$ [linker_hand_sdk-1] 2025-06-24 17:21:14 left L10 set speed to [200, 250, 250, 250, 250, 250, 250, 250, 250, 250]
$ [linker_hand_sdk-1] 2025-06-24 17:21:14 left L10 set maximum torque to [200, 200, 200, 200, 200]
- Position-to-Finger Joint Mapping
$ ros2 topic echo /cb_left_hand_control_cmd
header:
seq: 256
stamp:
secs: 1744343699
nsecs: 232647418
frame_id: ''
name: []
position: [155.0, 162.0, 176.0, 125.0, 255.0, 255.0, 180.0, 179.0, 181.0, 68.0]
velocity: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
effort: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
L7: ["Thumb flexion", "Thumb abduction", "Index flexion", "Middle flexion", "Ring flexion", "Little flexion", "Thumb rotation"]
L10: ["Thumb base", "Thumb abduction", "Index base", "Middle base", "Ring base", "Little base", "Index abduction", "Ring abduction", "Little abduction", "Thumb rotation"]
L20: ["Thumb base", "Index base", "Middle base", "Ring base", "Little base", "Thumb abduction", "Index abduction", "Middle abduction", "Ring abduction", "Little abduction", "Thumb opposition", "Reserved", "Reserved", "Reserved", "Reserved", "Thumb tip", "Index tip", "Middle tip", "Ring tip", "Little tip"]
L21: ["Thumb base", "Index base", "Middle base", "Ring base", "Little base", "Thumb abduction", "Index abduction", "Middle abduction", "Ring abduction", "Little abduction", "Thumb roll", "Reserved", "Reserved", "Reserved", "Reserved", "Thumb middle", "Reserved", "Reserved", "Reserved", "Reserved", "Thumb tip", "Index tip", "Middle tip", "Ring tip", "Little tip"]
L25: ["Thumb base", "Index base", "Middle base", "Ring base", "Little base", "Thumb abduction", "Index abduction", "Middle abduction", "Ring abduction", "Little abduction", "Thumb roll", "Reserved", "Reserved", "Reserved", "Reserved", "Thumb middle", "Index middle", "Middle middle", "Ring middle", "Little middle", "Thumb tip", "Index tip", "Middle tip", "Ring tip", "Little tip"]
-
-
- Fix occasional frame collision issues
-
-
- Fixed known issues.
-
- Moved Mujoco and PyBullet simulation to a separate repository to reduce SDK size.
-
-
- Added support for dual CAN control of two dexterous hands.
-
- Added Mujoco simulation.
-
- Added PyBullet simulation.
-
-
-
- Added support for L20/L25 dexterous hands.
-
-
-
- Added support for L10/O10 dexterous hands.
-
- Added GUI control for L10/O10 dexterous hands.
-
- Added support for pressure sensor visualization in LinkerHand.
-
-
-
- Added support for L7/O7 dexterous hands.
-
- Added GUI control for L7/O7 dexterous hands.
-
Before use, modify the setting.yaml configuration file according to your needs.
- gui_control (Graphical Interface Control)
The graphical interface allows controlling individual joints of LinkerHand dexterous hands (L10, L20) via sliders. It also supports saving the current joint states by recording slider values and replaying actions using functional buttons.
To control the LinkerHand dexterous hand via gui_control
:
The GUI requires the linker_hand_sdk_ros
to be running, as it communicates with the hand via ROS topics.
Before use, configure the gui_control.launch.py file according to the actual dexterous hand parameters.
# Open a new terminal
$ cd linker_hand_ros2_sdk/
$ source ./install/setup.bash
$ ros2 launch gui_control gui_control.launch.py
The UI will open, allowing joint control via sliders.
Before use, configure the gui_control.launch.py file according to the actual dexterous hand parameters.
# Open a new terminal
$ cd linker_hand_ros2_sdk/
$ call ./install/setup.bash
$ ros2 launch gui_control gui_control.launch.py