Beispiel #1
0
 def create_box(env, name, transform, dims, color=[0, 0, 1]):
     infobox = OpenRAVEBody.create_body_info(dims, color, 0, True)
     box = RaveCreateKinBody(env, '')
     box.InitFromGeometries([infobox])
     box.SetName(name)
     box.SetTransform(transform)
     return box
def centered_box_body(env, dx, dy, dz, name=None, color=None, transparency=None):
  body = RaveCreateKinBody(env, '')
  body.InitFromBoxes(np.array([[0, 0, 0, .5*dx, .5*dy, .5*dz]]), draw=True)
  if name is not None: set_name(body, name)
  if color is not None: set_color(body, color)
  if transparency is not None: set_transparency(body, transparency)
  return body
Beispiel #3
0
 def _add_box(self, geom):
     infobox = OpenRAVEBody.create_body_info(KinBody.Link.GeomType.Box,
                                             geom.dim, [0.5, 0.2, 0.1])
     self.env_body = RaveCreateKinBody(self._env, '')
     self.env_body.InitFromGeometries([infobox])
     self.env_body.SetName(self.name)
     self._env.Add(self.env_body)
Beispiel #4
0
 def create_cylinder(env, body_name, t, dims, color=[0, 1, 1]):
     infocylinder = OpenRAVEBody.create_body_info(GeometryType.Cylinder,
                                                  dims, color)
     if type(env) != Environment:
         import ipdb
         ipdb.set_trace()
     cylinder = RaveCreateKinBody(env, '')
     cylinder.InitFromGeometries([infocylinder])
     cylinder.SetName(body_name)
     cylinder.SetTransform(t)
     return cylinder
def draw_obj_at_conf(conf, transparency, name, obj, env, color=None):
    before = get_body_xytheta(obj)
    newobj = RaveCreateKinBody(env, '')
    newobj.Clone(obj, 0)
    newobj.SetName(name)
    env.Add(newobj, True)
    set_obj_xytheta(conf, newobj)
    newobj.Enable(False)
    if color is not None:
        set_color(newobj, color)
    set_body_transparency(newobj, transparency)
Beispiel #6
0
    def __enter__(self):
        if self.baked_kinbody is not None:
            raise PrPyException(
                'Another baked KinBody is available. Did you call __enter__'
                ' twice or forget to call __exit__?')

        try:
            kb_type = self.checker.SendCommand('BakeGetType')
        except openrave_exception:
            raise PrPyException('Collision checker does not support baking')

        # TODO: How should we handle exceptions that are thrown below?
        self.collision_saver.__enter__()

        # This "bakes" the following Env and Self checks.
        # (after the bake, the composite check is stored in self.baked_kinbody)
        self.checker.SendCommand('BakeBegin')

        self.env.CheckCollision(self.robot)
        self.robot.CheckSelfCollision()

        self.baked_kinbody = RaveCreateKinBody(self.env, kb_type)
        if self.baked_kinbody is None:
            raise PrPyException('Failed to create baked KinBody.')

        self.checker.SendCommand('BakeEnd')

        return self
Beispiel #7
0
def draw_robot_at_conf(conf, transparency, name, robot, env, color=None):
    held_obj = robot.GetGrabbed()
    before = get_body_xytheta(robot)
    newrobot = RaveCreateRobot(env, '')
    newrobot.Clone(robot, 0)
    newrobot.SetName(name)
    env.Add(newrobot, True)
    set_active_config(conf, newrobot)
    newrobot.Enable(False)
    if color is not None:
        set_color(newrobot, color)
    print get_body_xytheta(robot)

    if len(held_obj) > 0:
        print get_body_xytheta(held_obj[0])
        set_robot_config(conf)
        held_obj = robot.GetGrabbed()[0]
        held_obj_trans = held_obj.GetTransform()
        release_obj()
        new_obj = RaveCreateKinBody(env, '')
        new_obj.Clone(held_obj, 0)
        new_obj.SetName(name + '_obj')
        env.Add(new_obj, True)
        new_obj.SetTransform(held_obj_trans)
        for link in new_obj.GetLinks():
            for geom in link.GetGeometries():
                geom.SetTransparency(transparency)
        print get_body_xytheta(robot)
        grab_obj(held_obj)
        set_robot_config(before)

    for link in newrobot.GetLinks():
        for geom in link.GetGeometries():
            geom.SetTransparency(transparency)
