Files
linkerhand_retarget_ros2/Readme_ZH.md
T
2026-06-30 10:42:11 +08:00

14 KiB
Raw Blame History

1. LinkerFFG手套

1.1 产品介绍

本产品的具体介绍参考,内含标定示例说明 附件1、Linker FFG(FFG01)产品说明手册

1.2 软件使用

本产品提供了Ubuntu下的ROS1和ROS2 SDK包,配合Linkerhand的ROS1 SDKROS2 SDK实现遥操作 具体使用请跳转到第四章节 遥操重定向系统

1.3 通讯协议

本产品的具体介绍参考附件2、Linker FFG(FFG01) 通讯协议


2. 遥操SDK系统

2.1 系统介绍

本系统重定向程序是基于ROS1/ROS2平台开发的,由一个节点和四个publisher的话题以及两个subscription的话题组成 Linker FFG手套通过串口协议进行数据推送到重定向程序

2.1.1 下载地址

https://github.com/linker-bot/linkerhand-ros-teleo 请联系客服获取最新SDK

2.1.2 安装遥操重定向程序

遥操重定向程序以src的形式提供,因此需要用户自行编译,才可以在多个不同的平台下使用,遥操重定向程序提供了ROS2版本,ROS1版尚在开发中

将src复制到工作空间中,然后进行编译

colcon build --symlink-install

过程中可能会存在权限不足的问题导致无法运行,使用以下代码

chmod 777 -R *

2.1.3 程序配置

该目录输入ls命令

cd src/linkerhand_retarget/linkerhand_retarget/config
ls -1

输入以上命令后正常应该进入config的目录,ls -1后即可看到以下清单

base_config.yml
body_custom_pose.yml
body_unity_pose.yml
hand_config.yml
human_hand_info.yml
linker_hand_info.yml
model_config.yml
retarget_config.yml
speed_config.yml

其中我们要唯一修改的配置文件是base_config.yml,其他配置文件均不可修改

以下是针对base_config.yml的配置内容展开进行介绍:

1. 配置机械手类型

robotname_r: l10
robotname_l: l10
  • LinkerHand_L10系列的手要配置成:l10
  • LinkerHand_L20系列的手要配置成:l20
  • LinkerHand_O7系列的手要配置成:o7
  • LinkerHand_T25系列的手要配置成:t25
  • LinkerHand_L25系列的手要配置成:l25
  • LinkerHand_L6系列的手要配置成:l6
  • LinkerHand_O6系列的手要配置成:o6

注意事项:以上均为小写,大写不会被正确识别

2. 配置数据打印

debug:
  joint_pub_debug: false
  joint_motor_debug_r: true
  joint_motor_debug_l: false
  • joint_pub_debug:设置为true可打印Topic Pub后的内容,刷新率较慢,可左右手同时显示
  • joint_motor_debug_r:设置为true可快速刷新右手的输出数据,范围在255-0,代表张开到聚拢的变化幅度
  • joint_motor_debug_l:设置为true可快速刷新左手的输出数据,范围在255-0,代表张开到聚拢的变化幅度

3. 配置数据源

motion_type: linkerforce
  • motion_type:使用LinkerFFG手套要设置为linkerforcemotion_device无需设置

2.1.4 程序启动(ROS2版)

之后执行以下代码确认本设备的USB清单,然后分别插入2个力反馈手套,再次执行命令,确认刷新出来的USB设备序号,以/dev/ttyUSB0和/dev/ttyUSB1为例

ls /dev/ttyUSB*
sudo chmod 666 /dev/ttyUSB0
sudo chmod 666 /dev/ttyUSB1

然后执行

# 启动分为两种,
# 一种带标定。第一次没标定过必须执行
ros2 run linkerhand_retarget handretarget --ros-args -p calibration := True
# 一种正常启动,默认不执行标定
ros2 run linkerhand_retarget handretarget 

