Source code for morse.robots.grasping_robot
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 GraspingRobot(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.
The robot need to have a "hand_name" with a near sensor in order to
be able to use the grasp service.
"""
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'
self.bge_object['DraggedObject'] = None
logger.info('Component initialized')
[docs] @service
def grasp(self, grab, obj_name=None):
"""
Grasp near object.
:param grab: set to True to take an object and False to release it.
:param obj_name: when None, the robot will just grasp the nearest
object without any consideration for the object name.
"""
logger.debug("morse grasp request received")
grasping_robot = 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']
if grab:
logger.debug("seq t")
# Check that no other object is being carried
if (grasping_robot['DraggedObject'] is None or
grasping_robot['DraggedObject'] == '') :
logger.debug("Hand is free, I can grab")
# If name was specified
if obj_name:
near_objects = [obj for obj in near_sensor.hitObjectList
if obj.name == obj_name]
if not near_objects:
logger.warning("no object named %s in %s"%(obj_name,
str(near_sensor.hitObjectList) ))
near_object = None
else:
near_object = near_objects[0]
else:
near_object = near_sensor.hitObject
hand_empty['Near_Object'] = near_object
selected_object = hand_empty['Near_Object']
# If the object is draggable
if selected_object is not None and selected_object != '':
# Clear the previously selected object, if any
logger.debug("Object to grab is %s" % selected_object.name)
grasping_robot['DraggedObject'] = selected_object
# Remove Physic simulation
selected_object.suspendDynamics()
#Put object in the hand
selected_object.worldPosition = hand_empty.worldPosition
# 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) )
else:
if (grasping_robot['DraggedObject'] is not None and
grasping_robot['DraggedObject'] != '') :
previous_object = grasping_robot["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
grasping_robot['DraggedObject'] = None
logger.debug("JUST DROPPED OBJECT %s" % previous_object.name)
[docs] def default_action(self):
""" Main function of this component """
pass