import unittest import pybullet as p import math, time import difflib, sys from utils import allclose, dot class TestPybulletSaveRestoreMethods(unittest.TestCase): def setupWorld(self): numObjects = 50 maximalCoordinates = False p.resetSimulation() p.setPhysicsEngineParameter(deterministicOverlappingPairs=1) p.loadURDF("planeMesh.urdf", useMaximalCoordinates=maximalCoordinates) kukaId = p.loadURDF("kuka_iiwa/model_free_base.urdf", [0, 0, 10], useMaximalCoordinates=maximalCoordinates) for i in range(p.getNumJoints(kukaId)): p.setJointMotorControl2(kukaId, i, p.POSITION_CONTROL, force=0) for i in range(numObjects): cube = p.loadURDF("cube_small.urdf", [0, i * 0.02, (i + 1) * 0.2]) #p.changeDynamics(cube,-1,mass=100) p.stepSimulation() p.setGravity(0, 0, -10) def dumpStateToFile(self, file): for i in range(p.getNumBodies()): pos, orn = p.getBasePositionAndOrientation(i) linVel, angVel = p.getBaseVelocity(i) txtPos = "pos=" + str(pos) + "\n" txtOrn = "orn=" + str(orn) + "\n" txtLinVel = "linVel" + str(linVel) + "\n" txtAngVel = "angVel" + str(angVel) + "\n" file.write(txtPos) file.write(txtOrn) file.write(txtLinVel) file.write(txtAngVel) def compareFiles(self, file1, file2): diff = difflib.unified_diff( file1.readlines(), file2.readlines(), fromfile='saveFile.txt', tofile='restoreFile.txt', ) numDifferences = 0 for line in diff: numDifferences = numDifferences + 1 sys.stdout.write(line) self.assertEqual(numDifferences, 0) def testSaveRestoreState(self): numSteps = 500 numSteps2 = 30 verbose = 0 self.setupWorld() for i in range(numSteps): p.stepSimulation() p.saveBullet("state.bullet") if verbose: p.setInternalSimFlags(1) p.stepSimulation() if verbose: p.setInternalSimFlags(0) print("contact points=") for q in p.getContactPoints(): print(q) for i in range(numSteps2): p.stepSimulation() file = open("saveFile.txt", "w") self.dumpStateToFile(file) file.close() ################################# self.setupWorld() #both restore from file or from in-memory state should work p.restoreState(fileName="state.bullet") stateId = p.saveState() if verbose: p.setInternalSimFlags(1) p.stepSimulation() if verbose: p.setInternalSimFlags(0) print("contact points restored=") for q in p.getContactPoints(): print(q) for i in range(numSteps2): p.stepSimulation() file = open("restoreFile.txt", "w") self.dumpStateToFile(file) file.close() p.restoreState(stateId) if verbose: p.setInternalSimFlags(1) p.stepSimulation() if verbose: p.setInternalSimFlags(0) print("contact points restored=") for q in p.getContactPoints(): print(q) for i in range(numSteps2): p.stepSimulation() file = open("restoreFile2.txt", "w") self.dumpStateToFile(file) file.close() file1 = open("saveFile.txt", "r") file2 = open("restoreFile.txt", "r") self.compareFiles(file1, file2) file1.close() file2.close() file1 = open("saveFile.txt", "r") file2 = open("restoreFile2.txt", "r") self.compareFiles(file1, file2) file1.close() file2.close() #while (p.getConnectionInfo()["isConnected"]): # time.sleep(1) if __name__ == '__main__': p.connect(p.DIRECT) unittest.main()