注意事项: 为了客户启动方便,提供了一个启动脚本,在src同级目录下,文件名为startup_linkerforce.sh

#!/bin/bash
# LinkerForce 手套遥操作启动脚本

# 设置串口权限
sudo chmod 666 /dev/ttyUSB0
sudo chmod 666 /dev/ttyUSB1

# source ROS 工作空间(请输入正确的目录)
source ~/project/linkerhand_telop_ws/ros2/v2.8.7/install/setup.bash

# 启动程序(强制标定)
ros2 run linkerhand_retarget handretarget --ros-args -p calibration:=True

# 无标定启动
# ros2 run linkerhand_retarget handretarget 

编辑完成后即可这样启动

./startup_linkerforce.sh
# 如果遇到Tab无法识别的情况,请赋予权限
sudo chmod a+x ./startup_linkerforce.sh

2.1.5 程序启动(ROS1版)

之后执行以下代码确认本设备的USB清单,然后分别插入2个力反馈手套,再次执行命令,确认刷新出来的USB设备序号,以/dev/ttyUSB0和/dev/ttyUSB1为例

ls /dev/ttyUSB*
sudo chmod 666 /dev/ttyUSB0
sudo chmod 666 /dev/ttyUSB1

然后执行

# 启动分为两种,
# 一种带标定。第一次没标定过必须执行
rosrun ros_linkerhand_retarget handretarget.py _calibrate:=true
# 一种正常启动,默认不执行标定
rosrun ros_linkerhand_retarget handretarget.py

注意事项: 为了客户启动方便,提供了一个启动脚本,在src同级目录下,文件名为startup_linkerforce.sh

#!/bin/bash
# LinkerForce 手套遥操作启动脚本

# 设置串口权限
sudo chmod 666 /dev/ttyUSB0
sudo chmod 666 /dev/ttyUSB1

# source ROS 工作空间(请输入正确的目录)
source ~/linkerhand_telop/ros1/v2.8.6/install/setup.bash

# 启动程序(强制标定)
rosrun ros_linkerhand_retarget handretarget.py _calibrate:=true

# 无标定启动
# rosrun ros_linkerhand_retarget handretarget.py

编辑完成后即可这样启动

./startup_linkerforce.sh
# 如果遇到Tab无法识别的情况,请赋予权限
sudo chmod a+x ./startup_linkerforce.sh

2.2 Topic话题说明

SDK的工作原理是将上位机传输过来的数据经过清洗和整理后,统一通过Topic的方式进行数据分发,因此Topic是数据中转站,也是判断遥操工作是否正常的重要依据

  • ROS1命令:rostopic list
  • ROS2命令:ros2 topic list

1. ROS2命令:

ros2 topic echo /cb_left_hand_control_cmd
# 或
ros2 topic echo /cb_right_hand_control_cmd

数据说明

L25机械手(21个自由度)

关节 手指 动作 默认值
joint1 拇指 根部弯曲 255
joint2 食指 根部弯曲 255
joint3 中指 根部弯曲 255
joint4 无名指 根部弯曲 255
joint5 小指 根部弯曲 255
joint6 拇指 侧摆 255
joint7 食指 侧摆 128
joint8 中指 侧摆 128
joint9 无名指 侧摆 128
joint10 小指 侧摆 128
joint11 拇指 旋转 255
joint12 预留 - -
joint13 预留 - -
joint14 预留 - -
joint15 预留 - -
joint16 拇指 第二关节弯曲 255
joint17 食指 第二关节弯曲 255
joint18 中指 第二关节弯曲 255
joint19 无名指 第二关节弯曲 255
joint20 小指 第二关节弯曲 255
joint21 拇指 末端弯曲 255
joint22 食指 末端弯曲 255
joint23 中指 末端弯曲 255
joint24 无名指 末端弯曲 255
joint25 小指 末端弯曲 255

L20机械手(16个自由度)

