LinkerHand灵巧手ROS SDK 是灵心巧手(北京)科技有限公司开发,用于L30等LinkerHand灵巧手的驱动软件和功能示例源码。可用于真机与仿真器使用。 LinkerHandROS2 SDK当前支持Ubuntu22.04 ROS humble Python3.10 及以上环境
| Name | Version | Link |
|---|---|---|
| ROS2 SDK |
-
请保持远离灵巧手活动范围,避免造成人身伤害或设备损坏。
-
执行动作前请务必进行安全评估,以防止发生碰撞。
-
请保护好灵巧手。
V3.0.1
- 硬件升级到V6版本,优化电机温度。
- 增加指尖矩阵压感功能。
- GUI控制可显示矩阵指尖压感热力图和波形图
V2.0.1
- 更新GUI控制和动作序列
V1.0.2
- 支持L30线驱版本LinkeerHand灵巧手左手和右手
- 支持手指运行速度设置
V1.0.1
- 支持L30线驱版本LinkeerHand灵巧手
- GUI控制界面
-
操作系统:Ubuntu24.04
-
ROS2版本:Jazzy
-
Python版本:V3.12
-
硬件:amd64_x86/arm64 配备 5v标准USB接口
将libcanbus用命令解压到/usr/local/lib/目录下面
tar -xvf libcanbus.tar -C /usr/local/lib/
配置环境变量: export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
libcanbus.a为静态库,libcanbus.so为共享库
libcanbus_arm 编译器为 arm-linux-gnueabihf-gcc libcanbus_arm64 编译器为 aarch64-linux-gnu-gcc libcanbus(ubuntu20) 编译器为 gcc version 9.4.0 libcanbus(ubuntu22) 编译器为 gcc version 11.3.0
编译时先加载libcanbus库,再加载libusb库(源码注释里面有编译方法)。
如果编译提示pthread相关错误,说明libcanbus.tar 自带的libusb库不匹配, 请安装libusb库 sudo apt-get install libusb-1.0-0-dev 并删掉/usr/local/lib目录下的libusb相关库文件
如果提示ludev错误,请安装libudev-dev: sudo apt-get install libudev-dev
如果编译过程中找不到cc1plus 请安装 sudo apt-get install --reinstall build-essential
注意:root用户可直接读写usbcan设备,非root用户,需要修改usbcan模块的操作权限,可百度搜索修改方法。 或者尝试将99-canfd.rules文件放到 /etc/udev/rules.d/, 然后执行
$ sudo udevadm control --reload-rules
$ sudo udevadm trigger重启系统。
硬件V5版以前早期CANFD版本请跳转至L30 CANFD
$ mkdir -p linker_hand_l30_sdk/src #创建目录
$ cd linker_hand_l30_sdk/src #进入目录
$ git clone https://github.com/linker-bot/linkerhand-l30-sdk.git #获取SDK$ cd linker_hand_l30_sdk/src/linker_hand_l30_sdk #进入目录
$ pip install -r requirements.txt #安装所需依赖
$ cd linker_hand_l30_sdk # 回到工程目录
$ colcon build --symlink-install #编译和构建ROS包- 修改src/linker_hand_l30_v6/launch/linker_hand_l30_v6.launch.py文件,按照文件内参数说明进行修改
$ cd linker_hand_l30_sdk/
$ source ./install/setup.bash
$ ros2 launch linker_hand_l30_v6 linker_hand_l30_v6.launch.py
$ [linker_hand_l30_v6-1] 2026-04-17 10:10:42 开始连接L30...
$ [linker_hand_l30_v6-1] 找到 1 个设备
$ [linker_hand_l30_v6-1] 设备通道 0 打开成功
$ [linker_hand_l30_v6-1] 使能所有关节...
$ [linker_hand_l30_v6-1] 2026-04-17 10:10:43 连接成功,Linker Hand L30 - right在CANFD编号为0设备上
$ [linker_hand_l30_v6-1] 2026-04-17 10:10:43 关节名称: ['thumb_cmc_pitch', 'thumb_ip_pitch', 'thumb_cmc_yaw', 'thumb_cmc_roll', 'ring_mcp_roll', 'ring_pip_pitch', 'ring_mcp_pitch', 'middle_mcp_pitch', 'middle_pip_pitch', 'pinky_mcp_pitch', 'pinky_pip_pitch', 'pinky_mcp_roll', 'middle_mcp_roll', 'index_mcp_roll', 'index_mcp_pitch', 'index_pip_pitch', 'wrist_pitch']
$ [linker_hand_l30_v6-1] 2026-04-17 10:10:43 设置扭矩: 2047
$ [linker_hand_l30_v6-1] 2026-04-17 10:10:43 设置扭矩: 32767
$ #显示以上信息则SDK启动成功- 启动SDK后,新开一个终端。注:由于有界面,不能使用ssh远程连接开启GUI 或者使用X11 终端
- 修改gui_control/launch/gui_control.launch.py 按照参数说明,修改左手 or 右手
$ cd linker_hand_l30_sdk
$ source ./install/setup.bash
$ ros2 launch gui_control gui_control.launch.py- 启动后自带指尖矩阵压感热力图和波形图
["拇指指根弯曲", "拇指指尖弯曲", "拇指侧摆", "拇指旋转", "无名指侧摆", "无名指指尖弯曲", "无名指指根弯曲","中指指根弯曲", "中指指尖弯曲", "小指根弯曲","小指指尖弯曲", "小指侧摆", "中指侧摆", "食指侧摆","食指指根弯曲", "食指指尖弯曲", "手腕"]
["thumb_cmc_pitch", "thumb_ip_pitch", "thumb_cmc_yaw", "thumb_cmc_roll", "ring_mcp_roll", "ring_pip_pitch", "ring_mcp_pitch", "middle_mcp_pitch", "middle_pip_pitch", "pinky_mcp_pitch", "pinky_pip_pitch", "pinky_mcp_roll", "middle_mcp_roll", "index_mcp_roll", "index_mcp_pitch", "index_pip_pitch", "wrist_pitch"]
(0, 1900), # 拇指指根弯曲 (0, 1200), # 拇指指尖弯曲 (0, 900), # 拇指侧摆 (0, 800), # 拇指旋转 (-200, 200), # 无名指侧摆 (0, 1200), # 无名指指尖弯曲 (0, 1500), # 无名指指根弯曲 (0, 1500), # 中指指根弯曲 (0, 1200), # 中指指尖弯曲 (0, 1500), # 小指根弯曲 (0, 1200), # 小指指尖弯曲 (-200, 200), # 小指侧摆 (-200, 200), # 中指侧摆 (-200, 200), # 食指侧摆 (0, 1500), # 食指指根弯曲 (0, 1200), # 食指指尖弯曲 (-1000, 1000),# 手腕俯仰
/cb_hand_setting_cmd # 设置扭矩、速度控制 /cb_{left|right}hand_control_cmd # 控制position list len 17 16手指电机+1手腕电机 /cb{left|right}hand_info # 显示温度、电流、电机故障码等数据 /cb{left|right}hand_matrix_touch # 五指指尖矩阵压感,12行6列 /cb{left|right}hand_matrix_touch_mass # 五指指尖矩阵压感和值 /cb{left|right}_hand_state # 电机状态 list len 17 16手指电机+1手腕电机
$ ros2 topic echo /cb_hand_setting_cmd -f
data: '{"setting_cmd": "set_speed", "params": {"hand_type": "right", "speed": [32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767]}}'$ ros2 topic echo /cb_right_hand_info -f
data: '{"torques": [32, 0, 28, 40, 36, 28, 36, 28, 28, 28, 28, 32, 32, 32, 0, 32, 44], "temperatures": [45, 45, 43, 46, 44, 42, 44, 42, 46, 44, 45, 48, 45, 44, 42, 44, 42], "currents": null, "stamp": {"secs": 1776678491, "nsecs": 243660021}}'$ ros2 topic echo /cb_right_hand_control_cmd --flow-style
header:
stamp:
sec: 1776678323
nanosec: 901946398
frame_id: ''
name: [thumb_cmc_pitch, thumb_ip_pitch, thumb_cmc_yaw, thumb_cmc_roll, ring_mcp_roll, ring_pip_pitch, ring_mcp_pitch, middle_mcp_pitch, middle_pip_pitch, pinky_mcp_pitch, pinky_pip_pitch, pinky_mcp_roll, middle_mcp_roll, index_mcp_roll, index_mcp_pitch, index_pip_pitch, wrist_pitch]
position: [175.0, 1.0, 187.0, 0.0, 0.0, 2.0, 0.0, 8.0, 3.0, 8.0, 12.0, -3.0, 0.0, 1.0, 11.0, 10.0, 137.0]
velocity: [32767.0, 32767.0, 32767.0, 32767.0, 32767.0, 32767.0, 32767.0, 32767.0, 32767.0, 32767.0, 32767.0, 32767.0, 32767.0, 32767.0, 32767.0, 32767.0, 32767.0]
effort: []
---$ ros2 topic echo /cb_right_hand_matrix_touch -f
data: '{"thumb_matrix": [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]], "index_matrix": [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]], "middle_matrix": [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]], "ring_matrix": [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]], "little_matrix": [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 6, 0, 0], [0, 0, 0, 1, 1, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]], "stamp": {"secs": 1776678587, "nsecs": 562649939}}'$ ros2 topic echo /cb_right_hand_matrix_touch_mass -f
data: '{"stamp": {"secs": 1776678632, "nsecs": 509134375}, "unit": "g", "thumb_mass": 0, "index_mass": 0, "middle_mass": 1, "ring_mass": 0, "little_mass": 8}'- 将两个CANFD设备插入USB上。终端查看两个设备是否存在
$ lsusb
$ Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
$ Bus 001 Device 002: ID 048d:5702 Integrated Technology Express, Inc. RGB LED Controller
$ Bus 001 Device 003: ID a8fa:8598 Com Equipment CANFD Analyser
$ Bus 001 Device 004: ID 05e3:0608 Genesys Logic, Inc. Hub
$ Bus 001 Device 005: ID 8087:0aaa Intel Corp. Bluetooth 9460/9560 Jefferson Peak (JfP)
$ Bus 001 Device 006: ID a8fa:8598 Com Equipment CANFD Analyser
$ Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
# 可以看到两个CANFD设备- 查看CANFD设备详细信息
$ lsusb -v -d a8fa:8598
Bus 001 Device 003: ID a8fa:8598 Com Equipment CANFD Analyser
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 0 [unknown]
bDeviceSubClass 0 [unknown]
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0xa8fa Com Equipment
idProduct 0x8598 CANFD Analyser
bcdDevice 3.00
iManufacturer 1 Com Equipment
iProduct 2 CANFD Analyser
iSerial 3 F0802061329D3641
......
Bus 001 Device 006: ID a8fa:8598 Com Equipment CANFD Analyser
Couldn't open device, some information will be missing
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 0 [unknown]
bDeviceSubClass 0 [unknown]
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0xa8fa Com Equipment
idProduct 0x8598 CANFD Analyser
bcdDevice 3.00
iManufacturer 1 Com Equipment
iProduct 2 CANFD Analyser
iSerial 3 F080205B34AB4B31
# 可以查看到两个CANFD的iSerial序列号- 修改99-double-canfd.rules
# 设备 1 (F0802061329D3641) 左手
SUBSYSTEM=="usb", ATTRS{idVendor}=="a8fa", ATTRS{idProduct}=="8598", ATTRS{serial}=="左手iSerial序列号", MODE="0666", GROUP="plugdev", SYMLINK+="L30_LEFT"
# 设备 2 (F080205B34AB4B31) 右手
SUBSYSTEM=="usb", ATTRS{idVendor}=="a8fa", ATTRS{idProduct}=="8598", ATTRS{serial}=="右手iSerial序列号", MODE="0666", GROUP="plugdev", SYMLINK+="L30_RIGHT"- 将99-double-canfd.rules复制到/etc/udev/rules.d/目录
$ sudo cp 99-double-canfd.rules /etc/udev/rules.d/99-double-canfd.rules
$ sudo udevadm control --reload-rules
$ sudo udevadm trigger- 查看是否配置成功
$ ls /dev
# 查看是否有L30_LEFT和L30_RIGHT- 修改src/linker_hand_l30_v6/launch/linker_hand_l30_v6_double.launch.py文件,按照文件内参数说明进行修改