Source code for morse.middleware.pocolibs.actuators.niut

import logging

logger = logging.getLogger("morse." + __name__)
from morse.middleware.pocolibs_datastream import PocolibsDataStreamInput
from niut.struct import *
from morse.core import mathutils

# Define a transformation matrix for the position of the Kinect/Xtion sensor
transformation_matrix = mathutils.Matrix()


[docs]class NiutPoster(PocolibsDataStreamInput): _type_name = "NIUT_HUMAN_LIST" _type_url = "http://trac.laas.fr/git/niut-genom/tree/niutStruct.h#n82"
[docs] def initialize(self): PocolibsDataStreamInput.initialize(self, NIUT_HUMAN_LIST) self.couples = \ [('head_position', NIUT_HEAD), ('neck_position', NIUT_NECK), ('torso_position', NIUT_TORSO), ('left_hand_position', NIUT_LEFT_HAND), ('right_hand_position', NIUT_RIGHT_HAND), ('left_elbow_position', NIUT_LEFT_ELBOW), ('right_elbow_position', NIUT_RIGHT_ELBOW), ('left_shoulder_position', NIUT_LEFT_SHOULDER), ('right_shoulder_position', NIUT_RIGHT_SHOULDER), ('left_hip_position', NIUT_LEFT_HIP), ('right_hip_position', NIUT_RIGHT_HIP), ('left_knee_position', NIUT_LEFT_KNEE), ('right_knee_position', NIUT_RIGHT_KNEE), ('left_foot_position', NIUT_LEFT_FOOT), ('right_foot_position', NIUT_RIGHT_FOOT)] _create_transform_matrix()
def _store_joint_position(self, joints, ik_target, joint_index): joint_position = joints[joint_index].position # Convert the GEN_POINT_3D into a Blender vector position_vector = mathutils.Vector([joint_position.x, joint_position.y, joint_position.z]) if transformation_matrix: #logger.error("Kinect position: [%.4f, %.4f, %.4f]" % (transformation_matrix[0][3], transformation_matrix[1][3], transformation_matrix[2][3])) new_position = position_vector * transformation_matrix new_position = new_position + mathutils.Vector( [transformation_matrix[0][3], transformation_matrix[1][3], transformation_matrix[2][3]]) else: new_position = position_vector self.data[ik_target] = new_position
[docs] def default(self, ci=''): human_list = self.read() if human_list: for i in range(0, 16): if human_list.users[i].state == NIUT_TRACKING: joints = human_list.users[i].skeleton.joint for target, idx in self.couples: self._store_joint_position(joints, target, idx) return True return False
def _create_transform_matrix(): """ Construct the transformation matrix from the Kinect to the Blender frame of reference """ global transformation_matrix # Y X Z Y # | / | / # KinCam |/ ____ Z , World |/_____X # Transformation of the Kinect frame of reference to that of Blender kinect_matrix = mathutils.Matrix(( [0.0, 1.0, 0.0, 0.0], [0.0, 0.0, 1.0, 0.0], [1.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 1.0])) # Additional rotation of the physical sensor, with respect to the Blender world # Currently set to 25.5 degrees around the Y axis kinect_rotation = mathutils.Matrix(( [1.0, 0.0, -0.445, 0.0], [0.0, 1.0, 0.0, 0.0], [0.445, 0.0, 1.0, 0.0], [0.0, 0.0, 0.0, 1.0])) # Spin the positions around the Z axis, to match with the Blender human rotation_matrix = mathutils.Matrix(( [-1.0, 0.0, 0.0, 0.0], [0.0, -1.0, 0.0, 0.0], [0.0, 0.0, 1.0, 0.0], [0.0, 0.0, 0.0, 1.0])) # Position of the kinect with respect to the human. # XXX: Make this adjustable from the real position in the scene kinect_position = [2.0, 0.0, 2.0] #logger.error("Kinect position: [%.4f, %.4f, %.4f]" % (kinect_position[0], kinect_position[1], kinect_position[2])) transformation_matrix = kinect_matrix * kinect_rotation * rotation_matrix # Add the position of the Kinect sensor transformation_matrix[0][3] = kinect_position[0] transformation_matrix[1][3] = kinect_position[1] transformation_matrix[2][3] = kinect_position[2]