Fix glove to hand conversion

This commit is contained in:
Simon Alibert
2025-05-22 16:00:07 +02:00
parent 1742b2627b
commit ef0134dc19
3 changed files with 34 additions and 21 deletions

View File

@@ -44,32 +44,43 @@ class HopeJrHand(Robot):
port=self.config.port,
motors={
# Thumb
"thumb_cmc": Motor(1, "scs0009", MotorNormMode.RANGE_M100_100),
"thumb_mcp": Motor(2, "scs0009", MotorNormMode.RANGE_M100_100),
"thumb_pip": Motor(3, "scs0009", MotorNormMode.RANGE_M100_100),
"thumb_dip": Motor(4, "scs0009", MotorNormMode.RANGE_M100_100),
"thumb_cmc": Motor(1, "scs0009", MotorNormMode.RANGE_0_100),
"thumb_mcp": Motor(2, "scs0009", MotorNormMode.RANGE_0_100),
"thumb_pip": Motor(3, "scs0009", MotorNormMode.RANGE_0_100),
"thumb_dip": Motor(4, "scs0009", MotorNormMode.RANGE_0_100),
# Index
"index_radial_flexor": Motor(5, "scs0009", MotorNormMode.RANGE_M100_100),
"index_ulnar_flexor": Motor(6, "scs0009", MotorNormMode.RANGE_M100_100),
"index_pip_dip": Motor(7, "scs0009", MotorNormMode.RANGE_M100_100),
"index_radial_flexor": Motor(5, "scs0009", MotorNormMode.RANGE_0_100),
"index_ulnar_flexor": Motor(6, "scs0009", MotorNormMode.RANGE_0_100),
"index_pip_dip": Motor(7, "scs0009", MotorNormMode.RANGE_0_100),
# Middle
"middle_radial_flexor": Motor(8, "scs0009", MotorNormMode.RANGE_M100_100),
"middle_ulnar_flexor": Motor(9, "scs0009", MotorNormMode.RANGE_M100_100),
"middle_pip_dip": Motor(10, "scs0009", MotorNormMode.RANGE_M100_100),
"middle_radial_flexor": Motor(8, "scs0009", MotorNormMode.RANGE_0_100),
"middle_ulnar_flexor": Motor(9, "scs0009", MotorNormMode.RANGE_0_100),
"middle_pip_dip": Motor(10, "scs0009", MotorNormMode.RANGE_0_100),
# Ring
"ring_radial_flexor": Motor(11, "scs0009", MotorNormMode.RANGE_M100_100),
"ring_ulnar_flexor": Motor(12, "scs0009", MotorNormMode.RANGE_M100_100),
"ring_pip_dip": Motor(13, "scs0009", MotorNormMode.RANGE_M100_100),
"ring_radial_flexor": Motor(11, "scs0009", MotorNormMode.RANGE_0_100),
"ring_ulnar_flexor": Motor(12, "scs0009", MotorNormMode.RANGE_0_100),
"ring_pip_dip": Motor(13, "scs0009", MotorNormMode.RANGE_0_100),
# Pinky
"pinky_radial_flexor": Motor(14, "scs0009", MotorNormMode.RANGE_M100_100),
"pinky_ulnar_flexor": Motor(15, "scs0009", MotorNormMode.RANGE_M100_100),
"pinky_pip_dip": Motor(16, "scs0009", MotorNormMode.RANGE_M100_100),
"pinky_radial_flexor": Motor(14, "scs0009", MotorNormMode.RANGE_0_100),
"pinky_ulnar_flexor": Motor(15, "scs0009", MotorNormMode.RANGE_0_100),
"pinky_pip_dip": Motor(16, "scs0009", MotorNormMode.RANGE_0_100),
},
calibration=self.calibration,
protocol_version=1,
)
self.cameras = make_cameras_from_configs(config.cameras)
self.inverted_motors = [
"thumb_mcp",
"thumb_dip",
"index_ulnar_flexor",
"middle_ulnar_flexor",
"ring_ulnar_flexor",
"ring_pip_dip",
"pinky_ulnar_flexor",
"pinky_pip_dip",
]
@property
def _motors_ft(self) -> dict[str, type]:
return {f"{motor}.pos": float for motor in self.bus.motors}
@@ -118,6 +129,8 @@ class HopeJrHand(Robot):
fingers[finger] = [motor for motor in self.bus.motors if motor.startswith(finger)]
self.calibration = RangeFinderGUI(self.bus, fingers).run()
for motor in self.inverted_motors:
self.calibration[motor].drive_mode = 1
self._save_calibration()
print("Calibration saved to", self.calibration_fpath)

View File

@@ -1,15 +1,17 @@
INDEX_SPLAY = 0.1
INDEX_SPLAY = 0.2
MIDDLE_SPLAY = 0.1
RING_SPLAY = 0.1
PINKY_SPLAY = -0.1
def get_ulnar_flexion(flexion: float, abduction: float, splay: float):
return (100 - abduction) * splay + flexion * (1 - splay)
ulnar_component = max(-abduction, 0)
return ulnar_component * splay + flexion * (1 - splay)
def get_radial_flexion(flexion: float, abduction: float, splay: float):
return abduction * splay + flexion * (1 - splay)
radial_component = max(abduction, 0)
return radial_component * splay + flexion * (1 - splay)
def homonculus_glove_to_hope_jr_hand(glove_action: dict[str, float]) -> dict[str, float]:

View File

@@ -77,11 +77,9 @@ class HomonculusGlove(Teleoperator):
self.inverted_joints = [
"thumb_cmc",
"thumb_dip",
"index_dip",
"middle_mcp_abduction",
"middle_dip",
"ring_dip",
"pinky_mcp_abduction",
"pinky_dip",
]