Hope Jr is a dexterous manipulation system consisting of modular arm and hand components. The system uses Feetech servos and supports independent control of arms and hands for complex manipulation tasks.
from lerobot.robots.hope_jr import HopeJrHandConfig# Right handright_hand_config = HopeJrHandConfig( robot_type="hope_jr_hand", id="hope_hand_right", port="/dev/ttyUSB1", side="right", # Must be "left" or "right" disable_torque_on_disconnect=True)# Left handleft_hand_config = HopeJrHandConfig( robot_type="hope_jr_hand", id="hope_hand_left", port="/dev/ttyUSB2", side="left", disable_torque_on_disconnect=True)
from lerobot.robots.hope_jr import HopeJrHand, HopeJrHandConfigconfig = HopeJrHandConfig( robot_type="hope_jr_hand", id="hope_hand_right", port="/dev/ttyUSB1", side="right")with HopeJrHand(config) as hand: # Get current hand state obs = hand.get_observation() print(f"Hand positions: {obs}") # Send hand action action = { # Finger joint positions # Structure depends on hand configuration } hand.send_action(action)
arm = HopeJrArm(arm_config)arm.connect(calibrate=True)# Follow the calibration prompts for the arm# Calibration saved to: ~/.cache/lerobot/calibration/robots/hope_jr_arm/{id}.json
hand = HopeJrHand(hand_config)hand.connect(calibrate=True)# Follow the calibration prompts for the hand# Calibration saved separately per side and ID# ~/.cache/lerobot/calibration/robots/hope_jr_hand/{id}.json
Left and right hands should be calibrated separately with different IDs to maintain distinct calibration profiles.
import timedef pick_and_place(arm, hand, target_pos, grasp_config): # 1. Open hand hand.send_action(open_hand_config) time.sleep(0.5) # 2. Move arm to target arm.send_action(target_pos) time.sleep(1.0) # 3. Close hand around object hand.send_action(grasp_config) time.sleep(0.5) # 4. Lift arm.send_action(lift_pos)
from lerobot.robots.hope_jr import HopeJrHand, HopeJrHandConfig# Leader hand (human controls)leader_config = HopeJrHandConfig( robot_type="hope_jr_hand", id="leader_hand", port="/dev/ttyUSB0", side="right")# Follower hand (mirrors leader)follower_config = HopeJrHandConfig( robot_type="hope_jr_hand", id="follower_hand", port="/dev/ttyUSB1", side="right")with HopeJrHand(leader_config) as leader, \ HopeJrHand(follower_config) as follower: while True: # Read leader state obs = leader.get_observation() # Mirror to follower action = {k: v for k, v in obs.items() if k.endswith(".pos")} follower.send_action(action)
# Error: ValueError if side is not "left" or "right"# Fix: Use correct side valueconfig = HopeJrHandConfig( port="/dev/ttyUSB1", side="right" # Must be exactly "left" or "right")
arm_config = HopeJrArmConfig(port="/dev/ttyUSB0") # Armhand_config = HopeJrHandConfig(port="/dev/ttyUSB1", side="right") # Hand# Don't use the same port for both!