Source code for morse.actuators.xy_omega
import logging; logger = logging.getLogger("morse." + __name__)
import morse.core.actuator
from morse.helpers.components import add_data, add_property
[docs]class MotionXYW(morse.core.actuator.Actuator):
"""
This actuator reads the values of forwards movement x, sidewards
movement y and angular speed w and applies them to the robot as
direct translation. This controller is supposed to be used with
robots that allow for sidewards movements.
"""
_name = 'Linear and angular speed (Vx, Vy, W) actuator'
_short_desc = 'Motion controller using linear and angular speeds'
add_data('x', 0.0, 'float',
'linear velocity in x direction (forward movement) (m/s)')
add_data('y', 0.0, 'float',
'linear velocity in y direction (sidewards movement) (m/s)')
add_data('w', 0.0, 'float', 'angular velocity (rad/s)')
add_property('_type', 'Velocity', 'ControlType', 'string',
"Kind of control, can be one of ['Velocity', 'Position']")
def __init__(self, obj, parent=None):
logger.info('%s initialization' % obj.name)
# Call the constructor of the parent class
morse.core.actuator.Actuator.__init__(self, obj, parent)
logger.info('Component initialized')
[docs] def default_action(self):
""" Apply (x, y, w) to the parent robot. """
# Reset movement variables
vx, vy, vz = 0.0, 0.0, 0.0
rx, ry, rz = 0.0, 0.0, 0.0
# Scale the speeds to the time used by Blender
try:
if self._type == 'Position':
vx = self.local_data['x'] / self.frequency
vy = self.local_data['y'] / self.frequency
rz = self.local_data['w'] / self.frequency
else:
vx = self.local_data['x']
vy = self.local_data['y']
rz = self.local_data['w']
# For the moment ignoring the division by zero
# It happens apparently when the simulation starts
except ZeroDivisionError:
pass
self.robot_parent.apply_speed(self._type, [vx, vy, vz], [rx, ry, rz])