"""This file implements the functionalities of an example simulated system using pybullet. """ import copy import math import numpy as np import os import pybullet_data import random class BoxStackPyBulletSim(object): """The ExamplePyBulletSim class that adds some objects to the scene, steps the sim and return a reward. """ def __init__(self, pybullet_client, urdf_root= pybullet_data.getDataPath(), time_step=0.01): """Constructs an example simulation and reset it to the initial states. Args: pybullet_client: The instance of BulletClient to manage different simulations. urdf_root: The path to the urdf folder. time_step: The time step of the simulation. """ self._pybullet_client = pybullet_client self._urdf_root = urdf_root self.m_actions_taken_since_reset=0 self.time_step = time_step self.stateId = -1 self.Reset(reload_urdf=True) def Reset(self, reload_urdf=False): """Reset the minitaur to its initial states. Args: reload_urdf: Whether to reload the urdf file. If not, Reset() just place the minitaur back to its starting position. """ self.m_actions_taken_since_reset=0 xPosRange=0.025 yPosRange=0.025 boxHalfExtents = 0.025 if reload_urdf: camInfo = self._pybullet_client.getDebugVisualizerCamera() cameraDistance=camInfo[10] print("cameraYaw=",camInfo[8]) print("cameraPitch=",camInfo[9]) print("camtarget=",camInfo[11]) print("projectionMatrix=",camInfo[3]) self._pybullet_client.resetDebugVisualizerCamera(cameraDistance=0.3, cameraYaw=camInfo[8], cameraPitch=camInfo[9],cameraTargetPosition=camInfo[11]) plane = self._pybullet_client.loadURDF("plane.urdf") texUid = self._pybullet_client.loadTexture("checker_blue.png") self._pybullet_client.changeVisualShape(plane,-1, textureUniqueId = texUid) self._numObjects=4 #random number? self._cubes=[] red=[0.97,0.25,0.25,1] green=[0.41,0.68,0.31,1] yellow=[0.92,0.73,0,1] blue=[0,0.55,0.81,1] colors=[red,green,yellow,blue] for i in range (self._numObjects): pos=[0,0,boxHalfExtents + i*2*boxHalfExtents] orn = self._pybullet_client.getQuaternionFromEuler([0,0,0]) orn=[0,0,0,1] cube = self._pybullet_client.loadURDF("cube_small.urdf",pos,orn) self._pybullet_client.changeVisualShape(cube,-1,rgbaColor=colors[i]) self._cubes.append(cube) self._pybullet_client.setGravity(0, 0, -10) self.stateId = self._pybullet_client.saveState() else: if (self.stateId>=0): self._pybullet_client.restoreState(self.stateId) index=0 for i in self._cubes: posX = random.uniform(-xPosRange,xPosRange) posY = random.uniform(-yPosRange,yPosRange) yaw = random.uniform(-math.pi,math.pi) pos=[posX,posY,boxHalfExtents + index*2*boxHalfExtents] index+=1 orn = self._pybullet_client.getQuaternionFromEuler([0,0,yaw]) self._pybullet_client.resetBasePositionAndOrientation(i,pos,orn) def GetActionDimension(self): """Get the length of the action list. Returns: The length of the action list. """ return 4#self.num_motors def GetObservationUpperBound(self): """Get the upper bound of the observation. Returns: The upper bound of an observation. See GetObservation() for the details of each element of an observation. """ upper_bound = np.array([0.0] * self.GetObservationDimension()) upper_bound[0:] = 1.0 # Quaternion of base orientation. return upper_bound def GetObservationLowerBound(self): """Get the lower bound of the observation.""" return -self.GetObservationUpperBound() def GetObservationDimension(self): """Get the length of the observation list. Returns: The length of the observation list. """ sz = len(self.GetObservation()) print("sz=",sz) return sz def GetObservation(self): """Get the observations of minitaur. Returns: The observation list. observation[0:4] is the base orientation in quaternion form. """ observation = [] for i in self._cubes: pos,orn=self._pybullet_client.getBasePositionAndOrientation(i) observation.extend(list(pos)) observation.extend(list(orn)) return observation def ApplyAction(self, action): """Set the desired action. """ self.m_actions_taken_since_reset+=1 def Termination(self): return self.m_actions_taken_since_reset>=200 def CreateSim(pybullet_client,urdf_root,time_step): sim = BoxStackPyBulletSim(pybullet_client=pybullet_client, urdf_root=urdf_root, time_step=time_step) return sim