关节 手指 动作 默认值
joint1 拇指 根部弯曲 255
joint2 食指 根部弯曲 255
joint3 中指 根部弯曲 255
joint4 无名指 根部弯曲 255
joint5 小指 根部弯曲 255
joint6 拇指 侧摆 255
joint7 食指 侧摆 128
joint8 中指 侧摆 128
joint9 无名指 侧摆 128
joint10 小指 侧摆 128
joint11 拇指 旋转 255
joint12 预留 - -
joint13 预留 - -
joint14 预留 - -
joint15 预留 - -
joint16 拇指 末端弯曲 255
joint17 食指 末端弯曲 255
joint18 中指 末端弯曲 255
joint19 无名指 末端弯曲 255
joint20 小指 末端弯曲 255

L10机械手(10个自由度)

关节 手指 动作 默认值
joint1 拇指 根部弯曲 255
joint2 拇指 侧摆 128
joint3 食指 根部弯曲 255
joint4 中指 根部弯曲 255
joint5 无名指 根部弯曲 255
joint6 小指 根部弯曲 255
joint7 食指 侧摆 128
joint8 无名指 侧摆 128
joint9 小指 侧摆 128
joint10 拇指 旋转 255

O7机械手(7个自由度)

关节 手指 动作 默认值
joint1 拇指 根部弯曲 255
joint2 拇指 侧摆 128
joint3 食指 根部弯曲 255
joint4 中指 根部弯曲 255
joint5 无名指 根部弯曲 255
joint6 小指 根部弯曲 255
joint7 拇指 旋转 255

O6/L6机械手(7个自由度)

关节 手指 动作 默认值
joint1 拇指 根部弯曲 255
joint2 拇指 侧摆 128
joint3 食指 根部弯曲 255
joint4 中指 根部弯曲 255
joint5 无名指 根部弯曲 255
joint6 小指 根部弯曲 255

2.3 故障自检排查

2.3.1 网络故障

遥操和控制设备都是通过网络连接的,网络异常会导致彼此设备工作不正常,首先要检查网线的连接是否正确,保证双方的ip相互ping通以及防火墙要确保对应的端口是开放的

2.3.2 话题异常

在网络正常的前提下,可以在其他网络的设备上通过命令确认话题是否存在 具体细节参考 2.2 Topic话题说明

2.4 映射参数的设置

2.4.1 原理

映射系统有3种模式

映射模式 对应英文 对应中文 适用场景
三态映射 origin-opose-fist 张手-O手势-握拳 希望能兼顾机械手最大行程,同时能满足对指的,可以满足绝大部分映射要求
双端映射 origin-fist 张手-握拳 最大限度覆盖机械手的全部行程
对指映射 origin-opose- 张手-O手势 以对指为主要目标,以抓取为目标,提高抓取的颗粒度

2.4.2 配置文件

该映射系统配置对机械手进行参数绑定,映射配置目录在

~/src/linkerhand_retarget/linkerhand_retarget/motion/linkerforce/config

目前提供的映射参数包如下

g20_config.py
l10_config.py
l20_config.py
l6_config.py
o6_config.py
o7_config.py

2.4.3 配置介绍

以下以l6_config.py为例

2.4.3.1 手指配置常量FINGER_CONFIGS

2.4.3.1.1 公共常量表

(内容省略)

2.4.3.1.2 reverse_motion属性

反转信号:默认为False

2.4.3.1.3 dynamic_weight属性

动态权重:用于区间细节表达,默认为None,本版本不启用

2.4.3.1.4 extended_mapping属性

扩展映射配置

'extended_mapping': {    # 新增扩展映射配置
    'enabled': True,
    'scale_factor': 1.2,  # 缩放因子,默认1.0
    'extended_exp_factor': 80  # 新增:延伸指数参数
}
  • enabled:仅在对指映射启用,False为不启用
  • scale_factor:缩放因子,用于快速锁定在opose的姿态位
  • extended_exp_factor:延伸参数,用于opose之后的延续动作,越小表示很难达到机械手的机械位置,利于更多的表达抓取细节,数值越大越容易快速达到驱动关节极限位置