Beispiel #8
0
    def _add_obstacle(self, geom):
        obstacles = np.matrix('-0.576036866359447, 0.918128654970760, 1;\
                        -0.806451612903226,-1.07017543859649, 1;\
                        1.01843317972350,-0.988304093567252, 1;\
                        0.640552995391705,0.906432748538011, 1;\
                        -0.576036866359447, 0.918128654970760, -1;\
                        -0.806451612903226,-1.07017543859649, -1;\
                        1.01843317972350,-0.988304093567252, -1;\
                        0.640552995391705,0.906432748538011, -1')

        body = RaveCreateKinBody(self._env, '')
        vertices = np.array(obstacles)
        indices = np.array([[0, 1, 2], [2, 3, 0], [4, 5, 6], [6, 7, 4],
                            [0, 4, 5], [0, 1, 5], [1, 2, 5], [5, 6, 2],
                            [2, 3, 6], [6, 7, 3], [0, 3, 7], [0, 4, 7]])
        body.InitFromTrimesh(trimesh=TriMesh(vertices, indices), draw=True)
        body.SetName(self.name)
        for link in body.GetLinks():
            for geom in link.GetGeometries():
                geom.SetDiffuseColor((.9, .9, .9))
        self.env_body = body
        self._env.AddKinBody(body)
def main(env,options):
    "Main example code."
    if options.iktype is not None:
        # cannot use .names due to python 2.5 (or is it boost version?)
        for value,type in IkParameterization.Type.values.iteritems():
            if type.name.lower() == options.iktype.lower():
                iktype = type
                break
    else:
        iktype = IkParameterizationType.Transform6D
        
    env.Load(options.scene)
    with env:
        # load the Transform6D IK models
        ikmodels = []
        for robot in env.GetRobots():
            for manip in robot.GetManipulators():
                print manip
                try:
                    robot.SetActiveManipulator(manip)
                    ikmodel = databases.inversekinematics.InverseKinematicsModel(robot, iktype=iktype)
                    if not ikmodel.load():
                        ikmodel.autogenerate()
                        if not ikmodel.has():
                            continue
                    ikmodels.append(ikmodel)
                except Exception, e:
                    print 'failed manip %s'%manip, e
                
        if len(ikmodels) == 0:
            raveLogWarn('no manipulators found that can be loaded with iktype %s'%str(iktype))
            
        # create the pickers
        pickers = []
        for ikmodel in ikmodels:
            raveLogInfo('creating picker for %s'%str(ikmodel.manip))
            picker = RaveCreateKinBody(env,'')
            picker.InitFromBoxes(array([ [0.05,0,0,0.05,0.01,0.01], [0,0.05,0,0.01,0.05,0.01], [0,0,0.05,0.01,0.01,0.05] ]),True)
            for igeom,geom in enumerate(picker.GetLinks()[0].GetGeometries()):
                color = zeros(3)
                color[igeom] = 1
                geom.SetDiffuseColor(color)
            picker.SetName(ikmodel.manip.GetName())
            env.Add(picker,True)
            # have to disable since not part of collision 
            picker.Enable(False)
            picker.SetTransform(ikmodel.manip.GetTransform())
            pickers.append([picker,ikmodel.manip])
Beispiel #10
0
def deserialize_kinbody(env, data, name=None, anonymous=False, state=True):
    from openravepy import RaveCreateKinBody, RaveCreateRobot

    deserialization_logger.debug('Deserializing %s "%s".',
        'Robot' if data['is_robot'] else 'KinBody',
        data['name']
    )

    link_infos = [
        deserialize_link_info(link_data['info']) \
        for link_data in data['links']
    ]
    joint_infos = [
        deserialize_joint_info(joint_data['info']) \
        for joint_data in data['joints']
    ]

    if data['is_robot']:
        # TODO: Also load sensors.
        manipulator_infos = [
            deserialize_manipulator_info(manipulator_data['info']) \
            for manipulator_data in data['manipulators']
        ]
        sensor_infos = []

        kinbody = RaveCreateRobot(env, '')
        kinbody.Init(
            link_infos, joint_infos,
            manipulator_infos, sensor_infos,
            data['uri']
        )
    else:
        kinbody = RaveCreateKinBody(env, '')
        kinbody.Init(link_infos, joint_infos, data['uri'])

    kinbody.SetName(name or data['name'])
    env.Add(kinbody, anonymous)

    if state:
        deserialize_kinbody_state(kinbody, data['kinbody_state'])
        if kinbody.IsRobot():
            deserialize_robot_state(kinbody, data['robot_state'])

    return kinbody
