def update_position(instance): """ Update position for an object or a robot in renderer. :param instance: Instance in the renderer """ if isinstance(instance, Instance): pos, orn = p.getBasePositionAndOrientation( instance.pybullet_uuid) # orn is in x,y,z,w instance.set_position(pos) instance.set_rotation(xyzw2wxyz(orn)) elif isinstance(instance, InstanceGroup): poses_rot = [] poses_trans = [] for link_id in instance.link_ids: if link_id == -1: pos, orn = p.getBasePositionAndOrientation( instance.pybullet_uuid) else: _, _, _, _, pos, orn = p.getLinkState( instance.pybullet_uuid, link_id) poses_rot.append( np.ascontiguousarray(quat2rotmat(xyzw2wxyz(orn)))) poses_trans.append(np.ascontiguousarray(xyz2mat(pos))) instance.poses_rot = poses_rot instance.poses_trans = poses_trans
def import_articulated_object(self, obj, class_id=None): """ Import an articulated object into the simulator :param obj: Object to load :param class_id: Class id for rendering semantic segmentation :return: pybulet id """ if class_id is None: class_id = self.next_class_id self.next_class_id += 1 ids = obj.load() visual_objects = [] link_ids = [] poses_rot = [] poses_trans = [] for shape in p.getVisualShapeData(ids): id, link_id, type, dimensions, filename, rel_pos, rel_orn, color = shape[: 8] if type == p.GEOM_MESH: filename = filename.decode('utf-8') if filename not in self.visual_objects.keys(): self.renderer.load_object(filename, transform_orn=rel_orn, transform_pos=rel_pos, input_kd=color[:3], scale=np.array(dimensions)) self.visual_objects[filename] = len( self.renderer.visual_objects) - 1 visual_objects.append(self.visual_objects[filename]) link_ids.append(link_id) elif type == p.GEOM_SPHERE: filename = os.path.join(gibson2.assets_path, 'models/mjcf_primitives/sphere8.obj') self.renderer.load_object(filename, transform_orn=rel_orn, transform_pos=rel_pos, input_kd=color[:3], scale=[ dimensions[0] / 0.5, dimensions[0] / 0.5, dimensions[0] / 0.5 ]) visual_objects.append(len(self.renderer.visual_objects) - 1) link_ids.append(link_id) elif type == p.GEOM_CAPSULE or type == p.GEOM_CYLINDER: filename = os.path.join(gibson2.assets_path, 'models/mjcf_primitives/cube.obj') self.renderer.load_object(filename, transform_orn=rel_orn, transform_pos=rel_pos, input_kd=color[:3], scale=[ dimensions[1] / 0.5, dimensions[1] / 0.5, dimensions[0] ]) visual_objects.append(len(self.renderer.visual_objects) - 1) link_ids.append(link_id) elif type == p.GEOM_BOX: filename = os.path.join(gibson2.assets_path, 'models/mjcf_primitives/cube.obj') self.renderer.load_object(filename, transform_orn=rel_orn, transform_pos=rel_pos, input_kd=color[:3], scale=np.array(dimensions)) visual_objects.append(len(self.renderer.visual_objects) - 1) link_ids.append(link_id) if link_id == -1: pos, orn = p.getBasePositionAndOrientation(id) else: _, _, _, _, pos, orn = p.getLinkState(id, link_id) poses_rot.append(np.ascontiguousarray(quat2rotmat(xyzw2wxyz(orn)))) poses_trans.append(np.ascontiguousarray(xyz2mat(pos))) self.renderer.add_instance_group(object_ids=visual_objects, link_ids=link_ids, pybullet_uuid=ids, class_id=class_id, poses_rot=poses_rot, poses_trans=poses_trans, dynamic=True, robot=None) return ids
def import_drawer_handle(self): self.drawer_id = self.drawer.load() # render drawer class_id = self.simulator.next_class_id self.simulator.next_class_id += 1 visual_objects = [] link_ids = [] poses_rot = [] poses_trans = [] for shape in p.getVisualShapeData(self.drawer_id): id, link_id, type, dimensions, filename, rel_pos, rel_orn, color = shape[: 8] link_name = p.getJointInfo(self.drawer_id, link_id)[12] if link_name != b'handle_left' and link_name != b'handle_right' and link_name != b'handle_grip': filename = os.path.join(gibson2.assets_path, 'models/mjcf_primitives/cube.obj') self.simulator.renderer.load_object(filename, transform_orn=rel_orn, transform_pos=rel_pos, input_kd=color[:3], scale=np.array(dimensions)) visual_objects.append( len(self.simulator.renderer.visual_objects) - 1) link_ids.append(link_id) _, _, _, _, pos, orn = p.getLinkState(id, link_id) poses_rot.append( np.ascontiguousarray(quat2rotmat(xyzw2wxyz(orn)))) poses_trans.append(np.ascontiguousarray(xyz2mat(pos))) self.simulator.renderer.add_instance_group( object_ids=visual_objects, link_ids=link_ids, pybullet_uuid=self.drawer_id, class_id=class_id, poses_rot=poses_rot, poses_trans=poses_trans, dynamic=True, robot=None) # render drawer handle class_id = self.simulator.next_class_id self.simulator.next_class_id += 1 visual_objects = [] link_ids = [] poses_rot = [] poses_trans = [] for shape in p.getVisualShapeData(self.drawer_id): id, link_id, type, dimensions, filename, rel_pos, rel_orn, color = shape[: 8] link_name = p.getJointInfo(self.drawer_id, link_id)[12] if link_name == b'handle_left' or link_name == b'handle_right' or link_name == b'handle_grip': filename = os.path.join(gibson2.assets_path, 'models/mjcf_primitives/cube.obj') self.simulator.renderer.load_object(filename, transform_orn=rel_orn, transform_pos=rel_pos, input_kd=color[:3], scale=np.array(dimensions)) visual_objects.append( len(self.simulator.renderer.visual_objects) - 1) link_ids.append(link_id) _, _, _, _, pos, orn = p.getLinkState(id, link_id) poses_rot.append( np.ascontiguousarray(quat2rotmat(xyzw2wxyz(orn)))) poses_trans.append(np.ascontiguousarray(xyz2mat(pos))) self.simulator.renderer.add_instance_group( object_ids=visual_objects, link_ids=link_ids, pybullet_uuid=self.drawer_id, class_id=class_id, poses_rot=poses_rot, poses_trans=poses_trans, dynamic=True, robot=None)