Source code for morse.middleware.pocolibs.sensors.viam

import logging; logger = logging.getLogger("morse." + __name__)
import math
from morse.core import blenderapi
from morse.middleware import AbstractDatastream
from morse.middleware.pocolibs_datastream import poster_name, PocolibsDatastreamManager

try:
    from morse.middleware.pocolibs.viam import *
except ImportError:
    if not blenderapi.fake:
        raise

[docs]class ViamPoster(AbstractDatastream): _type_name = "ViamImageBank" _type_url = "http://trac.laas.fr/git/viam-genom/tree/viamStruct.h?h=viam-genom-1#n346"
[docs] def initialize(self): name = poster_name(self.component_name, self.kwargs) self.camera_order = [] """ Prepare the data for a viam poster """ self.cameras = [] self.pos_cam = [] # Get the names of the data for the cameras try: # Stereo unit case for camera_name in self.component_instance.camera_list: camera_instance = blenderapi.persistantstorage().componentDict[camera_name] self.add_camera(camera_name, camera_instance) except AttributeError: # Video camera case self.add_camera(self.component_name, self.component_instance) if len(self.camera_order) == 1: self.obj = Viam(name, 'mono_bank', 0, self.cameras) # This is the case for a stereo camera if len(self.camera_order) == 2: baseline = math.sqrt( math.pow(self.pos_cam[0][0] - self.pos_cam[1][0], 2) + math.pow(self.pos_cam[0][1] - self.pos_cam[1][1], 2) + math.pow(self.pos_cam[0][2] - self.pos_cam[1][2], 2)) # viam expects first the left camera, then the right camera # Check the y difference between the two cameras if self.pos_cam[0][1] < self.pos_cam[1][1]: self.cameras.reverse() self.camera_order.reverse() # Create the actual poster self.obj = Viam(name, 'stereo_bank', baseline, self.cameras) if len(self.camera_order) > 2: logger.error("ViamPoster called with more than 2 cameras")
[docs] def add_camera(self, camera_name, camera_instance): # Create an image structure for each camera image_init = { 'name': camera_name, 'width': int(camera_instance.image_width), 'height': int(camera_instance.image_height), 'focal': float(camera_instance.image_focal) } self.pos_cam.append(camera_instance.bge_object.localPosition) self.cameras.append(image_init) self.camera_order.append(camera_name)
[docs] def default(self, ci): first_cam = blenderapi.persistantstorage().componentDict[self.camera_order[0]] main_to_origin = first_cam.robot_pose pom_robot_position = ViamPos() pom_robot_position.x = main_to_origin.x pom_robot_position.y = main_to_origin.y pom_robot_position.z = main_to_origin.z pom_robot_position.yaw = main_to_origin.yaw pom_robot_position.pitch = main_to_origin.pitch pom_robot_position.roll = main_to_origin.roll # Compute the current time pom_date, t = PocolibsDatastreamManager.compute_date() ors_cameras = [] ors_images = [] # Cycle throught the cameras on the base # In normal circumstances, there will be two for stereo for camera_name in self.camera_order: camera_instance = blenderapi.persistantstorage().componentDict[camera_name] main_to_sensor = main_to_origin.transformation3d_with( camera_instance.position_3d) imX = camera_instance.image_width imY = camera_instance.image_height try: image_data = camera_instance.local_data['image'] except KeyError as detail: logger.warning("Camera image not found to read by VIAM poster.\n \ \tThe 'Class' property in the Camera component could be \ wrongly defined") # Don't create a poster if the camera is disabled if image_data is None or not camera_instance.capturing: logger.debug("Camera '%s' not capturing. Exiting viam poster" % \ camera_instance.bge_object.name) return # Fill in the structure with the image information camera_data = ViamSimuImage() camera_data.width = imX camera_data.height = imY camera_data.pom_tag = pom_date camera_data.tacq_sec = t.second camera_data.tacq_usec = t.microsecond camera_data.x = main_to_sensor.x camera_data.y = main_to_sensor.y camera_data.z = main_to_sensor.z camera_data.yaw = main_to_sensor.yaw camera_data.pitch = main_to_sensor.pitch camera_data.roll = main_to_sensor.roll camera_data.flipped = camera_instance.vertical_flip ors_cameras.append(camera_data) ors_images.append(image_data) self.obj.post(pom_robot_position, ors_cameras, ors_images)
[docs] def finalize(self): self.obj.finalize() AbstractDatastream.finalize(self)