Beispiel #11
0
class OpenRAVEBody(object):
    def __init__(self, env, name, geom):
        assert env is not None
        self.name = name
        self._env = env
        self._geom = geom
        if isinstance(geom, Circle):
            self._add_circle(geom)
        elif isinstance(geom, Can):
            self._add_can(geom)
        elif isinstance(geom, Obstacle):
            self._add_obstacle(geom)
        elif isinstance(geom, PR2):
            self._add_robot(geom)
        elif isinstance(geom, Table):
            self._add_table(geom)
        elif isinstance(geom, Wall):
            self._add_wall(geom)
        elif isinstance(geom, Box):
            self._add_box(geom)
        else:
            raise OpenRAVEException(
                "Geometry not supported for %s for OpenRAVEBody" % geom)

    def delete(self):
        self._env.Remove(self.env_body)

    def set_transparency(self, transparency):
        for link in self.env_body.GetLinks():
            for geom in link.GetGeometries():
                geom.SetTransparency(transparency)

    def _add_circle(self, geom):
        color = [1, 0, 0]
        if hasattr(geom, "color") and geom.color == 'blue':
            color = [0, 0, 1]
        elif hasattr(geom, "color") and geom.color == 'green':
            color = [0, 1, 0]
        elif hasattr(geom, "color") and geom.color == 'red':
            color = [1, 0, 0]

        self.env_body = OpenRAVEBody.create_cylinder(self._env, self.name,
                                                     np.eye(4),
                                                     [geom.radius, 2], color)
        self._env.AddKinBody(self.env_body)

    def _add_can(self, geom):
        color = [1, 0, 0]
        if hasattr(geom, "color") and geom.color == 'blue':
            color = [0, 0, 1]
        elif hasattr(geom, "color") and geom.color == 'green':
            color = [0, 1, 0]
        elif hasattr(geom, "color") and geom.color == 'red':
            color = [1, 0, 0]

        self.env_body = OpenRAVEBody.create_cylinder(
            self._env, self.name, np.eye(4), [geom.radius, geom.height], color)
        self._env.AddKinBody(self.env_body)

    def _add_obstacle(self, geom):
        obstacles = np.matrix('-0.576036866359447, 0.918128654970760, 1;\
                        -0.806451612903226,-1.07017543859649, 1;\
                        1.01843317972350,-0.988304093567252, 1;\
                        0.640552995391705,0.906432748538011, 1;\
                        -0.576036866359447, 0.918128654970760, -1;\
                        -0.806451612903226,-1.07017543859649, -1;\
                        1.01843317972350,-0.988304093567252, -1;\
                        0.640552995391705,0.906432748538011, -1')

        body = RaveCreateKinBody(self._env, '')
        vertices = np.array(obstacles)
        indices = np.array([[0, 1, 2], [2, 3, 0], [4, 5, 6], [6, 7, 4],
                            [0, 4, 5], [0, 1, 5], [1, 2, 5], [5, 6, 2],
                            [2, 3, 6], [6, 7, 3], [0, 3, 7], [0, 4, 7]])
        body.InitFromTrimesh(trimesh=TriMesh(vertices, indices), draw=True)
        body.SetName(self.name)
        for link in body.GetLinks():
            for geom in link.GetGeometries():
                geom.SetDiffuseColor((.9, .9, .9))
        self.env_body = body
        self._env.AddKinBody(body)

    def _add_box(self, geom):
        infobox = OpenRAVEBody.create_body_info(KinBody.Link.GeomType.Box,
                                                geom.dim, [0.5, 0.2, 0.1])
        self.env_body = RaveCreateKinBody(self._env, '')
        self.env_body.InitFromGeometries([infobox])
        self.env_body.SetName(self.name)
        self._env.Add(self.env_body)

    def _add_wall(self, geom):
        self.env_body = OpenRAVEBody.create_wall(self._env, geom.wall_type)
        self.env_body.SetName(self.name)
        self._env.Add(self.env_body)

    def _add_robot(self, geom):
        self.env_body = self._env.ReadRobotXMLFile(geom.shape)
        self.env_body.SetName(self.name)
        self._env.Add(self.env_body)

    def _add_table(self, geom):
        self.env_body = OpenRAVEBody.create_table(self._env, geom)
        self.env_body.SetName(self.name)
        self._env.Add(self.env_body)

    def set_pose(self, base_pose, rotation=None):
        trans = None
        if isinstance(self._geom, Circle) or isinstance(
                self._geom, Obstacle) or isinstance(self._geom, Wall):
            trans = OpenRAVEBody.base_pose_2D_to_mat(base_pose)
        elif isinstance(self._geom, PR2):
            trans = OpenRAVEBody.base_pose_to_mat(base_pose)
        elif isinstance(self._geom, Table) or isinstance(
                self._geom, Can) or isinstance(self._geom, Box):
            assert rotation != None
            trans = OpenRAVEBody.transform_from_obj_pose(base_pose, rotation)
        self.env_body.SetTransform(trans)

    def set_dof(self, back_height, l_arm_pose, l_gripper, r_arm_pose,
                r_gripper):
        """
            This function assumed to be called when the self.env_body is a robot and its geom is type PR2
            It sets the DOF values for important joint of PR2

            back_height: back_height attribute of type Value
            l_arm_pose: l_arm_pose attribute of type Vector7d
            l_gripper: l_gripper attribute of type Value
            r_arm_pose: r_arm_pose attribute of type Vector7d
            r_gripper: r_gripper attribute of type Value
        """
        # Get current dof value for each joint
        dof_val = self.env_body.GetActiveDOFValues()
        # Obtain indices of left arm and right arm
        l_arm_inds = self.env_body.GetManipulator('leftarm').GetArmIndices()
        l_gripper_ind = self.env_body.GetJoint(
            'l_gripper_l_finger_joint').GetDOFIndex()
        r_arm_inds = self.env_body.GetManipulator('rightarm').GetArmIndices()
        r_gripper_ind = self.env_body.GetJoint(
            'r_gripper_l_finger_joint').GetDOFIndex()
        b_height_ind = self.env_body.GetJoint('torso_lift_joint').GetDOFIndex()
        # Update the DOF value
        dof_val[b_height_ind] = back_height
        dof_val[l_arm_inds], dof_val[l_gripper_ind] = l_arm_pose, l_gripper
        dof_val[r_arm_inds], dof_val[r_gripper_ind] = r_arm_pose, r_gripper
        # Set new DOF value to the robot
        self.env_body.SetActiveDOFValues(dof_val)

    def _set_active_dof_inds(self, inds=None):
        """
            Set active dof index to the one we are interested
            This function is implemented to simplify jacobian calculation in the CollisionPredicate

            inds: Optional list of index specifying dof index we are interested in
        """
        robot = self.env_body
        if inds == None:
            dof_inds = np.ndarray(0, dtype=np.int)
            dof_inds = np.r_[dof_inds,
                             robot.GetJoint("torso_lift_joint").GetDOFIndex()]
            dof_inds = np.r_[dof_inds,
                             robot.GetManipulator("leftarm").GetArmIndices()]
            dof_inds = np.r_[
                dof_inds,
                robot.GetManipulator("leftarm").GetGripperIndices()]
            dof_inds = np.r_[dof_inds,
                             robot.GetManipulator("rightarm").GetArmIndices()]
            dof_inds = np.r_[
                dof_inds,
                robot.GetManipulator("rightarm").GetGripperIndices()]
            robot.SetActiveDOFs(
                dof_inds, DOFAffine.X + DOFAffine.Y + DOFAffine.RotationAxis,
                [0, 0, 1])
        else:
            robot.SetActiveDOFs(inds)

    @staticmethod
    def create_cylinder(env, body_name, t, dims, color=[0, 1, 1]):
        infocylinder = OpenRAVEBody.create_body_info(GeometryType.Cylinder,
                                                     dims, color)
        if type(env) != Environment:
            import ipdb
            ipdb.set_trace()
        cylinder = RaveCreateKinBody(env, '')
        cylinder.InitFromGeometries([infocylinder])
        cylinder.SetName(body_name)
        cylinder.SetTransform(t)
        return cylinder

    @staticmethod
    def create_box(env, name, transform, dims, color=[0, 0, 1]):
        infobox = OpenRAVEBody.create_body_info(dims, color, 0, True)
        box = RaveCreateKinBody(env, '')
        box.InitFromGeometries([infobox])
        box.SetName(name)
        box.SetTransform(transform)
        return box

    @staticmethod
    def create_body_info(body_type,
                         dims,
                         color,
                         transparency=0.8,
                         visible=True):
        infobox = KinBody.Link.GeometryInfo()
        infobox._type = body_type
        infobox._vGeomData = dims
        infobox._bVisible = True
        infobox._fTransparency = transparency
        infobox._vDiffuseColor = color
        return infobox

    @staticmethod
    def create_wall(env, wall_type):
        component_type = KinBody.Link.GeomType.Box
        wall_color = [0.5, 0.2, 0.1]
        box_infos = []
        if wall_type == 'closet':
            wall_endpoints = [[-1.0, -3.0], [-1.0, 4.0], [1.9, 4.0],
                              [1.9, 8.0], [5.0, 8.0], [5.0, 4.0], [8.0, 4.0],
                              [8.0, -3.0], [-1.0, -3.0]]
        else:
            raise NotImplemented
        for i, (start,
                end) in enumerate(zip(wall_endpoints[0:-1],
                                      wall_endpoints[1:])):
            dim_x, dim_y = 0, 0
            thickness = WALL_THICKNESS
            if start[0] == end[0]:
                ind_same, ind_diff = 0, 1
                length = abs(start[ind_diff] - end[ind_diff])
                dim_x, dim_y = thickness, length / 2 + thickness
            elif start[1] == end[1]:
                ind_same, ind_diff = 1, 0
                length = abs(start[ind_diff] - end[ind_diff])
                dim_x, dim_y = length / 2 + thickness, thickness
            else:
                raise NotImplemented, 'Can only create axis-aligned walls'

            transform = np.eye(4)
            transform[ind_same, 3] = start[ind_same]
            if start[ind_diff] < end[ind_diff]:
                transform[ind_diff, 3] = start[ind_diff] + length / 2
            else:
                transform[ind_diff, 3] = end[ind_diff] + length / 2
            dims = [dim_x, dim_y, 1]
            box_info = OpenRAVEBody.create_body_info(component_type, dims,
                                                     wall_color)
            box_info._t = transform
            box_infos.append(box_info)
        wall = RaveCreateRobot(env, '')
        wall.InitFromGeometries(box_infos)
        return wall

    @staticmethod
    def create_table(env, geom):
        thickness = geom.thickness
        leg_height = geom.leg_height
        back = geom.back
        dim1, dim2 = geom.table_dim
        legdim1, legdim2 = geom.leg_dim

        table_color = [0.5, 0.2, 0.1]
        component_type = KinBody.Link.GeomType.Box
        tabletop = OpenRAVEBody.create_body_info(
            component_type, [dim1 / 2, dim2 / 2, thickness / 2], table_color)

        leg1 = OpenRAVEBody.create_body_info(
            component_type, [legdim1 / 2, legdim2 / 2, leg_height / 2],
            table_color)
        leg1._t[0, 3] = dim1 / 2 - legdim1 / 2
        leg1._t[1, 3] = dim2 / 2 - legdim2 / 2
        leg1._t[2, 3] = -leg_height / 2 - thickness / 2

        leg2 = OpenRAVEBody.create_body_info(
            component_type, [legdim1 / 2, legdim2 / 2, leg_height / 2],
            table_color)
        leg2._t[0, 3] = dim1 / 2 - legdim1 / 2
        leg2._t[1, 3] = -dim2 / 2 + legdim2 / 2
        leg2._t[2, 3] = -leg_height / 2 - thickness / 2

        leg3 = OpenRAVEBody.create_body_info(
            component_type, [legdim1 / 2, legdim2 / 2, leg_height / 2],
            table_color)
        leg3._t[0, 3] = -dim1 / 2 + legdim1 / 2
        leg3._t[1, 3] = dim2 / 2 - legdim2 / 2
        leg3._t[2, 3] = -leg_height / 2 - thickness / 2

        leg4 = OpenRAVEBody.create_body_info(
            component_type, [legdim1 / 2, legdim2 / 2, leg_height / 2],
            table_color)
        leg4._t[0, 3] = -dim1 / 2 + legdim1 / 2
        leg4._t[1, 3] = -dim2 / 2 + legdim2 / 2
        leg4._t[2, 3] = -leg_height / 2 - thickness / 2

        if back:
            back_plate = OpenRAVEBody.create_body_info(
                component_type,
                [legdim1 / 10, dim2 / 2, leg_height - thickness / 2],
                table_color)
            back_plate._t[0, 3] = dim1 / 2 - legdim1 / 10
            back_plate._t[1, 3] = 0
            back_plate._t[2, 3] = -leg_height / 2 - thickness / 4

        table = RaveCreateRobot(env, '')
        if not back:
            table.InitFromGeometries([tabletop, leg1, leg2, leg3, leg4])
        else:
            table.InitFromGeometries(
                [tabletop, leg1, leg2, leg3, leg4, back_plate])
        return table

    @staticmethod
    def base_pose_2D_to_mat(pose):
        # x, y = pose
        assert len(pose) == 2
        x = pose[0]
        y = pose[1]
        rot = 0
        q = quatFromAxisAngle((0, 0, rot)).tolist()
        pos = [x, y, 0]
        # pos = np.vstack((x,y,np.zeros(1)))
        matrix = matrixFromPose(q + pos)
        return matrix

    @staticmethod
    def base_pose_3D_to_mat(pose):
        # x, y, z = pose
        assert len(pose) == 3
        x = pose[0]
        y = pose[1]
        z = pose[2]
        rot = 0
        q = quatFromAxisAngle((0, 0, rot)).tolist()
        pos = [x, y, z]
        # pos = np.vstack((x,y,np.zeros(1)))
        matrix = matrixFromPose(q + pos)
        return matrix

    @staticmethod
    def mat_to_base_pose_2D(mat):
        pose = poseFromMatrix(mat)
        x = pose[4]
        y = pose[5]
        return np.array([x, y])

    @staticmethod
    def base_pose_to_mat(pose):
        # x, y, rot = pose
        assert len(pose) == 3
        x = pose[0]
        y = pose[1]
        rot = pose[2]
        q = quatFromAxisAngle((0, 0, rot)).tolist()
        pos = [x, y, 0]
        # pos = np.vstack((x,y,np.zeros(1)))
        matrix = matrixFromPose(q + pos)
        return matrix

    @staticmethod
    def mat_to_base_pose(mat):
        pose = poseFromMatrix(mat)
        x = pose[4]
        y = pose[5]
        rot = axisAngleFromRotationMatrix(mat)[2]
        return np.array([x, y, rot])

    @staticmethod
    def obj_pose_from_transform(transform):
        trans = transform[:3, 3]
        rot_matrix = transform[:3, :3]
        yaw, pitch, roll = OpenRAVEBody._ypr_from_rot_matrix(rot_matrix)
        # ipdb.set_trace()
        return np.array((trans[0], trans[1], trans[2], yaw, pitch, roll))

    @staticmethod
    def transform_from_obj_pose(pose, rotation=np.array([0, 0, 0])):
        x, y, z = pose
        alpha, beta, gamma = rotation
        Rz, Ry, Rx = OpenRAVEBody._axis_rot_matrices(pose, rotation)
        rot_mat = np.dot(Rz, np.dot(Ry, Rx))
        matrix = np.eye(4)
        matrix[:3, :3] = rot_mat
        matrix[:3, 3] = [x, y, z]
        return matrix

    @staticmethod
    def _axis_rot_matrices(pose, rotation):
        x, y, z = pose
        alpha, beta, gamma = rotation
        Rz_2d = np.array([[cos(alpha), -sin(alpha)], [sin(alpha), cos(alpha)]])
        Ry_2d = np.array([[cos(beta), sin(beta)], [-sin(beta), cos(beta)]])
        Rx_2d = np.array([[cos(gamma), -sin(gamma)], [sin(gamma), cos(gamma)]])
        I = np.eye(3)
        Rz = I.copy()
        Rz[:2, :2] = Rz_2d
        Ry = I.copy()
        Ry[[[0], [2]], [0, 2]] = Ry_2d
        Rx = I.copy()
        Rx[1:3, 1:3] = Rx_2d
        # ipdb.set_trace()
        return Rz, Ry, Rx

    @staticmethod
    def _ypr_from_rot_matrix(r):
        # alpha
        yaw = atan2(r[1, 0], r[0, 0])
        # beta
        pitch = atan2(-r[2, 0], np.sqrt(r[2, 1]**2 + r[2, 2]**2))
        # gamma
        roll = atan2(r[2, 1], r[2, 2])
        # ipdb.set_trace()
        return (yaw, pitch, roll)

    def ik_arm_pose(self, ee_pos, ee_rot):
        assert isinstance(self._geom, PR2)
        manip = self.env_body.GetManipulator('rightarm_torso')
        iktype = IkParameterizationType.Transform6D
        solution = self.ik_solution(manip, iktype, ee_pos, ee_rot)
        return solution

    def ik_solution(self, manip, iktype, ee_pos, ee_rot):
        ee_trans = OpenRAVEBody.transform_from_obj_pose(ee_pos, ee_rot)
        # Openravepy flip the rotation axis by 90 degree, thus we need to change it back
        rot_mat = matrixFromAxisAngle([0, np.pi / 2, 0])
        ee_trans = ee_trans.dot(rot_mat)
        solutions = manip.FindIKSolutions(IkParameterization(ee_trans, iktype),
                                          IkFilterOptions.CheckEnvCollisions)
        return solutions
