robopal.devices.keyboard 源代码

import time
import logging

try:
    from pynput import keyboard
except ImportError:
    logging.warn("pynput is not installed. Please install it by running 'pip install pynput'")
import numpy as np
import robopal.commons.transform as T
from robopal.devices import BaseDevice


[文档] class Keyboard(BaseDevice): def __init__(self, pos_scale=0.01, rot_scale=0.01) -> None: super().__init__(pos_scale, rot_scale) self._is_ctrl_l_pressed = False self._is_shift_pressed = False self._end_pos_offset = np.array([0.0, 0.0, 0.0]) self._end_rot_offset = np.eye(3)
[文档] def start(self): self.command_introduction() listener = keyboard.Listener( on_press=self.on_press, on_release=self.on_release ) listener.start()
[文档] def command_introduction(self): logging.info("\nPress <ARROW> to move the end effector along the x/y-axis.") logging.info("Press <CTRL + ARROW> to move the end effector along the z-axis.") logging.info("Press <SHIFT + ARROW> to rotate the end effector along the x/y-axis.") logging.info("Press <CTRL + SHIFT + ARROW> to rotate the end effector along the z-axis.") logging.info("Press <CAPSLOCK> to open/close the gripper.") logging.info("Press <ALT> to switch the agent.") logging.info("Press <ESC> to exit.\n")
[文档] def on_press(self, key): try: if key == keyboard.Key.up: if self._is_ctrl_l_pressed: if self._is_shift_pressed: # ctrl + shift + up self._end_rot_offset = self._end_rot_offset.dot(T.euler_2_mat(self.rot_scale * np.array([0, 0, 1]))) else: # ctrl + up self._end_pos_offset[2] += self.pos_scale elif self._is_shift_pressed: # shift + up self._end_rot_offset = self._end_rot_offset.dot(T.euler_2_mat(self.rot_scale * np.array([0, -1, 0]))) else: # up self._end_pos_offset[0] -= self.pos_scale elif key == keyboard.Key.down: if self._is_ctrl_l_pressed: if self._is_shift_pressed: # ctrl + shift + down self._end_rot_offset = self._end_rot_offset.dot(T.euler_2_mat(self.rot_scale * np.array([0, 0, -1]))) else: # ctrl + down self._end_pos_offset[2] -= self.pos_scale elif self._is_shift_pressed: # shift + down self._end_rot_offset = self._end_rot_offset.dot(T.euler_2_mat(self.rot_scale * np.array([0, 1, 0]))) else: # down self._end_pos_offset[0] += self.pos_scale elif key == keyboard.Key.left: if self._is_shift_pressed: # shift + left self._end_rot_offset = self._end_rot_offset.dot(T.euler_2_mat(self.rot_scale * np.array([1, 0, 0]))) else: # left self._end_pos_offset[1] -= self.pos_scale elif key == keyboard.Key.right: if self._is_shift_pressed: # shift + right self._end_rot_offset = self._end_rot_offset.dot(T.euler_2_mat(self.rot_scale * np.array([-1, 0, 0]))) else: # right self._end_pos_offset[1] += self.pos_scale elif key == keyboard.Key.ctrl_l: self._is_ctrl_l_pressed = True elif key == keyboard.Key.shift: self._is_shift_pressed = True elif key == keyboard.Key.caps_lock: self._gripper_flag = not self._gripper_flag except AttributeError: pass
[文档] def on_release(self, key): try: # reset end offset self._end_pos_offset = np.zeros(3) self._end_rot_offset = np.eye(3) if key == keyboard.Key.ctrl_l: self._is_ctrl_l_pressed = False elif key == keyboard.Key.shift: self._is_shift_pressed = False elif key == keyboard.Key.esc: # Stop listener self._exit_flag = True return False elif key.char == "r": self._reset_flag = True elif key == keyboard.Key.alt: self._agent_id = 0 if self._agent_id else 1 except AttributeError: pass
[文档] def get_outputs(self): return ( np.clip(self._end_pos_offset, -0.04, 0.04), self._end_rot_offset, )