Merge pull request #1962 from erwincoumans/master

eglPlugin: remove visual shape for removeBody.
This commit is contained in:
erwincoumans
2018-10-29 16:51:32 -07:00
committed by GitHub
13 changed files with 263 additions and 114 deletions

View File

@@ -274,6 +274,7 @@ bool btMultiBodyWorldImporter::convertAllObjects(bParse::btBulletFile* bulletFil
//equal number of objects, # links etc //equal number of objects, # links etc
if ((bulletFile2->m_multiBodies.size() != m_data->m_mbDynamicsWorld->getNumMultibodies())) if ((bulletFile2->m_multiBodies.size() != m_data->m_mbDynamicsWorld->getNumMultibodies()))
{ {
printf("btMultiBodyWorldImporter::convertAllObjects error: expected %d multibodies, got %d.\n", m_data->m_mbDynamicsWorld->getNumMultibodies(), bulletFile2->m_multiBodies.size());
result = false; result = false;
return result; return result;
} }
@@ -287,7 +288,15 @@ bool btMultiBodyWorldImporter::convertAllObjects(bParse::btBulletFile* bulletFil
{ {
btMultiBodyDoubleData* mbd = (btMultiBodyDoubleData*)bulletFile2->m_multiBodies[i]; btMultiBodyDoubleData* mbd = (btMultiBodyDoubleData*)bulletFile2->m_multiBodies[i];
btMultiBody* mb = m_data->m_mbDynamicsWorld->getMultiBody(i); btMultiBody* mb = m_data->m_mbDynamicsWorld->getMultiBody(i);
syncMultiBody(mbd, mb, m_data, scratchQ, scratchM); if (mbd->m_numLinks != mb->getNumLinks())
{
printf("btMultiBodyWorldImporter::convertAllObjects error: mismatch in number of links in a body (expected %d, found %d).\n", mbd->m_numLinks, mb->getNumLinks() );
result = false;
return result;
} else
{
syncMultiBody(mbd, mb, m_data, scratchQ, scratchM);
}
} }
for (int i = bulletFile2->m_rigidBodies.size() - 1; i >= 0; i--) for (int i = bulletFile2->m_rigidBodies.size() - 1; i >= 0; i--)
@@ -319,11 +328,13 @@ bool btMultiBodyWorldImporter::convertAllObjects(bParse::btBulletFile* bulletFil
} }
else else
{ {
printf("btMultiBodyWorldImporter::convertAllObjects error: cannot find btRigidBody with bodyUniqueId %d\n", uid);
result = false; result = false;
} }
} }
else else
{ {
printf("Error in btMultiBodyWorldImporter::convertAllObjects: didn't find bodyUniqueId: %d\n", uid);
result = false; result = false;
} }
} }
@@ -362,7 +373,55 @@ bool btMultiBodyWorldImporter::convertAllObjects(bParse::btBulletFile* bulletFil
{ {
btMultiBodyFloatData* mbd = (btMultiBodyFloatData*)bulletFile2->m_multiBodies[i]; btMultiBodyFloatData* mbd = (btMultiBodyFloatData*)bulletFile2->m_multiBodies[i];
btMultiBody* mb = m_data->m_mbDynamicsWorld->getMultiBody(i); btMultiBody* mb = m_data->m_mbDynamicsWorld->getMultiBody(i);
syncMultiBody(mbd, mb, m_data, scratchQ, scratchM); if (mbd->m_numLinks != mb->getNumLinks())
{
printf("btMultiBodyWorldImporter::convertAllObjects error: mismatch in number of links in a body (expected %d, found %d).\n", mbd->m_numLinks, mb->getNumLinks() );
result = false;
return result;
} else
{
syncMultiBody(mbd, mb, m_data, scratchQ, scratchM);
}
}
for (int i = bulletFile2->m_rigidBodies.size() - 1; i >= 0; i--)
{
btRigidBodyFloatData* rbd = (btRigidBodyFloatData*)bulletFile2->m_rigidBodies[i];
int foundRb = -1;
int uid = rbd->m_collisionObjectData.m_uniqueId;
for (int i = 0; i < m_data->m_mbDynamicsWorld->getNumCollisionObjects(); i++)
{
if (uid == m_data->m_mbDynamicsWorld->getCollisionObjectArray()[i]->getBroadphaseHandle()->m_uniqueId)
{
foundRb = i;
break;
}
}
if (foundRb >= 0)
{
btRigidBody* rb = btRigidBody::upcast(m_data->m_mbDynamicsWorld->getCollisionObjectArray()[foundRb]);
if (rb)
{
btTransform tr;
tr.deSerializeFloat(rbd->m_collisionObjectData.m_worldTransform);
rb->setWorldTransform(tr);
btVector3 linVel, angVel;
linVel.deSerializeFloat(rbd->m_linearVelocity);
angVel.deSerializeFloat(rbd->m_angularVelocity);
rb->setLinearVelocity(linVel);
rb->setAngularVelocity(angVel);
}
else
{
printf("btMultiBodyWorldImporter::convertAllObjects error: cannot find btRigidBody with bodyUniqueId %d\n", uid);
result = false;
}
}
else
{
printf("Error in btMultiBodyWorldImporter::convertAllObjects: didn't find bodyUniqueId: %d\n", uid);
result = false;
}
} }
//todo: check why body1 pointer is not properly deserialized //todo: check why body1 pointer is not properly deserialized

View File

@@ -3,6 +3,15 @@
struct CommonFileIOInterface struct CommonFileIOInterface
{ {
int m_fileIOType;
const char* m_pathPrefix;
CommonFileIOInterface(int fileIOType, const char* pathPrefix)
:m_fileIOType(fileIOType),
m_pathPrefix(pathPrefix)
{
}
virtual ~CommonFileIOInterface() virtual ~CommonFileIOInterface()
{ {
} }

View File

@@ -143,7 +143,7 @@ bool BulletURDFImporter::loadURDF(const char* fileName, bool forceFixedBase)
b3FileUtils fu; b3FileUtils fu;
//bool fileFound = fu.findFile(fileName, relativeFileName, 1024); //bool fileFound = fu.findFile(fileName, relativeFileName, 1024);
bool fileFound = m_data->m_fileIO->findResourcePath(fileName, relativeFileName, 1024) > 0; bool fileFound = m_data->m_fileIO->findResourcePath(fileName, relativeFileName, 1024);
std::string xml_string; std::string xml_string;
@@ -217,7 +217,7 @@ bool BulletURDFImporter::loadSDF(const char* fileName, bool forceFixedBase)
b3FileUtils fu; b3FileUtils fu;
//bool fileFound = fu.findFile(fileName, relativeFileName, 1024); //bool fileFound = fu.findFile(fileName, relativeFileName, 1024);
bool fileFound = (m_data->m_fileIO->findResourcePath(fileName, relativeFileName, 1024)) > 0; bool fileFound = (m_data->m_fileIO->findResourcePath(fileName, relativeFileName, 1024));
std::string xml_string; std::string xml_string;

View File

@@ -10152,33 +10152,50 @@ bool PhysicsServerCommandProcessor::processRestoreStateCommand(const struct Shar
} }
else else
{ {
const char* prefix[] = {"", "./", "./data/", "../data/", "../../data/", "../../../data/", "../../../../data/"};
int numPrefixes = sizeof(prefix) / sizeof(const char*);
char relativeFileName[1024];
FILE* f = 0;
bool found = false; bool found = false;
char fileName[1024];
fileName[0] = 0;
for (int i = 0; !f && i < numPrefixes; i++) CommonFileIOInterface* fileIO = m_data->m_pluginManager.getFileIOInterface();
b3AlignedObjectArray<char> buffer;
buffer.reserve(1024);
if (fileIO)
{ {
sprintf(relativeFileName, "%s%s", prefix[i], clientCmd.m_fileArguments.m_fileName);
f = fopen(relativeFileName, "rb"); int fileId = -1;
if (f) found = fileIO->findResourcePath(clientCmd.m_fileArguments.m_fileName, fileName, 1024);
if (found)
{ {
found = true; fileId = fileIO->fileOpen(fileName,"rb");
break; }
if (fileId>=0)
{
int size = fileIO->getFileSize(fileId);
if (size>0)
{
buffer.resize(size);
int actual = fileIO->fileRead(fileId,&buffer[0],size);
if (actual != size)
{
b3Warning("image filesize mismatch!\n");
buffer.resize(0);
} else
{
found=true;
}
}
fileIO->fileClose(fileId);
} }
} }
if (f)
{
fclose(f);
}
if (found) if (found && buffer.size())
{ {
ok = importer->loadFile(relativeFileName); ok = importer->loadFileFromMemory(&buffer[0], buffer.size());
} else
{
b3Error("Error in restoreState: cannot load file %s\n", clientCmd.m_fileArguments.m_fileName);
} }
} }
if (ok) if (ok)
{ {
serverCmd.m_type = CMD_RESTORE_STATE_COMPLETED; serverCmd.m_type = CMD_RESTORE_STATE_COMPLETED;
@@ -10198,30 +10215,43 @@ bool PhysicsServerCommandProcessor::processLoadBulletCommand(const struct Shared
//btBulletWorldImporter* importer = new btBulletWorldImporter(m_data->m_dynamicsWorld); //btBulletWorldImporter* importer = new btBulletWorldImporter(m_data->m_dynamicsWorld);
btMultiBodyWorldImporter* importer = new btMultiBodyWorldImporter(m_data->m_dynamicsWorld); btMultiBodyWorldImporter* importer = new btMultiBodyWorldImporter(m_data->m_dynamicsWorld);
const char* prefix[] = {"", "./", "./data/", "../data/", "../../data/", "../../../data/", "../../../../data/"};
int numPrefixes = sizeof(prefix) / sizeof(const char*);
char relativeFileName[1024];
FILE* f = 0;
bool found = false; bool found = false;
for (int i = 0; !f && i < numPrefixes; i++) CommonFileIOInterface* fileIO = m_data->m_pluginManager.getFileIOInterface();
b3AlignedObjectArray<char> buffer;
buffer.reserve(1024);
if (fileIO)
{ {
sprintf(relativeFileName, "%s%s", prefix[i], clientCmd.m_fileArguments.m_fileName); char fileName[1024];
f = fopen(relativeFileName, "rb"); int fileId = -1;
if (f) found = fileIO->findResourcePath(clientCmd.m_fileArguments.m_fileName, fileName, 1024);
if (found)
{ {
found = true; fileId = fileIO->fileOpen(fileName,"rb");
break; }
if (fileId>=0)
{
int size = fileIO->getFileSize(fileId);
if (size>0)
{
buffer.resize(size);
int actual = fileIO->fileRead(fileId,&buffer[0],size);
if (actual != size)
{
b3Warning("image filesize mismatch!\n");
buffer.resize(0);
} else
{
found=true;
}
}
fileIO->fileClose(fileId);
} }
} }
if (f)
{
fclose(f);
}
if (found) if (found && buffer.size())
{ {
bool ok = importer->loadFile(relativeFileName); bool ok = importer->loadFileFromMemory(&buffer[0], buffer.size());
if (ok) if (ok)
{ {
int numRb = importer->getNumRigidBodies(); int numRb = importer->getNumRigidBodies();

View File

@@ -924,6 +924,7 @@ enum eFileIOTypes
ePosixFileIO = 1, ePosixFileIO = 1,
eZipFileIO, eZipFileIO,
eCNSFileIO, eCNSFileIO,
eInMemoryFileIO,
}; };
//limits for vertices/indices in PyBullet::createCollisionShape //limits for vertices/indices in PyBullet::createCollisionShape

View File

@@ -1257,6 +1257,7 @@ void EGLRendererVisualShapeConverter::removeVisualShape(int collisionObjectUniqu
{ {
for (int o = 0; o < ptr->m_renderObjects.size(); o++) for (int o = 0; o < ptr->m_renderObjects.size(); o++)
{ {
m_data->m_instancingRenderer->removeGraphicsInstance(ptr->m_graphicsInstanceId);
delete ptr->m_renderObjects[o]; delete ptr->m_renderObjects[o];
} }
} }

View File

@@ -48,6 +48,7 @@ struct InMemoryFileIO : public CommonFileIOInterface
int m_numFrees; int m_numFrees;
InMemoryFileIO() InMemoryFileIO()
:CommonFileIOInterface(eInMemoryFileIO,0)
{ {
m_numAllocs=0; m_numAllocs=0;
m_numFrees=0; m_numFrees=0;
@@ -293,7 +294,8 @@ struct WrapperFileIO : public CommonFileIOInterface
InMemoryFileIO m_cachedFiles; InMemoryFileIO m_cachedFiles;
WrapperFileIO() WrapperFileIO()
:m_numWrapperInterfaces(0) :CommonFileIOInterface(0,0),
m_numWrapperInterfaces(0)
{ {
for (int i=0;i<B3_MAX_FILEIO_INTERFACES;i++) for (int i=0;i<B3_MAX_FILEIO_INTERFACES;i++)
{ {
@@ -327,6 +329,14 @@ struct WrapperFileIO : public CommonFileIOInterface
return result; return result;
} }
CommonFileIOInterface* getFileIOInterface(int fileIOIndex)
{
if (fileIOIndex>=0 && fileIOIndex<B3_MAX_FILEIO_INTERFACES)
{
return m_availableFileIOInterfaces[fileIOIndex];
}
return 0;
}
void removeFileIOInterface(int fileIOIndex) void removeFileIOInterface(int fileIOIndex)
{ {
if (fileIOIndex>=0 && fileIOIndex<B3_MAX_FILEIO_INTERFACES) if (fileIOIndex>=0 && fileIOIndex<B3_MAX_FILEIO_INTERFACES)
@@ -571,51 +581,68 @@ B3_SHARED_API int executePluginCommand_fileIOPlugin(struct b3PluginContext* cont
{ {
case eAddFileIOAction: case eAddFileIOAction:
{ {
//create new fileIO interface //if the fileIO already exists, skip this action
int fileIOType = arguments->m_ints[1]; int fileIOType = arguments->m_ints[1];
switch (fileIOType) bool alreadyExists = false;
for (int i=0;i<B3_MAX_FILEIO_INTERFACES;i++)
{ {
case ePosixFileIO: CommonFileIOInterface* fileIO = obj->m_fileIO.getFileIOInterface(i);
if (fileIO)
{ {
#ifdef B3_EXCLUDE_DEFAULT_FILEIO if (fileIO->m_fileIOType == fileIOType)
printf("ePosixFileIO is not enabled in this build.\n");
#else
obj->m_fileIO.addFileIOInterface(new b3BulletDefaultFileIO());
#endif
break;
}
case eZipFileIO:
{
#ifdef B3_USE_ZIPFILE_FILEIO
if (arguments->m_text)
{ {
obj->m_fileIO.addFileIOInterface(new ZipFileIO(arguments->m_text, &obj->m_fileIO)); if (fileIO->m_pathPrefix && strcmp(fileIO->m_pathPrefix,arguments->m_text)==0)
{
result = i;
alreadyExists = true;
break;
}
} }
#else
printf("eZipFileIO is not enabled in this build.\n");
#endif
break;
}
case eCNSFileIO:
{
#ifdef B3_USE_CNS_FILEIO
if (strlen(arguments->m_text))
{
obj->m_fileIO.addFileIOInterface(new CNSFileIO(arguments->m_text));
}
else
{
obj->m_fileIO.addFileIOInterface(new CNSFileIO(""));
}
#else//B3_USE_CNS_FILEIO
printf("CNSFileIO is not enabled in this build.\n");
#endif //B3_USE_CNS_FILEIO
break;
}
default:
{
} }
} }
//create new fileIO interface
if (!alreadyExists)
{
switch (fileIOType)
{
case ePosixFileIO:
{
#ifdef B3_EXCLUDE_DEFAULT_FILEIO
printf("ePosixFileIO is not enabled in this build.\n");
#else
result = obj->m_fileIO.addFileIOInterface(new b3BulletDefaultFileIO(ePosixFileIO, arguments->m_text));
#endif
break;
}
case eZipFileIO:
{
#ifdef B3_USE_ZIPFILE_FILEIO
if (arguments->m_text)
{
result = obj->m_fileIO.addFileIOInterface(new ZipFileIO(eZipFileIO, arguments->m_text, &obj->m_fileIO));
}
#else
printf("eZipFileIO is not enabled in this build.\n");
#endif
break;
}
case eCNSFileIO:
{
#ifdef B3_USE_CNS_FILEIO
result = obj->m_fileIO.addFileIOInterface(new CNSFileIO(eCNSFileIO, arguments->m_text));
#else//B3_USE_CNS_FILEIO
printf("CNSFileIO is not enabled in this build.\n");
#endif //B3_USE_CNS_FILEIO
break;
}
default:
{
}
}//switch (fileIOType)
}//if (!alreadyExists)
break; break;
} }
case eRemoveFileIOAction: case eRemoveFileIOAction:
@@ -624,6 +651,7 @@ B3_SHARED_API int executePluginCommand_fileIOPlugin(struct b3PluginContext* cont
//remove fileIO interface //remove fileIO interface
int fileIOIndex = arguments->m_ints[1]; int fileIOIndex = arguments->m_ints[1];
obj->m_fileIO.removeFileIOInterface(fileIOIndex); obj->m_fileIO.removeFileIOInterface(fileIOIndex);
result = fileIOIndex;
break; break;
} }
default: default:

View File

@@ -10,10 +10,12 @@ struct ZipFileIO : public CommonFileIOInterface
unzFile m_fileHandles[B3_ZIP_FILEIO_MAX_FILES ]; unzFile m_fileHandles[B3_ZIP_FILEIO_MAX_FILES ];
int m_numFileHandles; int m_numFileHandles;
ZipFileIO(const char* zipfileName, CommonFileIOInterface* wrapperFileIO) ZipFileIO(int fileIOType, const char* zipfileName, CommonFileIOInterface* wrapperFileIO)
:m_zipfileName(zipfileName), :CommonFileIOInterface(fileIOType,0),
m_zipfileName(zipfileName),
m_numFileHandles(0) m_numFileHandles(0)
{ {
m_pathPrefix = m_zipfileName.c_str();
for (int i=0;i<B3_ZIP_FILEIO_MAX_FILES ;i++) for (int i=0;i<B3_ZIP_FILEIO_MAX_FILES ;i++)
{ {
m_fileHandles[i]=0; m_fileHandles[i]=0;

View File

@@ -16,12 +16,19 @@ struct b3BulletDefaultFileIO : public CommonFileIOInterface
return fileIo->findFile(orgFileName, relativeFileName, maxRelativeFileNameMaxLen); return fileIo->findFile(orgFileName, relativeFileName, maxRelativeFileNameMaxLen);
} }
char m_prefix[1024];
FILE* m_fileHandles[B3_FILEIO_MAX_FILES]; FILE* m_fileHandles[B3_FILEIO_MAX_FILES];
int m_numFileHandles; int m_numFileHandles;
b3BulletDefaultFileIO() b3BulletDefaultFileIO(int fileIOType=0, const char* pathPrefix=0)
:m_numFileHandles(0) :CommonFileIOInterface(fileIOType, m_prefix),
m_numFileHandles(0)
{ {
m_prefix[0] = 0;
if (pathPrefix)
{
sprintf(m_prefix,"%s", pathPrefix);
}
for (int i=0;i<B3_FILEIO_MAX_FILES;i++) for (int i=0;i<B3_FILEIO_MAX_FILES;i++)
{ {
m_fileHandles[i]=0; m_fileHandles[i]=0;
@@ -97,7 +104,7 @@ struct b3BulletDefaultFileIO : public CommonFileIOInterface
virtual bool findResourcePath(const char* fileName, char* relativeFileName, int relativeFileNameSizeInBytes) virtual bool findResourcePath(const char* fileName, char* relativeFileName, int relativeFileNameSizeInBytes)
{ {
return b3ResourcePath::findResourcePath(fileName, relativeFileName, relativeFileNameSizeInBytes, b3BulletDefaultFileIO::FileIOPluginFindFile, this); return b3ResourcePath::findResourcePath(fileName, relativeFileName, relativeFileNameSizeInBytes, b3BulletDefaultFileIO::FileIOPluginFindFile, this)>0;
} }
@@ -114,7 +121,7 @@ struct b3BulletDefaultFileIO : public CommonFileIOInterface
} }
//printf("Trying various directories, relative to current working directory\n"); //printf("Trying various directories, relative to current working directory\n");
const char* prefix[] = {"./", "./data/", "../data/", "../../data/", "../../../data/", "../../../../data/"}; const char* prefix[] = {m_prefix, "./", "./data/", "../data/", "../../data/", "../../../data/", "../../../../data/"};
int numPrefixes = sizeof(prefix) / sizeof(const char*); int numPrefixes = sizeof(prefix) / sizeof(const char*);
f = 0; f = 0;

View File

@@ -59,9 +59,15 @@
</visual> </visual>
<inertial> <inertial>
<origin xyz="0 0 0.5"/> <origin xyz="0 0 0.5"/>
<mass value="10"/> <mass value="0.1"/>
<inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/> <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
</inertial> </inertial>
<collision>
<geometry>
<box size="0.05 0.05 1.0"/>
</geometry>
<origin rpy="0 0 0" xyz="0 0 0.5"/>
</collision>
</link> </link>
<joint name="cart_to_pole" type="continuous"> <joint name="cart_to_pole" type="continuous">

View File

@@ -9,17 +9,17 @@ def register(id,*args,**kvargs):
# ------------bullet------------- # ------------bullet-------------
register( register(
id='CartPoleBulletEnv-v0', id='CartPoleBulletEnv-v1',
entry_point='pybullet_envs.bullet:CartPoleBulletEnv', entry_point='pybullet_envs.bullet:CartPoleBulletEnv',
timestep_limit=1000, max_episode_steps=200,
reward_threshold=950.0, reward_threshold=190.0,
) )
register( register(
id='MinitaurBulletEnv-v0', id='MinitaurBulletEnv-v0',
entry_point='pybullet_envs.bullet:MinitaurBulletEnv', entry_point='pybullet_envs.bullet:MinitaurBulletEnv',
timestep_limit=1000, timestep_limit=1000,
reward_threshold=5.0, reward_threshold=15.0,
) )
register( register(

View File

@@ -5,12 +5,13 @@ parentdir = os.path.dirname(os.path.dirname(currentdir))
os.sys.path.insert(0,parentdir) os.sys.path.insert(0,parentdir)
import gym import gym
import time
from baselines import deepq from baselines import deepq
from pybullet_envs.bullet.cartpole_bullet import CartPoleBulletEnv from pybullet_envs.bullet.cartpole_bullet import CartPoleBulletEnv
def main(): def main():
env = gym.make('CartPoleBulletEnv-v0') env = gym.make('CartPoleBulletEnv-v1')
act = deepq.load("cartpole_model.pkl") act = deepq.load("cartpole_model.pkl")
while True: while True:
@@ -28,6 +29,7 @@ def main():
a = aa[0] a = aa[0]
obs, rew, done, _ = env.step(a) obs, rew, done, _ = env.step(a)
episode_rew += rew episode_rew += rew
time.sleep(1./240.)
print("Episode reward", episode_rew) print("Episode reward", episode_rew)

View File

@@ -34,24 +34,26 @@ class CartPoleBulletEnv(gym.Env):
p.connect(p.GUI) p.connect(p.GUI)
else: else:
p.connect(p.DIRECT) p.connect(p.DIRECT)
self.theta_threshold_radians = 12 * 2 * math.pi / 360
self.x_threshold = 0.4 #2.4
high = np.array([
self.x_threshold * 2,
np.finfo(np.float32).max,
self.theta_threshold_radians * 2,
np.finfo(np.float32).max])
observation_high = np.array([ self.force_mag = 10
np.finfo(np.float32).max,
np.finfo(np.float32).max,
np.finfo(np.float32).max,
np.finfo(np.float32).max])
action_high = np.array([0.1])
self.action_space = spaces.Discrete(9) self.action_space = spaces.Discrete(2)
self.observation_space = spaces.Box(-observation_high, observation_high) self.observation_space = spaces.Box(-high, high, dtype=np.float32)
self.theta_threshold_radians = 1
self.x_threshold = 2.4
self._seed() self._seed()
# self.reset() # self.reset()
self.viewer = None self.viewer = None
self._configure() self._configure()
def _configure(self, display=None): def _configure(self, display=None):
self.display = display self.display = display
@@ -60,41 +62,43 @@ class CartPoleBulletEnv(gym.Env):
return [seed] return [seed]
def _step(self, action): def _step(self, action):
force = self.force_mag if action==1 else -self.force_mag
p.setJointMotorControl2(self.cartpole, 0, p.TORQUE_CONTROL, force=force)
p.stepSimulation() p.stepSimulation()
# time.sleep(self.timeStep)
self.state = p.getJointState(self.cartpole, 1)[0:2] + p.getJointState(self.cartpole, 0)[0:2] self.state = p.getJointState(self.cartpole, 1)[0:2] + p.getJointState(self.cartpole, 0)[0:2]
theta, theta_dot, x, x_dot = self.state theta, theta_dot, x, x_dot = self.state
dv = 0.1
deltav = [-10.*dv,-5.*dv, -2.*dv, -0.1*dv, 0, 0.1*dv, 2.*dv,5.*dv, 10.*dv][action]
p.setJointMotorControl2(self.cartpole, 0, p.VELOCITY_CONTROL, targetVelocity=(deltav + self.state[3]))
done = x < -self.x_threshold \ done = x < -self.x_threshold \
or x > self.x_threshold \ or x > self.x_threshold \
or theta < -self.theta_threshold_radians \ or theta < -self.theta_threshold_radians \
or theta > self.theta_threshold_radians or theta > self.theta_threshold_radians
done = bool(done)
reward = 1.0 reward = 1.0
#print("state=",self.state)
return np.array(self.state), reward, done, {} return np.array(self.state), reward, done, {}
def _reset(self): def _reset(self):
# print("-----------reset simulation---------------") # print("-----------reset simulation---------------")
p.resetSimulation() p.resetSimulation()
self.cartpole = p.loadURDF(os.path.join(pybullet_data.getDataPath(),"cartpole.urdf"),[0,0,0]) self.cartpole = p.loadURDF(os.path.join(pybullet_data.getDataPath(),"cartpole.urdf"),[0,0,0])
self.timeStep = 0.01 p.changeDynamics(self.cartpole, -1, linearDamping=0, angularDamping=0)
p.changeDynamics(self.cartpole, 0, linearDamping=0, angularDamping=0)
p.changeDynamics(self.cartpole, 1, linearDamping=0, angularDamping=0)
self.timeStep = 0.02
p.setJointMotorControl2(self.cartpole, 1, p.VELOCITY_CONTROL, force=0) p.setJointMotorControl2(self.cartpole, 1, p.VELOCITY_CONTROL, force=0)
p.setGravity(0,0, -10) p.setJointMotorControl2(self.cartpole, 0, p.VELOCITY_CONTROL, force=0)
p.setGravity(0,0, -9.8)
p.setTimeStep(self.timeStep) p.setTimeStep(self.timeStep)
p.setRealTimeSimulation(0) p.setRealTimeSimulation(0)
initialCartPos = self.np_random.uniform(low=-0.5, high=0.5, size=(1,)) randstate = self.np_random.uniform(low=-0.05, high=0.05, size=(4,))
initialAngle = self.np_random.uniform(low=-0.5, high=0.5, size=(1,)) p.resetJointState(self.cartpole, 1, randstate[0], randstate[1])
p.resetJointState(self.cartpole, 1, initialAngle) p.resetJointState(self.cartpole, 0, randstate[2], randstate[3])
p.resetJointState(self.cartpole, 0, initialCartPos) #print("randstate=",randstate)
self.state = p.getJointState(self.cartpole, 1)[0:2] + p.getJointState(self.cartpole, 0)[0:2] self.state = p.getJointState(self.cartpole, 1)[0:2] + p.getJointState(self.cartpole, 0)[0:2]
#print("self.state=", self.state)
return np.array(self.state) return np.array(self.state)
def _render(self, mode='human', close=False): def _render(self, mode='human', close=False):