"""TODO: Add docstring.""" import os import time import numpy as np from dora import Node from reachy_sdk import ReachySDK from reachy_sdk.trajectory import goto def r_arm_inverse_kinematics(reachy, pose, action) -> list: """TODO: Add docstring.""" a = np.array( [ [0, 0, -1, pose[0] + action[0]], [0, 1, 0, pose[1] + action[1]], [1, 0, 0, pose[2] + action[2]], [0, 0, 0, 1], ], ) return reachy.r_arm.inverse_kinematics(a) def happy_antennas(reachy): """TODO: Add docstring.""" reachy.head.l_antenna.speed_limit = 480.0 reachy.head.r_antenna.speed_limit = 480.0 for _ in range(1): reachy.head.l_antenna.goal_position = 10.0 reachy.head.r_antenna.goal_position = -10.0 time.sleep(0.1) reachy.head.l_antenna.goal_position = -10.0 reachy.head.r_antenna.goal_position = 10.0 time.sleep(0.1) reachy.head.l_antenna.goal_position = 0.0 reachy.head.r_antenna.goal_position = 0.0 def sad_antennas(reachy): """TODO: Add docstring.""" reachy.head.l_antenna.speed_limit = 360.0 reachy.head.r_antenna.speed_limit = 360.0 reachy.head.l_antenna.goal_position = 140.0 reachy.head.r_antenna.goal_position = -140.0 def main(): """TODO: Add docstring.""" node = Node() robot_ip = os.getenv("ROBOT_IP", "10.42.0.24") reachy = ReachySDK(robot_ip, with_mobile_base=False) reachy.turn_on("r_arm") reachy.turn_on("head") r_arm_pose = [0.2, -0.46, -0.42] head_pose = [ reachy.head.neck_roll.present_position, reachy.head.neck_yaw.present_position, reachy.head.neck_pitch.present_position, ] default_pose = r_arm_inverse_kinematics(reachy, r_arm_pose, [0, 0, 0]) goto( {joint: pos for joint, pos in zip(reachy.r_arm.joints.values(), default_pose, strict=False)}, duration=3, ) for event in node: if event["type"] != "INPUT": continue if event["id"] == "r_arm_action": action = event["value"].to_pylist() joint_pose = r_arm_inverse_kinematics(reachy, r_arm_pose, action) goto( { joint: pos for joint, pos in zip(reachy.r_arm.joints.values(), joint_pose, strict=False) }, duration=0.200, ) r_arm_pose = np.array(r_arm_pose) + np.array(action) elif event["id"] == "head_action": action = event["value"].to_pylist() for i in range(5): head_pose = np.array(head_pose) + np.array(action) / 5 reachy.head.neck_roll.goal_position = head_pose[0] reachy.head.neck_yaw.goal_position = head_pose[1] reachy.head.neck_pitch.goal_position = head_pose[2] time.sleep(0.03) elif event["id"] == "antenna_action": text = event["value"].to_pylist()[0] if text == "smile": happy_antennas(reachy) elif text == "cry": sad_antennas(reachy) elif event["id"] == "gripper_action": action = event["value"].to_pylist()[0] step = (action - reachy.joints.r_gripper.present_position) / 10 goal = reachy.joints.r_gripper.present_position for i in range(10): goal += step goal = np.clip(goal, -100, 100) reachy.joints.r_gripper.goal_position = goal time.sleep(0.02) # When opening the gripper always go to default pose if action == -100: goto( { joint: pos for joint, pos in zip( reachy.r_arm.joints.values(), default_pose, strict=False, ) }, duration=3, ) r_arm_pose = [0.2, -0.46, -0.42] reachy.turn_off_smoothly("r_arm") reachy.turn_off_smoothly("head")