def main(env,options):
    "Main example code."
    if options.iktype is not None:
        # cannot use .names due to python 2.5 (or is it boost version?)
        for value,type in IkParameterization.Type.values.items():
            if type.name.lower() == options.iktype.lower():
                iktype = type
                break
    else:
        iktype = IkParameterizationType.Transform6D
        
    env.Load(options.scene)
    with env:
        # load the Transform6D IK models
        ikmodels = []
        for robot in env.GetRobots():
            for manip in robot.GetManipulators():
                print(manip)
                try:
                    robot.SetActiveManipulator(manip)
                    ikmodel = databases.inversekinematics.InverseKinematicsModel(robot, iktype=iktype)
                    if not ikmodel.load():
                        ikmodel.autogenerate()
                        if not ikmodel.has():
                            continue
                    ikmodels.append(ikmodel)
                except Exception as e:
                    print('failed manip %s %r'%(manip, e))
                
        if len(ikmodels) == 0:
            raveLogWarn('no manipulators found that can be loaded with iktype %s'%str(iktype))
            
        # create the pickers
        pickers = []
        for ikmodel in ikmodels:
            raveLogInfo('creating picker for %s'%str(ikmodel.manip))
            picker = RaveCreateKinBody(env,'')
            picker.InitFromBoxes(array([ [0.05,0,0,0.05,0.01,0.01], [0,0.05,0,0.01,0.05,0.01], [0,0,0.05,0.01,0.01,0.05] ]),True)
            for igeom,geom in enumerate(picker.GetLinks()[0].GetGeometries()):
                color = zeros(3)
                color[igeom] = 1
                geom.SetDiffuseColor(color)
            picker.SetName(ikmodel.manip.GetName())
            env.Add(picker,True)
            # have to disable since not part of collision 
            picker.Enable(False)
            picker.SetTransform(ikmodel.manip.GetTransform())
            pickers.append([picker,ikmodel.manip])
              
    raveLogInfo('pickers loaded, try moving them')
    def PickerThread(env,pickers,iktype):
        """this function runs in a separate thread monitoring each of the pickers
        """
        Tpickers = [None]*len(pickers)
        while True:
            if env.GetViewer() is None:
                break
            with env:
                for ipicker,(picker,manip) in enumerate(pickers):
                    T=picker.GetTransform()
                    if Tpickers[ipicker] is not None and sum(abs(Tpickers[ipicker]-T).flatten()) <= 1e-10:
                        continue
                    data = None
                    if iktype == IkParameterizationType.Direction3D:
                        data = T[0:3,2]
                    elif iktype == IkParameterizationType.Lookat3D:
                        data = T[0:3,3]
                    elif iktype == IkParameterizationType.Ray4D:
                        data = Ray(T[0:3,3],T[0:3,2])
                    elif iktype == IkParameterizationType.Rotation3D:
                        data = T[0:3,0:3]
                    elif iktype == IkParameterizationType.Transform6D:
                        data = T
                    elif iktype == IkParameterizationType.Translation3D:
                        data = T[0:3,3]
                    elif iktype == IkParameterizationType.TranslationDirection5D:
                        ikparam = Ray(T[0:3,3],T[0:3,2])
                    elif iktype == IkParameterizationType.TranslationLocalGlobal6D:
                        ikparam = [T[0:3,3],zeros(3)]
                    else:
                        raveLogWarn('iktype %s unsupported'%str(iktype))
                        continue
                    sol = manip.FindIKSolution(IkParameterization(data,iktype),IkFilterOptions.CheckEnvCollisions)
                    if sol is not None:
                        robot.SetDOFValues(sol,manip.GetArmIndices())
                        # have to update all other pickers since two manipulators can be connected to the same joints (torso)
                        for ipicker2, (picker2,manip2) in enumerate(pickers):
                            Tpickers[ipicker2] = manip2.GetTransform()
                            picker2.SetTransform(manip2.GetTransform())
                    # changing color produces bugs with qtcoin
