Source code for morse.sensors.compound

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

[docs]class CompoundSensor(morse.core.sensor.Sensor): """ This special sensor is constructed by passing a list of other sensors, and creates a new datastream from the concatenation of other sensors' `local_data`. More accurately, it streams a dictionary of `{<sensor name>: <sensor local_data>}`. Note that services exposed by original sensors *are not* exposed by the compound sensor. :noautoexample: """ _name = "Compound Sensor" _short_desc = "Special sensor that merges other sensors' outputs" # Set the values of image size from the variables # in the Blender Logic Properties add_property('sensors', [], 'sensors', "The list of sensor names to merge.") def __init__(self, obj, parent=None): """ Constructor method. The object *must* have a property listing the sensors names to merge in this compound sensor. These sensors must be children (direct or not) of the parent of the compound sensor. Receives the reference to the Blender object. The second parameter is the name of the object's parent. """ logger.info('%s initialization' % obj.name) # Call the constructor of the parent class morse.core.sensor.Sensor.__init__(self, obj, parent) if not self.sensors: logger.error("The compound sensor <%s> has no sensors list associated!" % obj.name) return self._initialized = False def _get_sensors_references(self): # Get the reference to all components component_dict = blenderapi.persistantstorage().componentDict for s in self.sensors.split(','): if s in component_dict: self.local_data[s] = component_dict[s].local_data else: logger.warning("Sensor <%s> not found while creating compound sensor <%s>!" % (s, self.name())) if self.local_data: logger.info('Compound sensor <%s> initialized with sensors %s' % (self.name(), list(self.local_data.keys()))) else: logger.error("The compound sensor <%s> found none of the expected sensors!" % self.name())
[docs] def default_action(self): """ Default action does nothing at all, since self.local_data stores references to sub sensors' local_data, so it get updated for free. """ if not self._initialized: self._get_sensors_references() self._initialized = True