2.4.3.2 映射顺序MAPPING_ORDER

以L6为例,表示处理的关节顺序优先级

MAPPING_ORDER = [
    'thumb_abduction', 'thumb_flexion', 
    'index', 'middle', 'ring', 'pinky'
]

2.4.3.3 状态配置STATE_CONFIG(未启用)

2.4.3.4 机械手OPOSE校准位:ROBOT_OPOSE_LEFT

以下以L6的配置为例,以下角度对应左手机械手的OPOSE位置,注意以下顺序对应URDF的序列

ROBOT_OPOSE_LEFT = [
    1.4, 0.54, 0.0, 0.38, 0.0, 0.38, 0.0, 0.38, 0.0, 0.38, 0.0
]

2.4.3.5 机械手OPOSE校准位:ROBOT_OPOSE_RIGHT

以下以L6的配置为例,以下角度对应右手机械手的OPOSE位置,注意以下顺序对应URDF的序列

ROBOT_OPOSE_RIGHT = [
    1.4, 0.54, 0.0, 0.38, 0.0, 0.38, 0.0, 0.38, 0.0, 0.38, 0.0
]

2.4.4 机械手校准

在2.4.3.4和2.4.3.5章节已经分别介绍了左右机械手OPOSE校准位,用于处理当前机械手位置和URDF之间的差异,第一次使用的时候,需要在以下代码进行改写

路径:./src/linkerhand_retarget/linkerhand_retarget/motion/linkerforce/hand

以L6机械手为例,在打开linkerforce_l6.py之后,在约计149行

if self.calibrationoriginal is not None 
and self.calibrationfistpose is not None 
and self.calibrationopose is not None:
    # for i in range(20):
    #     self.multi_state_mapper.debug_value[i] = joint_arc[i]
    # arc_value = self.multi_state_mapper.map_glove_to_robot(joint_arc)   # 注释掉
    arc_value = ROBOT_OPOSE_RIGHT          # 启用校准
    qpos[17] = self.g_jointpositions_arc[1] = arc_value[0]
    qpos[20] = self.g_jointpositions_arc[0] = arc_value[1]
    qpos[1] = self.g_jointpositions_arc[2] = arc_value[3]
    qpos[9] = self.g_jointpositions_arc[3] = arc_value[5]
    qpos[13] = self.g_jointpositions_arc[4] = arc_value[7]
    qpos[5] = self.g_jointpositions_arc[5] = arc_value[9]

改写成如上图的示例,即可启用右机械手的校准,启动后就会让机械手按照映射的角度固定在当前角度

左手对应的在360行

if self.calibrationoriginal is not None and self.calibrationfistpose is not None and self.calibrationopose is not None:
    # for i in range(20):
    #     self.multi_state_mapper.debug_value[i] = joint_arc[i]
    # arc_value = self.multi_state_mapper.map_glove_to_robot(joint_arc) # 注释掉
    # 启用校准
    arc_value = ROBOT_OPOSE_LEFT
    qpos[17] = self.g_jointpositions_arc[1] = arc_value[0]
    qpos[20] = self.g_jointpositions_arc[0] = arc_value[1]
    qpos[1] = self.g_jointpositions_arc[2] = arc_value[3]
    qpos[9] = self.g_jointpositions_arc[3] = arc_value[5]
    qpos[13] = self.g_jointpositions_arc[4] = arc_value[7]
    qpos[5] = self.g_jointpositions_arc[5] = arc_value[9]

改写成如上图的示例,即可启用右机械手的校准,启动后就会让机械手按照映射的角度固定在当前角度

当左右两手都达到期望的对指位置后,就可以恢复原状,按正常顺序使用遥操系统