import logging; logger = logging.getLogger("morse." + __name__)
import morse.core.robot
from morse.core.services import service
from morse.core import blenderapi
logger.setLevel(logging.DEBUG)
[docs]class MocapHumanClass(morse.core.robot.Robot):
""" Class definition for the human avatar as a robot entity
Sub class of Morse_Object.
This human is set to be controlled using data from an Xtion/Kinect sensor
"""
def __init__(self, obj, parent=None):
""" Constructor method.
Receives the reference to the Blender object.
Optionally it gets the name of the object's parent,
but that information is not currently used for a robot. """
# Call the constructor of the parent class
logger.info('%s initialization' % obj.name)
super(self.__class__,self).__init__(obj, parent)
logger.info('Component initialized')
@service
[docs] def move(self, speed, rotation):
""" Move the human.
"""
human = self.bge_object
if not human['Manipulate']:
human.applyMovement( [speed,0,0], True )
human.applyRotation( [0,0,rotation], True )
else :
scene = blenderapi.scene()
target = scene.objects['IK_Target_Empty.R']
target.applyMovement([0.0, rotation, 0.0], True)
target.applyMovement([0.0, 0.0, -speed], True)
@service
[docs] def move_head(self, pan, tilt):
""" Move the human head.
"""
human = self.bge_object
scene = blenderapi.scene()
target = scene.objects['IK_Target_Empty.Head']
if human['Manipulate']:
return
target.applyMovement([0.0, pan, 0.0], True)
target.applyMovement([0.0, 0.0, tilt], True)
@service
[docs] def grasp_(self, seq):
""" Grasp object.
"""
scene = blenderapi.scene()
hand_empty = scene.objects['Hand_Grab.R']
selected_object = hand_empty['Near_Object']
human = self.bge_object
#if human['Manipulate']:
if seq == "t":
# Check that no other object is being carried
if (human['DraggedObject'] == None or
human['DraggedObject'] == '') :
logger.debug("Hand is free, I can grab")
# If the object is draggable
if selected_object != None and selected_object != '':
# Clear the previously selected object, if any
logger.debug("Object to grab is %s" % selected_object.name)
human['DraggedObject'] = selected_object
# Remove Physic simulation
selected_object.suspendDynamics()
# Parent the selected object to the hand target
selected_object.setParent (hand_empty)
logger.debug ("OBJECT %s PARENTED TO %s" % (selected_object.name, hand_empty.name))
if seq == "f":
if (human['DraggedObject'] != None and
human['DraggedObject'] != '') :
previous_object = human["DraggedObject"]
# Restore Physics simulation
previous_object.restoreDynamics()
previous_object.setLinearVelocity([0, 0, 0])
previous_object.setAngularVelocity([0, 0, 0])
# Remove the parent
previous_object.removeParent()
# Clear the object from dragged status
human['DraggedObject'] = None
logger.debug ("JUST DROPPED OBJECT %s" % (previous_object.name))
@service
[docs] def move_hand(self, diff, tilt):
""" move the human hand (wheel). a request to use by a socket.
Done for wiimote remote control.
"""
human = self.bge_object
if human['Manipulate']:
scene = blenderapi.scene()
target = scene.objects['IK_Target_Empty.R']
target.applyMovement([diff, 0.0, 0.0], True)
@service
[docs] def toggle_manipulation(self):
""" Switch manipulation mode on and off. a request to use by a socket.
Done for wiimote remote control.
"""
human = self.bge_object
scene = blenderapi.scene()
hand_target = scene.objects['IK_Target_Empty.R']
head_target = scene.objects['IK_Target_Empty.Head']
torso = scene.objects['Torso_Reference_Empty']
if human['Manipulate']:
human['Manipulate'] = False
# Place the hand beside the body
hand_target.localPosition = [0.3, -0.3, 0.9]
# Make the head follow the body
head_target.setParent(torso)
# Put the head_target in front and above the waist
head_target.localPosition = [0.5, 0.0, 0.5]
logger.debug("Moving head_target to CENTER: %s" % head_target.localPosition)
#hand_target.localPosition = [0.0, -0.3, 0.8]
#head_target.setParent(human)
#head_target.localPosition = [1.3, 0.0, 1.7]
else:
human['Manipulate'] = True
# Place the hand in a nice position
hand_target.localPosition = [0.6, 0.0, 1.4]
# Make the head follow the hand
head_target.setParent(hand_target)
# Reset the head_target position to the same as its parent
head_target.localPosition = [0.0, 0.0, 0.0]
logger.debug("Moving head_target to HAND: %s" % head_target.localPosition)
#head_target.setParent(hand_target)
# Place the hand in a nice position
#hand_target.localPosition = [0.6, 0.0, 1.4]
# Place the head in the same place
#head_target.localPosition = [0.0, 0.0, 0.0]
@service
[docs] def switch_cameras(self):
""" Change between the main camera view in MORSE and the first person camera """
scene = blenderapi.scene()
index = blenderapi.persistantstorage().current_camera_index
next_camera = scene.cameras[index]
scene.active_camera = next_camera
logger.info("Showing view from camera: '%s'" % next_camera.name)
# Disable mouse cursor for Human camera
if next_camera.name == "Human_Camera":
blenderapi.mousepointer(visible = False)
else:
blenderapi.mousepointer(visible = True)
# Update the index for the next call
index = (index + 1) % len(scene.cameras)
blenderapi.persistantstorage().current_camera_index = index
[docs] def default_action(self):
""" Main function of this component. """
pass