Source code for morse.actuators.keyboard

import logging; logger = logging.getLogger("morse." + __name__)
from morse.core import blenderapi
import morse.core.actuator
from morse.helpers.components import add_data, add_property

[docs]class Keyboard(morse.core.actuator.Actuator): """ This actuator does not require a connection with external data. It simply responds to the keyboard arrows to generate movement instructions for the robot attached. When parented to a robot, the user can press the arrow keys to modify the linear and angular velocities (V, W) of the robot. :kbd:`Up` forward :kbd:`Down` backwards :kbd:`Left` turn left :kbd:`Right` turn right """ _name = "Keyboard Actuator" _short_desc="A 'fake' actuator that allows to move a robot from the keyboard." add_property('_speed', 1.0, 'Speed', 'float', "Movement speed of the parent robot, in m/s") def __init__(self, obj, parent=None): logger.info('%s initialization' % obj.name) # Call the constructor of the parent class super(self.__class__, self).__init__(obj, parent) # Choose the type of function to move the object #self._type = 'Velocity' self._type = 'Position' # Correct the speed considering the Blender clock if self._type == 'Position': self._speed = self._speed / self.frequency logger.info('Component initialized')
[docs] def default_action(self): """ Interpret keyboard presses and assign them to movement for the robot.""" keys_sensor = blenderapi.controller().sensors[0] #pressed_keys = keys_sensor.getPressedKeys() pressed_keys = keys_sensor.events # Reset movement variables vx, vy, vz = 0.0, 0.0, 0.0 rx, ry, rz = 0.0, 0.0, 0.0 for key, status in pressed_keys: logger.debug("GOT: {0}, STATUS {1}".format(key, status)) if key == blenderapi.UPARROWKEY: vx = self._speed if key == blenderapi.DOWNARROWKEY: vx = -self._speed if key == blenderapi.LEFTARROWKEY: rz = self._speed / 2.0 if key == blenderapi.RIGHTARROWKEY: rz = -self._speed / 2.0 # Get the Blender object of the parent robot parent = self.robot_parent.bge_object # Give the movement instructions directly to the parent # The second parameter specifies a "local" movement if self._type == 'Position': parent.applyMovement([vx, vy, vz], True) parent.applyRotation([rx, ry, rz], True) elif self._type == 'Velocity': parent.setLinearVelocity([vx, vy, vz], True) parent.setAngularVelocity([rx, ry, rz], True)