Source code for morse.robots.grasper
import logging; logger = logging.getLogger("morse." + __name__)
from morse.core.robot import Robot
from morse.core.services import service
from morse.core import blenderapi
[docs]class RobotGrasper(Robot):
""" Class definition for a "virtual" robot.
This robot class does not have a graphical representation,
and it can not move.
Its only purpose is to define the service grasp that may be
used by other robot to pick up object.
Sub class of Morse_Object. """
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)
Robot.__init__(self, obj, parent)
self.hand_name = 'todefine'
logger.info('Component initialized')
@service
[docs] def grasp_(self, seq):
"""
Grasp object
"""
logger.debug("morse grasp request received")
robot_grasper = self.bge_object
scene = blenderapi.scene()
if self.hand_name == "todefine":
logger.error("grasp failed because hand_name was not defined")
hand_empty = scene.objects[self.hand_name]
near_sensor = hand_empty.sensors['Near']
near_object = near_sensor.hitObject
hand_empty['Near_Object'] = near_object
selected_object = hand_empty['Near_Object']
if seq == "t":
logger.debug("seq t")
# Check that no other object is being carried
if (robot_grasper['DraggedObject'] == None or
robot_grasper['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)
robot_grasper['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 (robot_grasper['DraggedObject'] != None and
robot_grasper['DraggedObject'] != '') :
previous_object = robot_grasper["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
robot_grasper['DraggedObject'] = None
logger.debug ("JUST DROPPED OBJECT %s" % (previous_object.name))
[docs] def default_action(self):
"""
Main function of this component
"""
pass