Source code for morse.robots.pr2

import logging; logger = logging.getLogger("morse." + __name__)
from morse.robots.grasping_robot import GraspingRobot
from morse.core.services import service
from morse.core import blenderapi

[docs]class PR2(GraspingRobot): """ The MORSE model of the Willow Garage's PR2 robot. The PR2 uses the :doc:`armature_actuator <../actuators/armature>` for control of the armatures. Model Info ---------- The model is imported from a Collada file that is generated from the `PR2 URDF file <http://www.ros.org/wiki/pr2_description>`_. The .dae file can be found at: ``$MORSE_ROOT/data/robots/pr2/pr2.dae`` The imported .blend file can be found at: ``$MORSE_ROOT/data/robots/pr2/pr2_25_original.blend`` The URDF to Collada converter changed all the object names, so these were remapped to the original URDF names. A renamed version of the PR2 model can be found at: ``$MORSE_ROOT/data/robots/pr2/pr2_25_rename.blend`` , this file includes the script that is used to rename all the objects. A model with MORSE integration for the armature can be found at (**This is the model that you probably want to use in MORSE**): ``$MORSE_ROOT/data/robots/pr2/pr2_25_morse.blend``. TODO ---- - Create sensors and actuators to control the PR2 armature. `A SensorActuator class would be handy for this <https://sympa.laas.fr/sympa/arc/morse-users/2011-07/msg00099.html>`_. - Expand the armature to include the hands. - Add an actuator to control the movement of the PR2 base. - ROS integration. - ... """ _name = 'PR2 robot' def __init__(self, obj, parent=None): """ Constructor method. Receives the reference to the Blender object. """ logger.info('%s initialization' % obj.name) # Call the constructor of the parent class GraspingRobot.__init__(self, obj, parent) """ We define here the name of the pr2 grasping hand: """ self.hand_name = 'Hand.Grasp.PR2' self.armatures = [] # Search armatures and torso in all objects parented to the pr2 empty for obj in self.bge_object.childrenRecursive: # Check if obj is an armature if type(obj).__name__ == 'BL_ArmatureObject': self.armatures.append(obj.name) if obj.name == 'torso_lift_joint': self.torso = obj # constant that holds the original height of the torso from the ground # These values come from the pr2 urdf file self.TORSO_BASE_HEIGHT = (0.739675 + 0.051) self.TORSO_LOWER = 0.0 # lower limit on the torso z-translantion self.TORSO_UPPER = 0.31 # upper limit on the torso z-translation logger.info('Component initialized') @service
[docs] def get_armatures(self): """ Returns a list of all the armatures on the PR2 robot. """ return self.armatures
@service
[docs] def set_torso(self, height): """ MORSE Service that sets the z-translation of the torso to original_z + height. """ if self.TORSO_LOWER < height < self.TORSO_UPPER: self.torso.localPosition = [-0.05, 0, self.TORSO_BASE_HEIGHT + height] return "New torso z position: " + str(self.torso.localPosition[2]) else: return "Not a valid height, value has to be between 0.0 and 0.31!"
@service
[docs] def get_torso(self): """ Returns the z-translation of the torso. """ return self.torso.localPosition[2] - self.TORSO_BASE_HEIGHT
@service
[docs] def get_torso_minmax(self): """ Returns the minimum an maximum z-translation that the torso can make from the base. Returns a list [min,max] """ return [self.TORSO_LOWER, self.TORSO_UPPER]
[docs] def default_action(self): """ Main function of this component. """ pass