chore: save current code
This commit is contained in:
@@ -27,8 +27,8 @@ serial:
|
|||||||
baudrate: 2000000
|
baudrate: 2000000
|
||||||
port: /dev/ttyUSB0
|
port: /dev/ttyUSB0
|
||||||
right:
|
right:
|
||||||
baudrate: 2000000
|
baudrate: null
|
||||||
port: /dev/ttyUSB0
|
port: null
|
||||||
serial_debug: false
|
serial_debug: false
|
||||||
system:
|
system:
|
||||||
can:
|
can:
|
||||||
@@ -40,9 +40,9 @@ system:
|
|||||||
motion_device: eric
|
motion_device: eric
|
||||||
motion_type: linkerforce
|
motion_type: linkerforce
|
||||||
retargeting_type: projection
|
retargeting_type: projection
|
||||||
rightpub: true
|
rightpub: false
|
||||||
robotname_l: g20
|
robotname_l: g20
|
||||||
robotname_r: l10
|
robotname_r: g20
|
||||||
sapientype: left
|
sapientype: left
|
||||||
usecan: false
|
usecan: false
|
||||||
usegui: false
|
usegui: false
|
||||||
@@ -51,6 +51,6 @@ system:
|
|||||||
useudp: true
|
useudp: true
|
||||||
useudpserver: true
|
useudpserver: true
|
||||||
udp:
|
udp:
|
||||||
ip: 0.0.0.0
|
ip: 192.168.11.88
|
||||||
port: 8888
|
port: 8888
|
||||||
serverport: 5551
|
serverport: 5551
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ commandlower_left_l20: [255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 255, None, Non
|
|||||||
commandupper_left_l20: [0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, None, None, None, None, 0, 0, 0, 0, 0]
|
commandupper_left_l20: [0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, None, None, None, None, 0, 0, 0, 0, 0]
|
||||||
commandlower_right_g20: [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, None, None, None, None, 255, 255, 255, 255, 255]
|
commandlower_right_g20: [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, None, None, None, None, 255, 255, 255, 255, 255]
|
||||||
commandupper_right_g20: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, None, None, None, None, 0, 0, 0, 0, 0]
|
commandupper_right_g20: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, None, None, None, None, 0, 0, 0, 0, 0]
|
||||||
commandlower_left_g20: [255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 255, None, None, None, None, 255, 255, 255, 255, 255]
|
commandlower_left_g20: [255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 255, None, None, None, None, 255, 255, 255, 255, 255]
|
||||||
commandupper_left_g20: [0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, None, None, None, None, 0, 0, 0, 0, 0]
|
commandupper_left_g20: [0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, None, None, None, None, 0, 0, 0, 0, 0]
|
||||||
commandlower_right_l7: [255, 255, 255, 255, 255, 255, 255, None, None, None, None, None, None, None, None, None, None, None, None, None]
|
commandlower_right_l7: [255, 255, 255, 255, 255, 255, 255, None, None, None, None, None, None, None, None, None, None, None, None, None]
|
||||||
commandupper_right_l7: [0, 0, 0, 0, 0, 0, 0, None, None, None, None, None, None, None, None, None, None, None, None, None]
|
commandupper_right_l7: [0, 0, 0, 0, 0, 0, 0, None, None, None, None, None, None, None, None, None, None, None, None, None]
|
||||||
|
|||||||
+473
@@ -0,0 +1,473 @@
|
|||||||
|
# 手指配置常量
|
||||||
|
FINGER_CONFIGS = {
|
||||||
|
# 含义解释:
|
||||||
|
# robot_idx:URDF关节序列
|
||||||
|
|
||||||
|
# 拇指旋转3个关节的加权系数,人手的0/1/2序列,对应URDF的第1关节(下标0)
|
||||||
|
'thumb_rotate': {
|
||||||
|
'name': '拇指旋转',
|
||||||
|
'joints': [1, 2],
|
||||||
|
'weights': {
|
||||||
|
'v1': [1, 0],
|
||||||
|
'v2': [1, 0]
|
||||||
|
},
|
||||||
|
'robot_idx': 0,
|
||||||
|
'type': 'thumb',
|
||||||
|
'reverse_motion': {
|
||||||
|
'v1': False,
|
||||||
|
'v2': False
|
||||||
|
},
|
||||||
|
'dynamic_weight': None,
|
||||||
|
'extended_mapping': {
|
||||||
|
'enabled': True,
|
||||||
|
'scale_factor': 1.0,
|
||||||
|
'extended_exp_factor': 1.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
# 拇指侧摆3个关节的加权系数,人手的0/1/2序列,对应URDF的第2关节(下标1)
|
||||||
|
'thumb_abduction': {
|
||||||
|
'name': '拇指侧摆',
|
||||||
|
'joints': [0, 1, 2],
|
||||||
|
'weights': {
|
||||||
|
'v1': [0, 1, 0],
|
||||||
|
'v2': [0, 1, 0]
|
||||||
|
},
|
||||||
|
'robot_idx': 1,
|
||||||
|
'type': 'thumb',
|
||||||
|
'reverse_motion': {
|
||||||
|
'v1': False,
|
||||||
|
'v2': False
|
||||||
|
},
|
||||||
|
'dynamic_weight': None,
|
||||||
|
'extended_mapping': {
|
||||||
|
'enabled': True,
|
||||||
|
'scale_factor': 1.2,
|
||||||
|
'extended_exp_factor': 1.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
# 拇指根部弯曲3个关节的加权系数,人手的2/3/4序列,对应URDF的第3关节(下标2)
|
||||||
|
'thumb_root_flexion': {
|
||||||
|
'name': '拇指根部弯曲',
|
||||||
|
'joints': [2, 3, 4],
|
||||||
|
'weights': {
|
||||||
|
'v1': [1, 0, 0],
|
||||||
|
'v2': [1, 0, 0]
|
||||||
|
},
|
||||||
|
'robot_idx': 2,
|
||||||
|
'type': 'thumb',
|
||||||
|
'reverse_motion': {
|
||||||
|
'v1': False,
|
||||||
|
'v2': False
|
||||||
|
},
|
||||||
|
'dynamic_weight': None,
|
||||||
|
# {
|
||||||
|
# 'trigger_finger': 'thumb_abduction',
|
||||||
|
# 'threshold': 0.3,
|
||||||
|
# 'low_weight_config': {
|
||||||
|
# 'joints': [2, 3, 4],
|
||||||
|
# 'weights': [1, 0, 0],
|
||||||
|
# 'reverse_motion': False
|
||||||
|
# },
|
||||||
|
# 'high_weight_config': {
|
||||||
|
# 'joints': [2, 3, 4],
|
||||||
|
# 'weights': [0.3, 0.0, 0.7],
|
||||||
|
# 'reverse_motion': False
|
||||||
|
# }
|
||||||
|
# },
|
||||||
|
'extended_mapping': {
|
||||||
|
'enabled': True,
|
||||||
|
'scale_factor': 1.2,
|
||||||
|
'extended_exp_factor': 10
|
||||||
|
}
|
||||||
|
},
|
||||||
|
# 拇指指尖弯曲3个关节的加权系数,人手的2/3/4序列,对应URDF的第4关节(下标3)
|
||||||
|
'thumb_end_flexion': {
|
||||||
|
'name': '拇指指尖弯曲',
|
||||||
|
'joints': [2, 3, 4],
|
||||||
|
'weights': {
|
||||||
|
'v1': [0, 0.0, 1],
|
||||||
|
'v2': [0, 0.0, 1]
|
||||||
|
},
|
||||||
|
'robot_idx': 3,
|
||||||
|
'type': 'thumb',
|
||||||
|
'reverse_motion': {
|
||||||
|
'v1': False,
|
||||||
|
'v2': False
|
||||||
|
},
|
||||||
|
'dynamic_weight': None,
|
||||||
|
'extended_mapping': {
|
||||||
|
'enabled': True,
|
||||||
|
'scale_factor': 1,
|
||||||
|
'extended_exp_factor': 20
|
||||||
|
}
|
||||||
|
},
|
||||||
|
# 食指ROLL旋转(侧摆)关节的加权系数,人手的5序列,对应URDF的第4关节(下标3)
|
||||||
|
'index_roll': {
|
||||||
|
'name': '食指',
|
||||||
|
'joints': [5],
|
||||||
|
'weights': {
|
||||||
|
'v1': [1],
|
||||||
|
'v2': [1]
|
||||||
|
},
|
||||||
|
'robot_idx': 5,
|
||||||
|
'type': 'finger',
|
||||||
|
'reverse_motion': {
|
||||||
|
'v1': False,
|
||||||
|
'v2': False
|
||||||
|
},
|
||||||
|
'dynamic_weight': None,
|
||||||
|
'extended_mapping': {
|
||||||
|
'enabled': False,
|
||||||
|
'scale_factor': 1.0,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
# 食指弯曲(根部弯曲)的加权系数,人身的6/7/8序列,对应URDF的第4关节(下标3)
|
||||||
|
'index_root_flexion': {
|
||||||
|
'name': '食指',
|
||||||
|
'joints': [6, 7, 8],
|
||||||
|
'weights': {
|
||||||
|
'v1': [1, 0.0, 0],
|
||||||
|
'v2': [1, 0.0, 0]
|
||||||
|
},
|
||||||
|
'robot_idx': 6,
|
||||||
|
'type': 'finger',
|
||||||
|
'reverse_motion': {
|
||||||
|
'v1': False,
|
||||||
|
'v2': False
|
||||||
|
},
|
||||||
|
'dynamic_weight': None,
|
||||||
|
'extended_mapping': {
|
||||||
|
'enabled': True,
|
||||||
|
'scale_factor': 1.2,
|
||||||
|
'extended_exp_factor': 5
|
||||||
|
}
|
||||||
|
},
|
||||||
|
# 食指弯曲(末端弯曲)的加权系数,人手的6/7/8序列,对应URDF的第4关节(下标3)
|
||||||
|
'index_end_flexion': {
|
||||||
|
'name': '食指',
|
||||||
|
'joints': [6, 7, 8],
|
||||||
|
'weights': {
|
||||||
|
'v1': [0, 0.0, 1],
|
||||||
|
'v2': [0, 0.0, 1]
|
||||||
|
},
|
||||||
|
'robot_idx': 7,
|
||||||
|
'type': 'finger',
|
||||||
|
'reverse_motion': {
|
||||||
|
'v1': False,
|
||||||
|
'v2': False
|
||||||
|
},
|
||||||
|
'dynamic_weight': None,
|
||||||
|
'extended_mapping': {
|
||||||
|
'enabled': True,
|
||||||
|
'scale_factor': 1,
|
||||||
|
'extended_exp_factor': 30
|
||||||
|
}
|
||||||
|
},
|
||||||
|
# 中指ROLL旋转(侧摆)关节的加权系数,人手的5序列,对应URDF的第4关节(下标3)
|
||||||
|
'middle_roll': {
|
||||||
|
'name': '中指',
|
||||||
|
'joints': [9],
|
||||||
|
'weights': {
|
||||||
|
'v1': [1],
|
||||||
|
'v2': [1]
|
||||||
|
},
|
||||||
|
'robot_idx': 9,
|
||||||
|
'type': 'finger',
|
||||||
|
'reverse_motion': {
|
||||||
|
'v1': False,
|
||||||
|
'v2': False
|
||||||
|
},
|
||||||
|
'dynamic_weight': None,
|
||||||
|
'extended_mapping': {
|
||||||
|
'enabled': True,
|
||||||
|
'scale_factor': 1.0,
|
||||||
|
'extended_exp_factor': 1.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
# 中指弯曲(根部弯曲)的加权系数,人手的10/11/12序列,对应URDF的第6关节(下标5)
|
||||||
|
'middle_root_flexion': {
|
||||||
|
'name': '中指',
|
||||||
|
'joints': [10, 11, 12],
|
||||||
|
'weights': {
|
||||||
|
'v1': [1, 0.0, 0],
|
||||||
|
'v2': [1, 0.0, 0]
|
||||||
|
},
|
||||||
|
'robot_idx': 10,
|
||||||
|
'type': 'finger',
|
||||||
|
'reverse_motion': {
|
||||||
|
'v1': False,
|
||||||
|
'v2': False
|
||||||
|
},
|
||||||
|
'dynamic_weight': None,
|
||||||
|
'extended_mapping': {
|
||||||
|
'enabled': True,
|
||||||
|
'scale_factor': 1.2,
|
||||||
|
'extended_exp_factor': 5
|
||||||
|
}
|
||||||
|
},
|
||||||
|
# 中指弯曲(末端弯曲)的加权系数,人手的10/11/12序列,对应URDF的第6关节(下标5)
|
||||||
|
'middle_end_flexion': {
|
||||||
|
'name': '中指',
|
||||||
|
'joints': [10, 11, 12],
|
||||||
|
'weights': {
|
||||||
|
'v1': [0, 0.0, 1],
|
||||||
|
'v2': [0, 0.0, 1]
|
||||||
|
},
|
||||||
|
'robot_idx': 11,
|
||||||
|
'type': 'finger',
|
||||||
|
'reverse_motion': {
|
||||||
|
'v1': False,
|
||||||
|
'v2': False
|
||||||
|
},
|
||||||
|
'dynamic_weight': None,
|
||||||
|
'extended_mapping': {
|
||||||
|
'enabled': True,
|
||||||
|
'scale_factor': 1,
|
||||||
|
'extended_exp_factor': 30
|
||||||
|
}
|
||||||
|
},
|
||||||
|
# 无名指ROLL旋转(侧摆)关节的加权系数,人手的5序列,对应URDF的第4关节(下标3)
|
||||||
|
'ring_roll': {
|
||||||
|
'name': '无名指',
|
||||||
|
'joints': [13],
|
||||||
|
'weights': {
|
||||||
|
'v1': [1],
|
||||||
|
'v2': [1]
|
||||||
|
},
|
||||||
|
'robot_idx': 13,
|
||||||
|
'type': 'finger',
|
||||||
|
'reverse_motion': {
|
||||||
|
'v1': False,
|
||||||
|
'v2': False
|
||||||
|
},
|
||||||
|
'dynamic_weight': None,
|
||||||
|
'extended_mapping': {
|
||||||
|
'enabled': False,
|
||||||
|
'scale_factor': 1.0,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
# 无名指弯曲(根部弯曲)的加权系数,人手的14/15/16序列,对应URDF的第8关节(下标7)
|
||||||
|
'ring_root_flexion': {
|
||||||
|
'name': '无名指',
|
||||||
|
'joints': [14, 15, 16],
|
||||||
|
'weights': {
|
||||||
|
'v1': [1, 0.0, 0],
|
||||||
|
'v2': [1, 0.0, 0]
|
||||||
|
},
|
||||||
|
'robot_idx': 14,
|
||||||
|
'type': 'finger',
|
||||||
|
'reverse_motion': {
|
||||||
|
'v1': False,
|
||||||
|
'v2': False
|
||||||
|
},
|
||||||
|
'dynamic_weight': None,
|
||||||
|
'extended_mapping': {
|
||||||
|
'enabled': True,
|
||||||
|
'scale_factor': 1.2,
|
||||||
|
'extended_exp_factor': 5
|
||||||
|
}
|
||||||
|
},
|
||||||
|
# 无名指弯曲(末端弯曲)的加权系数,人手的14/15/16序列,对应URDF的第8关节(下标7)
|
||||||
|
'ring_end_flexion': {
|
||||||
|
'name': '无名指',
|
||||||
|
'joints': [14, 15, 16],
|
||||||
|
'weights': {
|
||||||
|
'v1': [0, 0.0, 1],
|
||||||
|
'v2': [0, 0.0, 1]
|
||||||
|
},
|
||||||
|
'robot_idx': 15,
|
||||||
|
'type': 'finger',
|
||||||
|
'reverse_motion': {
|
||||||
|
'v1': False,
|
||||||
|
'v2': False
|
||||||
|
},
|
||||||
|
'dynamic_weight': None,
|
||||||
|
'extended_mapping': {
|
||||||
|
'enabled': True,
|
||||||
|
'scale_factor': 1,
|
||||||
|
'extended_exp_factor': 30
|
||||||
|
}
|
||||||
|
},
|
||||||
|
# 小指ROLL旋转(侧摆)关节的加权系数,人手的5序列,对应URDF的第4关节(下标3)
|
||||||
|
'pinky_roll': {
|
||||||
|
'name': '小指',
|
||||||
|
'joints': [17],
|
||||||
|
'weights': {
|
||||||
|
'v1': [1],
|
||||||
|
'v2': [1]
|
||||||
|
},
|
||||||
|
'robot_idx': 17,
|
||||||
|
'type': 'finger',
|
||||||
|
'reverse_motion': {
|
||||||
|
'v1': False,
|
||||||
|
'v2': False
|
||||||
|
},
|
||||||
|
'dynamic_weight': None,
|
||||||
|
'extended_mapping': {
|
||||||
|
'enabled': False,
|
||||||
|
'scale_factor': 1.0,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
# 小指弯曲(根部弯曲)的加权系数,人手的18/19/20序列,对应URDF的第10关节(下标9)
|
||||||
|
'pinky_root_flexion': {
|
||||||
|
'name': '小指',
|
||||||
|
'joints': [18, 19, 20],
|
||||||
|
'weights': {
|
||||||
|
'v1': [1, 0.0, 0],
|
||||||
|
'v2': [1, 0.0, 0]
|
||||||
|
},
|
||||||
|
'robot_idx': 18,
|
||||||
|
'type': 'finger',
|
||||||
|
'reverse_motion': {
|
||||||
|
'v1': False,
|
||||||
|
'v2': False
|
||||||
|
},
|
||||||
|
'dynamic_weight': None,
|
||||||
|
'extended_mapping': {
|
||||||
|
'enabled': True,
|
||||||
|
'scale_factor': 1.2,
|
||||||
|
'extended_exp_factor': 5
|
||||||
|
}
|
||||||
|
},
|
||||||
|
# 小指弯曲(末端弯曲)的加权系数,人手的18/19/20序列,对应URDF的第10关节(下标9)
|
||||||
|
'pinky_end_flexion': {
|
||||||
|
'name': '小指',
|
||||||
|
'joints': [18, 19, 20],
|
||||||
|
'weights': {
|
||||||
|
'v1': [0, 0.0, 1],
|
||||||
|
'v2': [0, 0.0, 1]
|
||||||
|
},
|
||||||
|
'robot_idx': 19,
|
||||||
|
'type': 'finger',
|
||||||
|
'reverse_motion': {
|
||||||
|
'v1': False,
|
||||||
|
'v2': False
|
||||||
|
},
|
||||||
|
'dynamic_weight': None,
|
||||||
|
'extended_mapping': {
|
||||||
|
'enabled': True,
|
||||||
|
'scale_factor': 1,
|
||||||
|
'extended_exp_factor': 30
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# 映射顺序
|
||||||
|
MAPPING_ORDER = [
|
||||||
|
'thumb_rotate', 'thumb_abduction', 'thumb_root_flexion', 'thumb_end_flexion',
|
||||||
|
'index_roll', 'index_root_flexion', 'index_end_flexion',
|
||||||
|
'middle_roll', 'middle_root_flexion', 'middle_end_flexion',
|
||||||
|
'ring_roll', 'ring_root_flexion','ring_end_flexion',
|
||||||
|
'pinky_roll', 'pinky_root_flexion', 'pinky_end_flexion'
|
||||||
|
]
|
||||||
|
|
||||||
|
# 三态默认配置
|
||||||
|
MULTI_SEGMENT_CONFIG = {
|
||||||
|
'states': [
|
||||||
|
'original',
|
||||||
|
'opose',
|
||||||
|
# 'fist' # 取消注释启用三段映射
|
||||||
|
],
|
||||||
|
'state_names': {
|
||||||
|
'original': '张手',
|
||||||
|
'opose': 'O手势',
|
||||||
|
# 'fist': '握拳'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MULTI_SEGMENT_CONFIG_FROZEN = tuple(MULTI_SEGMENT_CONFIG['states'])
|
||||||
|
|
||||||
|
ROBOT_ORIGINAL_LEFT = [
|
||||||
|
0.0, 0.0, 0.0, 0.0, 0.0,
|
||||||
|
0.2, 0.0, 0.0, 0.0,
|
||||||
|
0.0, 0.0, 0.0, 0.0,
|
||||||
|
-0.2, 0.0, 0.0, 0.0,
|
||||||
|
-0.2, 0.0, 0.0, 0.0
|
||||||
|
]
|
||||||
|
|
||||||
|
ROBOT_ORIGINAL_RIGHT = [
|
||||||
|
0.0, 0.0, 0.0, 0.0, 0.0,
|
||||||
|
-0.2, 0.0, 0.0, 0.0,
|
||||||
|
0.0, 0.0, 0.0, 0.0,
|
||||||
|
0.2, 0.0, 0.0, 0.0,
|
||||||
|
0.2, 0.0, 0.0, 0.0
|
||||||
|
]
|
||||||
|
|
||||||
|
ROBOT_OPOSE_LEFT = [
|
||||||
|
0.6, 1.2, 0.5, 0.6, 0.0,
|
||||||
|
0.0, 0.7, 1.08, 0.00,
|
||||||
|
0.0, 0.7, 1.08, 0.00 ,
|
||||||
|
0.0, 0.7, 1.08, 0.00,
|
||||||
|
0.0, 0.7, 1.08, 0.00
|
||||||
|
]
|
||||||
|
|
||||||
|
ROBOT_OPOSE_RIGHT = [
|
||||||
|
0.6, 1.2, 0.5, 0.6, 0.0,
|
||||||
|
0.0, 0.7, 1.08, 0.00,
|
||||||
|
0.0, 0.7, 1.08, 0.00,
|
||||||
|
0.0, 0.7, 1.08, 0.00,
|
||||||
|
0.0, 0.7, 1.08, 0.00
|
||||||
|
]
|
||||||
|
|
||||||
|
ROBOT_FIST_RIGHT = [
|
||||||
|
1.39, 1.57, 0.83, 1.25, 1.29,
|
||||||
|
0, 1.22, 1.75, 1.55,
|
||||||
|
0, 1.22, 1.75, 1.55,
|
||||||
|
0, 1.22, 1.75, 1.55,
|
||||||
|
0, 1.22, 1.75, 1.55
|
||||||
|
]
|
||||||
|
|
||||||
|
ROBOT_FIST_LEFT = [
|
||||||
|
1.39, 1.57, 0.83, 1.25, 1.29,
|
||||||
|
0, 1.22, 1.75, 1.55,
|
||||||
|
0, 1.22, 1.75, 1.55,
|
||||||
|
0, 1.22, 1.75, 1.55,
|
||||||
|
0, 1.22, 1.75, 1.55
|
||||||
|
]
|
||||||
|
|
||||||
|
# 电机输出约束配置 (20电机)
|
||||||
|
MOTOR_CONSTRAINTS = {
|
||||||
|
'left': [
|
||||||
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
|
{'min': 80, 'max': 255, 'enabled': True},
|
||||||
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
|
],
|
||||||
|
'right': [
|
||||||
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
|
{'min': 80, 'max': 255, 'enabled': True},
|
||||||
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -432,9 +432,7 @@ MOTOR_CONSTRAINTS = {
|
|||||||
{'min': 0, 'max': 255, 'enabled': False},
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
{'min': 0, 'max': 255, 'enabled': False},
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
{'min': 0, 'max': 255, 'enabled': False},
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
# Left G20 thumb abduction is enabled by hand_config.yml. Keep the
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
# physically verified command away from the mechanical end stop.
|
|
||||||
{'min': 20, 'max': 255, 'enabled': True},
|
|
||||||
{'min': 0, 'max': 255, 'enabled': False},
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
{'min': 0, 'max': 255, 'enabled': False},
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
{'min': 0, 'max': 255, 'enabled': False},
|
{'min': 0, 'max': 255, 'enabled': False},
|
||||||
|
|||||||
@@ -126,7 +126,7 @@ FINGER_CONFIGS = {
|
|||||||
'type': 'finger',
|
'type': 'finger',
|
||||||
'reverse_motion': {
|
'reverse_motion': {
|
||||||
'v1': False,
|
'v1': False,
|
||||||
'v2': True
|
'v2': False
|
||||||
},
|
},
|
||||||
'dynamic_weight': None,
|
'dynamic_weight': None,
|
||||||
'extended_mapping': {
|
'extended_mapping': {
|
||||||
|
|||||||
+1
-14
@@ -10,13 +10,6 @@ from ..config.g20_config import FINGER_CONFIGS, MAPPING_ORDER, ROBOT_OPOSE_RIGHT
|
|||||||
from typing import List
|
from typing import List
|
||||||
from linkerhand.handcoreex import DynamicWeightMultiStateLinearMapper,MultiStateLinearMapper
|
from linkerhand.handcoreex import DynamicWeightMultiStateLinearMapper,MultiStateLinearMapper
|
||||||
|
|
||||||
|
|
||||||
# The left G20 ring abduction motor runs opposite to the glove's corresponding
|
|
||||||
# roll sensor. Keep this override local to LeftHand so the pinky and right-hand
|
|
||||||
# mappings retain their native directions.
|
|
||||||
LEFT_REVERSED_SIDE_SWINGS = ('ring_roll',)
|
|
||||||
|
|
||||||
|
|
||||||
def _resolve_version_config(configs: dict, version: str) -> dict:
|
def _resolve_version_config(configs: dict, version: str) -> dict:
|
||||||
"""
|
"""
|
||||||
解析版本配置,将字典格式的 weights/reverse_motion 转换为具体值
|
解析版本配置,将字典格式的 weights/reverse_motion 转换为具体值
|
||||||
@@ -307,7 +300,6 @@ class LeftHand:
|
|||||||
|
|
||||||
finger_configs = _resolve_version_config(FINGER_CONFIGS, self.glove_version)
|
finger_configs = _resolve_version_config(FINGER_CONFIGS, self.glove_version)
|
||||||
self.multi_state_mapper = DynamicWeightMultiStateLinearMapper(finger_configs, MAPPING_ORDER, is_debug=is_debug)
|
self.multi_state_mapper = DynamicWeightMultiStateLinearMapper(finger_configs, MAPPING_ORDER, is_debug=is_debug)
|
||||||
self._apply_side_direction_overrides()
|
|
||||||
|
|
||||||
for config_name, config in FINGER_CONFIGS.items():
|
for config_name, config in FINGER_CONFIGS.items():
|
||||||
if config.get('dynamic_weight'):
|
if config.get('dynamic_weight'):
|
||||||
@@ -315,10 +307,6 @@ class LeftHand:
|
|||||||
|
|
||||||
self.motor_constraints = MOTOR_CONSTRAINTS['left']
|
self.motor_constraints = MOTOR_CONSTRAINTS['left']
|
||||||
|
|
||||||
def _apply_side_direction_overrides(self):
|
|
||||||
for finger_name in LEFT_REVERSED_SIDE_SWINGS:
|
|
||||||
self.multi_state_mapper.finger_configs[finger_name]['reverse_motion'] = True
|
|
||||||
|
|
||||||
def _apply_motor_constraints(self):
|
def _apply_motor_constraints(self):
|
||||||
for i, constraint in enumerate(self.motor_constraints):
|
for i, constraint in enumerate(self.motor_constraints):
|
||||||
if constraint.get('enabled', False):
|
if constraint.get('enabled', False):
|
||||||
@@ -347,8 +335,6 @@ class LeftHand:
|
|||||||
if version_key in config['reverse_motion']:
|
if version_key in config['reverse_motion']:
|
||||||
self.multi_state_mapper.finger_configs[finger_name]['reverse_motion'] = config['reverse_motion'][version_key]
|
self.multi_state_mapper.finger_configs[finger_name]['reverse_motion'] = config['reverse_motion'][version_key]
|
||||||
|
|
||||||
self._apply_side_direction_overrides()
|
|
||||||
|
|
||||||
def initialize_mapper(self) -> bool:
|
def initialize_mapper(self) -> bool:
|
||||||
"""
|
"""
|
||||||
初始化映射器
|
初始化映射器
|
||||||
@@ -532,3 +518,4 @@ class LeftHand:
|
|||||||
self.g_jointvelocity[i] = 255
|
self.g_jointvelocity[i] = 255
|
||||||
self.last_jointvelocity[i] = self.g_jointvelocity[i]
|
self.last_jointvelocity[i] = self.g_jointvelocity[i]
|
||||||
self.last_jointpositions[i] = self.g_jointpositions[i]
|
self.last_jointpositions[i] = self.g_jointpositions[i]
|
||||||
|
|
||||||
|
|||||||
@@ -1247,7 +1247,7 @@ class Retarget():
|
|||||||
self.node.get_logger().error("标定失败,退出程序")
|
self.node.get_logger().error("标定失败,退出程序")
|
||||||
return
|
return
|
||||||
self.calibration = -1
|
self.calibration = -1
|
||||||
self.node.create_timer(1.0/100, self.process_callback) # 100Hz
|
self.node.create_timer(1.0/30, self.process_callback) # 30Hz
|
||||||
|
|
||||||
def stop_serial_threads(self):
|
def stop_serial_threads(self):
|
||||||
"""停止串口线程,在 destroy_node 时调用"""
|
"""停止串口线程,在 destroy_node 时调用"""
|
||||||
|
|||||||
@@ -1,51 +0,0 @@
|
|||||||
from pathlib import Path
|
|
||||||
|
|
||||||
import yaml
|
|
||||||
|
|
||||||
from linkerhand_retarget.motion.linkerforce.hand.linkerforce_g20 import (
|
|
||||||
LeftHand,
|
|
||||||
RightHand,
|
|
||||||
)
|
|
||||||
from linkerhand_retarget.motion.linkerforce.config.g20_config import MOTOR_CONSTRAINTS
|
|
||||||
|
|
||||||
|
|
||||||
class _HandCoreStub:
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
def test_left_g20_thumb_side_swing_has_a_safe_command_range():
|
|
||||||
package_dir = Path(__file__).resolve().parents[2] / 'linkerhand_retarget'
|
|
||||||
config = yaml.safe_load((package_dir / 'config' / 'hand_config.yml').read_text())
|
|
||||||
|
|
||||||
assert config['commandlower_left_g20'][5] == 255
|
|
||||||
assert config['commandupper_left_g20'][5] == 0
|
|
||||||
assert MOTOR_CONSTRAINTS['left'][5] == {
|
|
||||||
'min': 20,
|
|
||||||
'max': 255,
|
|
||||||
'enabled': True,
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
def test_left_g20_reverses_only_ring_side_swing():
|
|
||||||
hand = LeftHand(_HandCoreStub())
|
|
||||||
|
|
||||||
assert hand.multi_state_mapper.finger_configs['index_roll']['reverse_motion'] is False
|
|
||||||
assert hand.multi_state_mapper.finger_configs['middle_roll']['reverse_motion'] is False
|
|
||||||
assert hand.multi_state_mapper.finger_configs['ring_roll']['reverse_motion'] is True
|
|
||||||
assert hand.multi_state_mapper.finger_configs['pinky_roll']['reverse_motion'] is False
|
|
||||||
|
|
||||||
|
|
||||||
def test_left_g20_side_direction_overrides_survive_version_change():
|
|
||||||
hand = LeftHand(_HandCoreStub())
|
|
||||||
|
|
||||||
hand.set_glove_version('1.2.12')
|
|
||||||
|
|
||||||
assert hand.multi_state_mapper.finger_configs['ring_roll']['reverse_motion'] is True
|
|
||||||
assert hand.multi_state_mapper.finger_configs['pinky_roll']['reverse_motion'] is False
|
|
||||||
|
|
||||||
|
|
||||||
def test_right_g20_side_directions_are_unchanged():
|
|
||||||
hand = RightHand(_HandCoreStub())
|
|
||||||
|
|
||||||
assert hand.multi_state_mapper.finger_configs['ring_roll']['reverse_motion'] is False
|
|
||||||
assert hand.multi_state_mapper.finger_configs['pinky_roll']['reverse_motion'] is False
|
|
||||||
Reference in New Issue
Block a user