diff --git a/lerobot/common/robots/hope_jr/hope_jr_hand.py b/lerobot/common/robots/hope_jr/hope_jr_hand.py index f2a211d5..49f6d199 100644 --- a/lerobot/common/robots/hope_jr/hope_jr_hand.py +++ b/lerobot/common/robots/hope_jr/hope_jr_hand.py @@ -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) diff --git a/lerobot/common/robots/hope_jr/joints_translation.py b/lerobot/common/robots/hope_jr/joints_translation.py index c70a928c..155d147e 100644 --- a/lerobot/common/robots/hope_jr/joints_translation.py +++ b/lerobot/common/robots/hope_jr/joints_translation.py @@ -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]: diff --git a/lerobot/common/teleoperators/homonculus/homonculus_glove.py b/lerobot/common/teleoperators/homonculus/homonculus_glove.py index cb6b3cef..6f10dc03 100644 --- a/lerobot/common/teleoperators/homonculus/homonculus_glove.py +++ b/lerobot/common/teleoperators/homonculus/homonculus_glove.py @@ -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", ]