#                     for igeom,geom in enumerate(picker.GetLinks()[0].GetGeometries()):
#                         color = zeros(3)
#                         color[igeom] = 0.4 if sol is None else 1.0
#                         geom.SetDiffuseColor(color)
                    Tpickers[ipicker] = T

            # update rate of 0.05s
            time.sleep(0.05)

    # create the thread
    t = threading.Thread(target=PickerThread,args=[env,pickers,iktype])
    t.start()
    while True:
        t.join(1)
Beispiel #13
0
def deserialize_kinbody(env, data, name=None, anonymous=False, state=True,
        urdf_module_getter=None):

    from openravepy import RaveCreateKinBody, RaveCreateRobot

    if urdf_module_getter is None:
        urdf_module_getter = UnitaryMemoizer(lambda: openravepy.RaveCreateModule(env,'urdf'))

    deserialization_logger.debug('Deserializing %s "%s".',
        'Robot' if data['is_robot'] else 'KinBody',
        data['name']
    )
    
    name_desired = name or data['name']
    
    if data.get('uri_only', False):
        
        if data['is_robot']:

            parts = data['uri'].split()
            if len(parts)==2 and parts[0].endswith('.urdf') and parts[1].endswith('.srdf'):
                module_urdf = urdf_module_getter()
                if module_urdf is None:
                    raise UnsupportedTypeDeserializationException('urdf srdf')
                robot_name = module_urdf.SendCommand('Load {}'.format(data['uri']))
                kinbody = env.GetRobot(robot_name)
                if robot_name != name_desired:
                    env.Remove(kinbody)
                    kinbody.SetName(name_desired)
                    env.Add(kinbody, anonymous)
            else:
                kinbody = env.ReadRobotXMLFile(data['uri'])
                kinbody.SetName(name_desired)
                env.Add(kinbody, anonymous)
            
        else:

            if data['uri'].endswith('.urdf'):
                module_urdf = urdf_module_getter()
                if module_urdf is None:
                    raise UnsupportedTypeDeserializationException('urdf')
                kinbody_name = module_urdf.SendCommand('Load {}'.format(data['uri']))
                kinbody = env.GetKinBody(kinbody_name)
                if kinbody_name != name_desired:
                    env.Remove(kinbody)
                    kinbody.SetName(name_desired)
                    env.Add(kinbody)
            else:
                kinbody = env.ReadKinBodyXMLFile(data['uri'])
                kinbody.SetName(name_desired)
                env.Add(kinbody)
        
    else:
        
        link_infos = [
            deserialize_link_info(link_data['info']) \
            for link_data in data['links']
        ]
        joint_infos = [
            deserialize_joint_info(joint_data['info']) \
            for joint_data in data['joints']
        ]

        if data['is_robot']:
            
            # TODO: Also load sensors.
            manipulator_infos = [
                deserialize_manipulator_info(manipulator_data['info']) \
                for manipulator_data in data['manipulators']
            ]
            sensor_infos = []
        
            kinbody = RaveCreateRobot(env, '')
            kinbody.Init(
                link_infos, joint_infos,
                manipulator_infos, sensor_infos,
                data['uri']
            )
        
        else:
            
            kinbody = RaveCreateKinBody(env, '')
            kinbody.Init(link_infos, joint_infos, data['uri'])
        
        kinbody.SetName(name_desired)
        env.Add(kinbody, anonymous)
    
    if state:
        deserialize_kinbody_state(kinbody, data['kinbody_state'])
        if kinbody.IsRobot():
            deserialize_robot_state(kinbody, data['robot_state'])

    return kinbody