"""TODO: Add docstring.""" import os import numpy as np from dora import Node from reachy2_sdk import ReachySDK def main(): """TODO: Add docstring.""" robot_ip = os.getenv("ROBOT_IP", "10.42.0.80") for _i in range(5): reachy = ReachySDK(robot_ip) if reachy.head is not None: reachy.head.turn_on() reachy.head.goto([0, 0, 0]) break fov_h = 107 fov_v = 91 resolution = [720, 960] roll, _pitch, yaw = reachy.head.get_current_positions() node = Node() for event in node: if event["type"] == "INPUT": if event["id"] == "boxes2d": boxes = event["value"].to_numpy() # [x, y, z, _rx, ry, rz] = event["value"].to_numpy() x_min = boxes[0] y_min = boxes[1] x_max = boxes[2] y_max = boxes[3] x = ( x_min + x_max ) / 2 - 10 # Deviate a bit to take into account the off centered camera y = (3 * y_min + y_max) / 4 ry = (x - resolution[1] / 2) * fov_h / 2 / resolution[1] rz = (y - resolution[0] / 2) * fov_v / 2 / resolution[0] if np.abs(yaw) > 45 and yaw * -ry > 0: reachy.head.cancel_all_goto() roll, _pitch, yaw = reachy.head.get_current_positions() reachy.head.rotate_by(pitch=0, yaw=0, roll=-roll, duration=1.5) else: reachy.head.cancel_all_goto() roll, _pitch, yaw = reachy.head.get_current_positions() reachy.head.rotate_by(pitch=rz, yaw=-ry, roll=-roll, duration=1.5) [roll, _pitch, yaw] = reachy.head.get_current_positions() if "look" in event["id"]: [x, y, z] = event["value"].to_numpy() reachy.head.cancel_all_goto() reachy.head.look_at(x, y, z, duration=0.5) if reachy.head is not None: reachy.head.turn_off() if __name__ == "__main__": main()