Merge pull request #1690 from erwincoumans/master
Fix for issue #1643, bump up PyBullet version to 1.9.8
This commit is contained in:
@@ -1,111 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
import argparse # parse input arguments
|
|
||||||
import numpy as np # arithmetic library
|
|
||||||
import time
|
|
||||||
import gym
|
|
||||||
from agents import agent_register
|
|
||||||
import pybullet as p
|
|
||||||
import kerasrl_utils
|
|
||||||
|
|
||||||
np.set_printoptions(precision=3, suppress=True, linewidth=10000)
|
|
||||||
|
|
||||||
|
|
||||||
def add_opts(parser):
|
|
||||||
parser.add_argument('--agent', type=str, default="KerasDQNAgent", help="Agent to be trained with.")
|
|
||||||
parser.add_argument('--env', type=str, default="2DDetachedCartPolev0Env", help="Environment to be trained in.")
|
|
||||||
parser.add_argument('--use-latest', action='store_true', help="Should the trainer retrain/show with the most recent save?")
|
|
||||||
parser.add_argument('--train-for', type=int, default=100, help="The number of epochs to train for.")
|
|
||||||
parser.add_argument('--test-for', type=int, default=0, help="The number of epoch to test for.")
|
|
||||||
parser.add_argument('--load-file', type=str, default=None, help="The weight file to load for training.")
|
|
||||||
parser.add_argument('--save-file', type=str, default=None, help="The weight file to save after training.")
|
|
||||||
|
|
||||||
|
|
||||||
class Trainer:
|
|
||||||
'''
|
|
||||||
The trainer class helps to easily set up a gym training session using an agent(representing the learning algorithm and the gym (being the environment)
|
|
||||||
'''
|
|
||||||
# TODO: Make training fail-safe by catching "not connected to server" and save the current state to disk (see primitive examples, they can do it)
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
# initialize random seed
|
|
||||||
np.random.seed(int(time.time()))
|
|
||||||
|
|
||||||
cid = p.connect(p.SHARED_MEMORY) # only show graphics if the browser is already running....
|
|
||||||
self.visualize = (cid >= 0)
|
|
||||||
if cid < 0:
|
|
||||||
cid = p.connect(p.DIRECT) # If no shared memory browser is active, we switch to headless mode (DIRECT is much faster)
|
|
||||||
|
|
||||||
def setup_exercise(self, opts):
|
|
||||||
|
|
||||||
# setup agent
|
|
||||||
agent = agent_register.make(opts.agent, opts=opts)
|
|
||||||
|
|
||||||
# setup environment
|
|
||||||
env = gym.make(opts.env)
|
|
||||||
if self.visualize:
|
|
||||||
mode = "human"
|
|
||||||
else:
|
|
||||||
mode = "none"
|
|
||||||
env.render(mode=mode)
|
|
||||||
|
|
||||||
# configurations
|
|
||||||
env.seed(int(time.time()))
|
|
||||||
#env.configureActions(agent.metadata['discrete_actions']) # configure environment to accepts discrete actions
|
|
||||||
if agent.metadata['discrete_actions']:
|
|
||||||
agent.configure(env.observation_space.shape, env.action_space.n) # configure agent to use the environment properties
|
|
||||||
else:
|
|
||||||
agent.configure(env.observation_space.shape, env.action_space.shape[0]) # configure agent to use the environment properties
|
|
||||||
|
|
||||||
if opts.use_latest:
|
|
||||||
properties = kerasrl_utils.get_latest_save("checkpoints/", opts.agent, opts.env, 0)
|
|
||||||
if properties == []:
|
|
||||||
print("No previous weight saves found for %s-%s" % (opts.agent, opts.env))
|
|
||||||
else:
|
|
||||||
opts.load_file = "checkpoints/%s-%s-%s.h5" % (properties[0], properties[1], properties[2])
|
|
||||||
print("Continue from [%s] " % opts.load_file)
|
|
||||||
|
|
||||||
if opts.load_file is not None:
|
|
||||||
print("loading weights from [%s]" % opts.load_file)
|
|
||||||
agent.load_weights(opts.load_file)
|
|
||||||
|
|
||||||
# Okay, now it's time to learn something! We visualize the training here for show, but this
|
|
||||||
# slows down training quite a lot. You can always safely abort the training prematurely using
|
|
||||||
# Ctrl + C.
|
|
||||||
agent.train(env, nb_steps=opts.train_for, visualize=self.visualize, verbosity=1)
|
|
||||||
|
|
||||||
# After training is done, we save the final weights.
|
|
||||||
if opts.save_file is not None:
|
|
||||||
print("saving weights to [%s]" % opts.save_file)
|
|
||||||
agent.save_weights(opts.save_file, overwrite=True)
|
|
||||||
|
|
||||||
# Finally, evaluate our algorithm.
|
|
||||||
agent.test(env, nb_episodes=opts.test_for, visualize=self.visualize)
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
"""
|
|
||||||
You can also run the trainer as a main class if you want to start your own agent/environment combination. If you know your precise arguments, just run this as your main.
|
|
||||||
"""
|
|
||||||
|
|
||||||
trainer = Trainer.Trainer()
|
|
||||||
|
|
||||||
parser = argparse.ArgumentParser()
|
|
||||||
|
|
||||||
# add all parsing options
|
|
||||||
Trainer.add_opts(parser)
|
|
||||||
|
|
||||||
opts, unknown = parser.parse_known_args() # parse agent and environment to add their opts
|
|
||||||
|
|
||||||
exec("from agents import %s" % opts.agent) # import agent type
|
|
||||||
exec("from envs import %s" % opts.env) # import env type
|
|
||||||
exec("%s.add_opts(parser)" % opts.agent)
|
|
||||||
exec("%s.add_opts(parser)" % opts.env)
|
|
||||||
|
|
||||||
# parse arguments
|
|
||||||
opts, unknown = parser.parse_known_args()
|
|
||||||
print("OPTS", opts)
|
|
||||||
print("UNKNOWN", unknown)
|
|
||||||
|
|
||||||
|
|
||||||
trainer.setup_exercise(opts)
|
|
||||||
|
|
||||||
@@ -1,6 +1,8 @@
|
|||||||
import gym, gym.spaces, gym.utils, gym.utils.seeding
|
import gym, gym.spaces, gym.utils, gym.utils.seeding
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import pybullet as p
|
import pybullet
|
||||||
|
from pybullet_utils import bullet_client
|
||||||
|
|
||||||
from pkg_resources import parse_version
|
from pkg_resources import parse_version
|
||||||
|
|
||||||
class MJCFBaseBulletEnv(gym.Env):
|
class MJCFBaseBulletEnv(gym.Env):
|
||||||
@@ -17,7 +19,7 @@ class MJCFBaseBulletEnv(gym.Env):
|
|||||||
|
|
||||||
def __init__(self, robot, render=False):
|
def __init__(self, robot, render=False):
|
||||||
self.scene = None
|
self.scene = None
|
||||||
self.physicsClientId=-1
|
self.physicsClientId = -1
|
||||||
self.ownsPhysicsClient = 0
|
self.ownsPhysicsClient = 0
|
||||||
self.camera = Camera()
|
self.camera = Camera()
|
||||||
self.isRender = render
|
self.isRender = render
|
||||||
@@ -40,25 +42,21 @@ class MJCFBaseBulletEnv(gym.Env):
|
|||||||
|
|
||||||
def _reset(self):
|
def _reset(self):
|
||||||
if (self.physicsClientId<0):
|
if (self.physicsClientId<0):
|
||||||
conInfo = p.getConnectionInfo()
|
self.ownsPhysicsClient = True
|
||||||
if (conInfo['isConnected']):
|
|
||||||
self.ownsPhysicsClient = False
|
|
||||||
|
|
||||||
self.physicsClientId = 0
|
|
||||||
|
if self.isRender:
|
||||||
|
self._p = bullet_client.BulletClient(connection_mode=pybullet.GUI)
|
||||||
else:
|
else:
|
||||||
self.ownsPhysicsClient = True
|
self._p = bullet_client.BulletClient()
|
||||||
self.physicsClientId = p.connect(p.SHARED_MEMORY)
|
|
||||||
if (self.physicsClientId<0):
|
self.physicsClientId = self._p._client
|
||||||
if (self.isRender):
|
self._p.configureDebugVisualizer(pybullet.COV_ENABLE_GUI,0)
|
||||||
self.physicsClientId = p.connect(p.GUI)
|
|
||||||
else:
|
|
||||||
self.physicsClientId = p.connect(p.DIRECT)
|
|
||||||
p.configureDebugVisualizer(p.COV_ENABLE_GUI,0)
|
|
||||||
|
|
||||||
if self.scene is None:
|
if self.scene is None:
|
||||||
self.scene = self.create_single_player_scene()
|
self.scene = self.create_single_player_scene(self._p)
|
||||||
if not self.scene.multiplayer and self.ownsPhysicsClient:
|
if not self.scene.multiplayer and self.ownsPhysicsClient:
|
||||||
self.scene.episode_restart()
|
self.scene.episode_restart(self._p)
|
||||||
|
|
||||||
self.robot.scene = self.scene
|
self.robot.scene = self.scene
|
||||||
|
|
||||||
@@ -66,7 +64,7 @@ class MJCFBaseBulletEnv(gym.Env):
|
|||||||
self.done = 0
|
self.done = 0
|
||||||
self.reward = 0
|
self.reward = 0
|
||||||
dump = 0
|
dump = 0
|
||||||
s = self.robot.reset()
|
s = self.robot.reset(self._p)
|
||||||
self.potential = self.robot.calc_potential()
|
self.potential = self.robot.calc_potential()
|
||||||
return s
|
return s
|
||||||
|
|
||||||
@@ -81,20 +79,20 @@ class MJCFBaseBulletEnv(gym.Env):
|
|||||||
if (hasattr(self.robot,'body_xyz')):
|
if (hasattr(self.robot,'body_xyz')):
|
||||||
base_pos = self.robot.body_xyz
|
base_pos = self.robot.body_xyz
|
||||||
|
|
||||||
view_matrix = p.computeViewMatrixFromYawPitchRoll(
|
view_matrix = self._p.computeViewMatrixFromYawPitchRoll(
|
||||||
cameraTargetPosition=base_pos,
|
cameraTargetPosition=base_pos,
|
||||||
distance=self._cam_dist,
|
distance=self._cam_dist,
|
||||||
yaw=self._cam_yaw,
|
yaw=self._cam_yaw,
|
||||||
pitch=self._cam_pitch,
|
pitch=self._cam_pitch,
|
||||||
roll=0,
|
roll=0,
|
||||||
upAxisIndex=2)
|
upAxisIndex=2)
|
||||||
proj_matrix = p.computeProjectionMatrixFOV(
|
proj_matrix = self._p.computeProjectionMatrixFOV(
|
||||||
fov=60, aspect=float(self._render_width)/self._render_height,
|
fov=60, aspect=float(self._render_width)/self._render_height,
|
||||||
nearVal=0.1, farVal=100.0)
|
nearVal=0.1, farVal=100.0)
|
||||||
(_, _, px, _, _) = p.getCameraImage(
|
(_, _, px, _, _) = self._p.getCameraImage(
|
||||||
width=self._render_width, height=self._render_height, viewMatrix=view_matrix,
|
width=self._render_width, height=self._render_height, viewMatrix=view_matrix,
|
||||||
projectionMatrix=proj_matrix,
|
projectionMatrix=proj_matrix,
|
||||||
renderer=p.ER_BULLET_HARDWARE_OPENGL
|
renderer=pybullet.ER_BULLET_HARDWARE_OPENGL
|
||||||
)
|
)
|
||||||
rgb_array = np.array(px)
|
rgb_array = np.array(px)
|
||||||
rgb_array = rgb_array[:, :, :3]
|
rgb_array = rgb_array[:, :, :3]
|
||||||
@@ -104,7 +102,7 @@ class MJCFBaseBulletEnv(gym.Env):
|
|||||||
def _close(self):
|
def _close(self):
|
||||||
if (self.ownsPhysicsClient):
|
if (self.ownsPhysicsClient):
|
||||||
if (self.physicsClientId>=0):
|
if (self.physicsClientId>=0):
|
||||||
p.disconnect(self.physicsClientId)
|
self._p.disconnect()
|
||||||
self.physicsClientId = -1
|
self.physicsClientId = -1
|
||||||
|
|
||||||
def HUD(self, state, a, done):
|
def HUD(self, state, a, done):
|
||||||
@@ -130,4 +128,4 @@ class Camera:
|
|||||||
lookat = [x,y,z]
|
lookat = [x,y,z]
|
||||||
distance = 10
|
distance = 10
|
||||||
yaw = 10
|
yaw = 10
|
||||||
p.resetDebugVisualizerCamera(distance, yaw, -20, lookat)
|
self._p.resetDebugVisualizerCamera(distance, yaw, -20, lookat)
|
||||||
|
|||||||
@@ -4,10 +4,9 @@ import inspect
|
|||||||
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
|
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
|
||||||
parentdir = os.path.dirname(os.path.dirname(currentdir))
|
parentdir = os.path.dirname(os.path.dirname(currentdir))
|
||||||
os.sys.path.insert(0,parentdir)
|
os.sys.path.insert(0,parentdir)
|
||||||
|
import pybullet
|
||||||
import gym
|
import gym
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import pybullet as p
|
|
||||||
import pybullet_envs
|
import pybullet_envs
|
||||||
import time
|
import time
|
||||||
|
|
||||||
@@ -29,17 +28,12 @@ class SmallReactivePolicy:
|
|||||||
return x
|
return x
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
pybullet.connect(pybullet.DIRECT)
|
||||||
env = gym.make("AntBulletEnv-v0")
|
env = gym.make("AntBulletEnv-v0")
|
||||||
env.render(mode="human")
|
env.render(mode="human")
|
||||||
|
|
||||||
pi = SmallReactivePolicy(env.observation_space, env.action_space)
|
pi = SmallReactivePolicy(env.observation_space, env.action_space)
|
||||||
env.reset()
|
env.reset()
|
||||||
torsoId = -1
|
|
||||||
for i in range (p.getNumBodies()):
|
|
||||||
print(p.getBodyInfo(i))
|
|
||||||
if (p.getBodyInfo(i)[0].decode() == "torso"):
|
|
||||||
torsoId=i
|
|
||||||
print("found torso")
|
|
||||||
|
|
||||||
while 1:
|
while 1:
|
||||||
frame = 0
|
frame = 0
|
||||||
@@ -57,14 +51,6 @@ def main():
|
|||||||
frame += 1
|
frame += 1
|
||||||
distance=5
|
distance=5
|
||||||
yaw = 0
|
yaw = 0
|
||||||
humanPos, humanOrn = p.getBasePositionAndOrientation(torsoId)
|
|
||||||
camInfo = p.getDebugVisualizerCamera()
|
|
||||||
curTargetPos = camInfo[11]
|
|
||||||
distance=camInfo[10]
|
|
||||||
yaw = camInfo[8]
|
|
||||||
pitch=camInfo[9]
|
|
||||||
targetPos = [0.95*curTargetPos[0]+0.05*humanPos[0],0.95*curTargetPos[1]+0.05*humanPos[1],curTargetPos[2]]
|
|
||||||
p.resetDebugVisualizerCamera(distance,yaw,pitch,targetPos);
|
|
||||||
|
|
||||||
still_open = env.render("human")
|
still_open = env.render("human")
|
||||||
if still_open==False:
|
if still_open==False:
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ os.sys.path.insert(0,parentdir)
|
|||||||
|
|
||||||
import gym
|
import gym
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import pybullet as p
|
|
||||||
import pybullet_envs
|
import pybullet_envs
|
||||||
import time
|
import time
|
||||||
|
|
||||||
@@ -34,15 +33,6 @@ def main():
|
|||||||
pi = SmallReactivePolicy(env.observation_space, env.action_space)
|
pi = SmallReactivePolicy(env.observation_space, env.action_space)
|
||||||
#disable rendering during reset, makes loading much faster
|
#disable rendering during reset, makes loading much faster
|
||||||
env.reset()
|
env.reset()
|
||||||
torsoId = -1
|
|
||||||
for i in range (p.getNumBodies()):
|
|
||||||
print(p.getBodyInfo(i))
|
|
||||||
if (p.getBodyInfo(i)[1].decode() == "cheetah"):
|
|
||||||
torsoId=i
|
|
||||||
print("found torso")
|
|
||||||
print(p.getNumJoints(torsoId))
|
|
||||||
for j in range (p.getNumJoints(torsoId)):
|
|
||||||
print(p.getJointInfo(torsoId,j))#LinkState(torsoId,j))
|
|
||||||
|
|
||||||
while 1:
|
while 1:
|
||||||
frame = 0
|
frame = 0
|
||||||
@@ -55,16 +45,6 @@ def main():
|
|||||||
obs, r, done, _ = env.step(a)
|
obs, r, done, _ = env.step(a)
|
||||||
score += r
|
score += r
|
||||||
frame += 1
|
frame += 1
|
||||||
distance=5
|
|
||||||
yaw = 0
|
|
||||||
humanPos = p.getLinkState(torsoId,4)[0]
|
|
||||||
camInfo = p.getDebugVisualizerCamera()
|
|
||||||
curTargetPos = camInfo[11]
|
|
||||||
distance=camInfo[10]
|
|
||||||
yaw = camInfo[8]
|
|
||||||
pitch=camInfo[9]
|
|
||||||
targetPos = [0.95*curTargetPos[0]+0.05*humanPos[0],0.95*curTargetPos[1]+0.05*humanPos[1],curTargetPos[2]]
|
|
||||||
p.resetDebugVisualizerCamera(distance,yaw,pitch,targetPos);
|
|
||||||
|
|
||||||
still_open = env.render("human")
|
still_open = env.render("human")
|
||||||
if still_open==False:
|
if still_open==False:
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ os.sys.path.insert(0,parentdir)
|
|||||||
|
|
||||||
import gym
|
import gym
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import pybullet as p
|
|
||||||
import pybullet_envs
|
import pybullet_envs
|
||||||
import time
|
import time
|
||||||
|
|
||||||
@@ -35,14 +34,6 @@ def main():
|
|||||||
|
|
||||||
pi = SmallReactivePolicy(env.observation_space, env.action_space)
|
pi = SmallReactivePolicy(env.observation_space, env.action_space)
|
||||||
env.reset()
|
env.reset()
|
||||||
for i in range (p.getNumBodies()):
|
|
||||||
print(p.getBodyInfo(i))
|
|
||||||
if (p.getBodyInfo(i)[1].decode() == "hopper"):
|
|
||||||
torsoId=i
|
|
||||||
print("found torso")
|
|
||||||
print(p.getNumJoints(torsoId))
|
|
||||||
for j in range (p.getNumJoints(torsoId)):
|
|
||||||
print(p.getJointInfo(torsoId,j))#LinkState(torsoId,j))
|
|
||||||
while 1:
|
while 1:
|
||||||
frame = 0
|
frame = 0
|
||||||
score = 0
|
score = 0
|
||||||
@@ -56,16 +47,6 @@ def main():
|
|||||||
obs, r, done, _ = env.step(a)
|
obs, r, done, _ = env.step(a)
|
||||||
score += r
|
score += r
|
||||||
frame += 1
|
frame += 1
|
||||||
distance=5
|
|
||||||
yaw = 0
|
|
||||||
humanPos = p.getLinkState(torsoId,4)[0]
|
|
||||||
camInfo = p.getDebugVisualizerCamera()
|
|
||||||
curTargetPos = camInfo[11]
|
|
||||||
distance=camInfo[10]
|
|
||||||
yaw = camInfo[8]
|
|
||||||
pitch=camInfo[9]
|
|
||||||
targetPos = [0.95*curTargetPos[0]+0.05*humanPos[0],0.95*curTargetPos[1]+0.05*humanPos[1],curTargetPos[2]]
|
|
||||||
p.resetDebugVisualizerCamera(distance,yaw,pitch,targetPos);
|
|
||||||
|
|
||||||
|
|
||||||
still_open = env.render("human")
|
still_open = env.render("human")
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ os.sys.path.insert(0,parentdir)
|
|||||||
|
|
||||||
import gym
|
import gym
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import pybullet as p
|
|
||||||
import pybullet_envs
|
import pybullet_envs
|
||||||
import time
|
import time
|
||||||
|
|
||||||
@@ -33,12 +32,6 @@ def main():
|
|||||||
env.render(mode="human")
|
env.render(mode="human")
|
||||||
pi = SmallReactivePolicy(env.observation_space, env.action_space)
|
pi = SmallReactivePolicy(env.observation_space, env.action_space)
|
||||||
env.reset()
|
env.reset()
|
||||||
torsoId = -1
|
|
||||||
for i in range (p.getNumBodies()):
|
|
||||||
print(p.getBodyInfo(i))
|
|
||||||
if (p.getBodyInfo(i)[0].decode() == "torso"):
|
|
||||||
torsoId=i
|
|
||||||
print("found humanoid torso")
|
|
||||||
while 1:
|
while 1:
|
||||||
frame = 0
|
frame = 0
|
||||||
score = 0
|
score = 0
|
||||||
@@ -50,18 +43,7 @@ def main():
|
|||||||
obs, r, done, _ = env.step(a)
|
obs, r, done, _ = env.step(a)
|
||||||
score += r
|
score += r
|
||||||
frame += 1
|
frame += 1
|
||||||
distance=5
|
|
||||||
yaw = 0
|
|
||||||
time.sleep(1./60.)
|
time.sleep(1./60.)
|
||||||
humanPos, humanOrn = p.getBasePositionAndOrientation(torsoId)
|
|
||||||
camInfo = p.getDebugVisualizerCamera()
|
|
||||||
curTargetPos = camInfo[11]
|
|
||||||
distance=camInfo[10]
|
|
||||||
yaw = camInfo[8]
|
|
||||||
pitch=camInfo[9]
|
|
||||||
targetPos = [0.95*curTargetPos[0]+0.05*humanPos[0],0.95*curTargetPos[1]+0.05*humanPos[1],curTargetPos[2]]
|
|
||||||
p.resetDebugVisualizerCamera(distance,yaw,pitch,targetPos);
|
|
||||||
|
|
||||||
|
|
||||||
still_open = env.render("human")
|
still_open = env.render("human")
|
||||||
if still_open==False:
|
if still_open==False:
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ os.sys.path.insert(0,parentdir)
|
|||||||
|
|
||||||
import gym
|
import gym
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import pybullet as p
|
|
||||||
import pybullet_envs
|
import pybullet_envs
|
||||||
import os.path
|
import os.path
|
||||||
import time
|
import time
|
||||||
@@ -41,28 +40,14 @@ def demo_run():
|
|||||||
score = 0
|
score = 0
|
||||||
restart_delay = 0
|
restart_delay = 0
|
||||||
obs = env.reset()
|
obs = env.reset()
|
||||||
torsoId = -1
|
|
||||||
for i in range (p.getNumBodies()):
|
|
||||||
print(p.getBodyInfo(i))
|
|
||||||
if (p.getBodyInfo(i)[0].decode() == "torso"):
|
|
||||||
torsoId=i
|
|
||||||
print("found humanoid torso")
|
|
||||||
|
|
||||||
while 1:
|
while 1:
|
||||||
a = pi.act(obs)
|
a = pi.act(obs)
|
||||||
obs, r, done, _ = env.step(a)
|
obs, r, done, _ = env.step(a)
|
||||||
score += r
|
score += r
|
||||||
frame += 1
|
frame += 1
|
||||||
humanPos, humanOrn = p.getBasePositionAndOrientation(torsoId)
|
|
||||||
if (gui):
|
if (gui):
|
||||||
time.sleep(1./60)
|
time.sleep(1./60)
|
||||||
camInfo = p.getDebugVisualizerCamera()
|
|
||||||
curTargetPos = camInfo[11]
|
|
||||||
distance=camInfo[10]
|
|
||||||
yaw = camInfo[8]
|
|
||||||
pitch=camInfo[9]
|
|
||||||
targetPos = [0.95*curTargetPos[0]+0.05*humanPos[0],0.95*curTargetPos[1]+0.05*humanPos[1],curTargetPos[2]]
|
|
||||||
p.resetDebugVisualizerCamera(distance,yaw,pitch,targetPos);
|
|
||||||
|
|
||||||
still_open = env.render("human")
|
still_open = env.render("human")
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ os.sys.path.insert(0,parentdir)
|
|||||||
|
|
||||||
import gym
|
import gym
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import pybullet as p
|
|
||||||
import pybullet_envs
|
import pybullet_envs
|
||||||
import time
|
import time
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ os.sys.path.insert(0,parentdir)
|
|||||||
|
|
||||||
import gym
|
import gym
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import pybullet as p
|
|
||||||
import pybullet_envs
|
import pybullet_envs
|
||||||
import time
|
import time
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ os.sys.path.insert(0,parentdir)
|
|||||||
|
|
||||||
import gym
|
import gym
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import pybullet as p
|
|
||||||
import pybullet_envs
|
import pybullet_envs
|
||||||
import time
|
import time
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ os.sys.path.insert(0,parentdir)
|
|||||||
|
|
||||||
import gym
|
import gym
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import pybullet as p
|
|
||||||
import pybullet_envs
|
import pybullet_envs
|
||||||
import time
|
import time
|
||||||
|
|
||||||
@@ -33,15 +32,6 @@ def main():
|
|||||||
pi = SmallReactivePolicy(env.observation_space, env.action_space)
|
pi = SmallReactivePolicy(env.observation_space, env.action_space)
|
||||||
|
|
||||||
env.reset()
|
env.reset()
|
||||||
torsoId = -1
|
|
||||||
for i in range (p.getNumBodies()):
|
|
||||||
print(p.getBodyInfo(i))
|
|
||||||
if (p.getBodyInfo(i)[1].decode() == "walker2d"):
|
|
||||||
torsoId=i
|
|
||||||
print("found torso")
|
|
||||||
print(p.getNumJoints(torsoId))
|
|
||||||
for j in range (p.getNumJoints(torsoId)):
|
|
||||||
print(p.getJointInfo(torsoId,j))#LinkState(torsoId,j))
|
|
||||||
|
|
||||||
while 1:
|
while 1:
|
||||||
frame = 0
|
frame = 0
|
||||||
@@ -50,21 +40,11 @@ def main():
|
|||||||
obs = env.reset()
|
obs = env.reset()
|
||||||
|
|
||||||
while 1:
|
while 1:
|
||||||
time.sleep(0.01)
|
time.sleep(1./60.)
|
||||||
a = pi.act(obs)
|
a = pi.act(obs)
|
||||||
obs, r, done, _ = env.step(a)
|
obs, r, done, _ = env.step(a)
|
||||||
score += r
|
score += r
|
||||||
frame += 1
|
frame += 1
|
||||||
distance=5
|
|
||||||
yaw = 0
|
|
||||||
humanPos = p.getLinkState(torsoId,4)[0]
|
|
||||||
camInfo = p.getDebugVisualizerCamera()
|
|
||||||
curTargetPos = camInfo[11]
|
|
||||||
distance=camInfo[10]
|
|
||||||
yaw = camInfo[8]
|
|
||||||
pitch=camInfo[9]
|
|
||||||
targetPos = [0.95*curTargetPos[0]+0.05*humanPos[0],0.95*curTargetPos[1]+0.05*humanPos[1],curTargetPos[2]]
|
|
||||||
p.resetDebugVisualizerCamera(distance,yaw,pitch,targetPos);
|
|
||||||
|
|
||||||
still_open = env.render("human")
|
still_open = env.render("human")
|
||||||
if still_open==False:
|
if still_open==False:
|
||||||
|
|||||||
@@ -1,31 +0,0 @@
|
|||||||
#add parent dir to find package. Only needed for source code build, pip install doesn't need it.
|
|
||||||
import os, inspect
|
|
||||||
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
|
|
||||||
parentdir = os.path.dirname(os.path.dirname(currentdir))
|
|
||||||
os.sys.path.insert(0,parentdir)
|
|
||||||
|
|
||||||
from pybullet_envs.bullet.simpleHumanoidGymEnv import SimpleHumanoidGymEnv
|
|
||||||
|
|
||||||
def main():
|
|
||||||
|
|
||||||
environment = SimpleHumanoidGymEnv(renders=True)
|
|
||||||
|
|
||||||
environment._p.setGravity(0,0,0)
|
|
||||||
|
|
||||||
motorsIds=[]
|
|
||||||
for motor in environment._humanoid.motor_names:
|
|
||||||
motorsIds.append(environment._p.addUserDebugParameter(motor,-1,1,0))
|
|
||||||
|
|
||||||
while (True):
|
|
||||||
|
|
||||||
action=[]
|
|
||||||
for motorId in motorsIds:
|
|
||||||
action.append(environment._p.readUserDebugParameter(motorId))
|
|
||||||
|
|
||||||
state, reward, done, info = environment.step(action)
|
|
||||||
obs = environment.getExtendedObservation()
|
|
||||||
print("obs")
|
|
||||||
print(obs)
|
|
||||||
|
|
||||||
if __name__=="__main__":
|
|
||||||
main()
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
from .scene_stadium import SinglePlayerStadiumScene
|
from .scene_stadium import SinglePlayerStadiumScene
|
||||||
from .env_bases import MJCFBaseBulletEnv
|
from .env_bases import MJCFBaseBulletEnv
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import pybullet as p
|
import pybullet
|
||||||
from robot_locomotors import Hopper, Walker2D, HalfCheetah, Ant, Humanoid, HumanoidFlagrun, HumanoidFlagrunHarder
|
from robot_locomotors import Hopper, Walker2D, HalfCheetah, Ant, Humanoid, HumanoidFlagrun, HumanoidFlagrunHarder
|
||||||
|
|
||||||
|
|
||||||
@@ -16,25 +16,25 @@ class WalkerBaseBulletEnv(MJCFBaseBulletEnv):
|
|||||||
self.stateId=-1
|
self.stateId=-1
|
||||||
|
|
||||||
|
|
||||||
def create_single_player_scene(self):
|
def create_single_player_scene(self, bullet_client):
|
||||||
self.stadium_scene = SinglePlayerStadiumScene(gravity=9.8, timestep=0.0165/4, frame_skip=4)
|
self.stadium_scene = SinglePlayerStadiumScene(bullet_client, gravity=9.8, timestep=0.0165/4, frame_skip=4)
|
||||||
return self.stadium_scene
|
return self.stadium_scene
|
||||||
|
|
||||||
def _reset(self):
|
def _reset(self):
|
||||||
if (self.stateId>=0):
|
if (self.stateId>=0):
|
||||||
#print("restoreState self.stateId:",self.stateId)
|
#print("restoreState self.stateId:",self.stateId)
|
||||||
p.restoreState(self.stateId)
|
self._p.restoreState(self.stateId)
|
||||||
|
|
||||||
r = MJCFBaseBulletEnv._reset(self)
|
r = MJCFBaseBulletEnv._reset(self)
|
||||||
p.configureDebugVisualizer(p.COV_ENABLE_RENDERING,0)
|
self._p.configureDebugVisualizer(pybullet.COV_ENABLE_RENDERING,0)
|
||||||
|
|
||||||
self.parts, self.jdict, self.ordered_joints, self.robot_body = self.robot.addToScene(
|
self.parts, self.jdict, self.ordered_joints, self.robot_body = self.robot.addToScene(self._p,
|
||||||
self.stadium_scene.ground_plane_mjcf)
|
self.stadium_scene.ground_plane_mjcf)
|
||||||
self.ground_ids = set([(self.parts[f].bodies[self.parts[f].bodyIndex], self.parts[f].bodyPartIndex) for f in
|
self.ground_ids = set([(self.parts[f].bodies[self.parts[f].bodyIndex], self.parts[f].bodyPartIndex) for f in
|
||||||
self.foot_ground_object_names])
|
self.foot_ground_object_names])
|
||||||
p.configureDebugVisualizer(p.COV_ENABLE_RENDERING,1)
|
self._p.configureDebugVisualizer(pybullet.COV_ENABLE_RENDERING,1)
|
||||||
if (self.stateId<0):
|
if (self.stateId<0):
|
||||||
self.stateId=p.saveState()
|
self.stateId=self._p.saveState()
|
||||||
#print("saving state self.stateId:",self.stateId)
|
#print("saving state self.stateId:",self.stateId)
|
||||||
|
|
||||||
|
|
||||||
@@ -155,8 +155,8 @@ class HumanoidFlagrunBulletEnv(HumanoidBulletEnv):
|
|||||||
self.robot = HumanoidFlagrun()
|
self.robot = HumanoidFlagrun()
|
||||||
HumanoidBulletEnv.__init__(self, self.robot)
|
HumanoidBulletEnv.__init__(self, self.robot)
|
||||||
|
|
||||||
def create_single_player_scene(self):
|
def create_single_player_scene(self, bullet_client):
|
||||||
s = HumanoidBulletEnv.create_single_player_scene(self)
|
s = HumanoidBulletEnv.create_single_player_scene(self, bullet_client)
|
||||||
s.zero_at_running_strip_start_line = False
|
s.zero_at_running_strip_start_line = False
|
||||||
return s
|
return s
|
||||||
|
|
||||||
@@ -168,8 +168,8 @@ class HumanoidFlagrunHarderBulletEnv(HumanoidBulletEnv):
|
|||||||
self.electricity_cost /= 4 # don't care that much about electricity, just stand up!
|
self.electricity_cost /= 4 # don't care that much about electricity, just stand up!
|
||||||
HumanoidBulletEnv.__init__(self, self.robot)
|
HumanoidBulletEnv.__init__(self, self.robot)
|
||||||
|
|
||||||
def create_single_player_scene(self):
|
def create_single_player_scene(self, bullet_client):
|
||||||
s = HumanoidBulletEnv.create_single_player_scene(self)
|
s = HumanoidBulletEnv.create_single_player_scene(self, bullet_client)
|
||||||
s.zero_at_running_strip_start_line = False
|
s.zero_at_running_strip_start_line = False
|
||||||
return s
|
return s
|
||||||
|
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ class ReacherBulletEnv(MJCFBaseBulletEnv):
|
|||||||
self.robot = Reacher()
|
self.robot = Reacher()
|
||||||
MJCFBaseBulletEnv.__init__(self, self.robot)
|
MJCFBaseBulletEnv.__init__(self, self.robot)
|
||||||
|
|
||||||
def create_single_player_scene(self):
|
def create_single_player_scene(self, bullet_client):
|
||||||
return SingleRobotEmptyScene(gravity=0.0, timestep=0.0165, frame_skip=1)
|
return SingleRobotEmptyScene(bullet_client, gravity=0.0, timestep=0.0165, frame_skip=1)
|
||||||
|
|
||||||
def _step(self, a):
|
def _step(self, a):
|
||||||
assert (not self.scene.multiplayer)
|
assert (not self.scene.multiplayer)
|
||||||
@@ -43,8 +43,8 @@ class PusherBulletEnv(MJCFBaseBulletEnv):
|
|||||||
self.robot = Pusher()
|
self.robot = Pusher()
|
||||||
MJCFBaseBulletEnv.__init__(self, self.robot)
|
MJCFBaseBulletEnv.__init__(self, self.robot)
|
||||||
|
|
||||||
def create_single_player_scene(self):
|
def create_single_player_scene(self, bullet_client):
|
||||||
return SingleRobotEmptyScene(gravity=9.81, timestep=0.0020, frame_skip=5)
|
return SingleRobotEmptyScene(bullet_client, gravity=9.81, timestep=0.0020, frame_skip=5)
|
||||||
|
|
||||||
def _step(self, a):
|
def _step(self, a):
|
||||||
self.robot.apply_action(a)
|
self.robot.apply_action(a)
|
||||||
@@ -100,8 +100,8 @@ class StrikerBulletEnv(MJCFBaseBulletEnv):
|
|||||||
self._min_strike_dist = np.inf
|
self._min_strike_dist = np.inf
|
||||||
self.strike_threshold = 0.1
|
self.strike_threshold = 0.1
|
||||||
|
|
||||||
def create_single_player_scene(self):
|
def create_single_player_scene(self, bullet_client):
|
||||||
return SingleRobotEmptyScene(gravity=9.81, timestep=0.0020, frame_skip=5)
|
return SingleRobotEmptyScene(bullet_client, gravity=9.81, timestep=0.0020, frame_skip=5)
|
||||||
|
|
||||||
def _step(self, a):
|
def _step(self, a):
|
||||||
self.robot.apply_action(a)
|
self.robot.apply_action(a)
|
||||||
@@ -173,8 +173,8 @@ class ThrowerBulletEnv(MJCFBaseBulletEnv):
|
|||||||
self.robot = Thrower()
|
self.robot = Thrower()
|
||||||
MJCFBaseBulletEnv.__init__(self, self.robot)
|
MJCFBaseBulletEnv.__init__(self, self.robot)
|
||||||
|
|
||||||
def create_single_player_scene(self):
|
def create_single_player_scene(self, bullet_client):
|
||||||
return SingleRobotEmptyScene(gravity=0.0, timestep=0.0020, frame_skip=5)
|
return SingleRobotEmptyScene(bullet_client, gravity=0.0, timestep=0.0020, frame_skip=5)
|
||||||
|
|
||||||
def _step(self, a):
|
def _step(self, a):
|
||||||
self.robot.apply_action(a)
|
self.robot.apply_action(a)
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ from .env_bases import MJCFBaseBulletEnv
|
|||||||
from robot_pendula import InvertedPendulum, InvertedPendulumSwingup, InvertedDoublePendulum
|
from robot_pendula import InvertedPendulum, InvertedPendulumSwingup, InvertedDoublePendulum
|
||||||
import gym, gym.spaces, gym.utils, gym.utils.seeding
|
import gym, gym.spaces, gym.utils, gym.utils.seeding
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import pybullet as p
|
import pybullet
|
||||||
import os, sys
|
import os, sys
|
||||||
|
|
||||||
class InvertedPendulumBulletEnv(MJCFBaseBulletEnv):
|
class InvertedPendulumBulletEnv(MJCFBaseBulletEnv):
|
||||||
@@ -12,8 +12,8 @@ class InvertedPendulumBulletEnv(MJCFBaseBulletEnv):
|
|||||||
MJCFBaseBulletEnv.__init__(self, self.robot)
|
MJCFBaseBulletEnv.__init__(self, self.robot)
|
||||||
self.stateId=-1
|
self.stateId=-1
|
||||||
|
|
||||||
def create_single_player_scene(self):
|
def create_single_player_scene(self, bullet_client):
|
||||||
return SingleRobotEmptyScene(gravity=9.8, timestep=0.0165, frame_skip=1)
|
return SingleRobotEmptyScene(bullet_client, gravity=9.8, timestep=0.0165, frame_skip=1)
|
||||||
|
|
||||||
def _reset(self):
|
def _reset(self):
|
||||||
if (self.stateId>=0):
|
if (self.stateId>=0):
|
||||||
@@ -21,7 +21,7 @@ class InvertedPendulumBulletEnv(MJCFBaseBulletEnv):
|
|||||||
p.restoreState(self.stateId)
|
p.restoreState(self.stateId)
|
||||||
r = MJCFBaseBulletEnv._reset(self)
|
r = MJCFBaseBulletEnv._reset(self)
|
||||||
if (self.stateId<0):
|
if (self.stateId<0):
|
||||||
self.stateId = p.saveState()
|
self.stateId = self._p.saveState()
|
||||||
#print("InvertedPendulumBulletEnv reset self.stateId=",self.stateId)
|
#print("InvertedPendulumBulletEnv reset self.stateId=",self.stateId)
|
||||||
return r
|
return r
|
||||||
|
|
||||||
@@ -54,15 +54,15 @@ class InvertedDoublePendulumBulletEnv(MJCFBaseBulletEnv):
|
|||||||
self.robot = InvertedDoublePendulum()
|
self.robot = InvertedDoublePendulum()
|
||||||
MJCFBaseBulletEnv.__init__(self, self.robot)
|
MJCFBaseBulletEnv.__init__(self, self.robot)
|
||||||
self.stateId = -1
|
self.stateId = -1
|
||||||
def create_single_player_scene(self):
|
def create_single_player_scene(self, bullet_client):
|
||||||
return SingleRobotEmptyScene(gravity=9.8, timestep=0.0165, frame_skip=1)
|
return SingleRobotEmptyScene(bullet_client, gravity=9.8, timestep=0.0165, frame_skip=1)
|
||||||
|
|
||||||
def _reset(self):
|
def _reset(self):
|
||||||
if (self.stateId>=0):
|
if (self.stateId>=0):
|
||||||
p.restoreState(self.stateId)
|
p.restoreState(self.stateId)
|
||||||
r = MJCFBaseBulletEnv._reset(self)
|
r = MJCFBaseBulletEnv._reset(self)
|
||||||
if (self.stateId<0):
|
if (self.stateId<0):
|
||||||
self.stateId = p.saveState()
|
self.stateId = self._p.saveState()
|
||||||
return r
|
return r
|
||||||
|
|
||||||
def _step(self, a):
|
def _step(self, a):
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import pybullet as p
|
import pybullet
|
||||||
import gym, gym.spaces, gym.utils
|
import gym, gym.spaces, gym.utils
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import os, inspect
|
import os, inspect
|
||||||
@@ -14,8 +14,7 @@ class XmlBasedRobot:
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
self_collision = True
|
self_collision = True
|
||||||
def __init__(self, robot_name, action_dim, obs_dim, self_collision):
|
def __init__(self, robot_name, action_dim, obs_dim, self_collision):
|
||||||
#def __init__(self, model_xml, robot_name, action_dim, obs_dim):
|
|
||||||
self.parts = None
|
self.parts = None
|
||||||
self.objects = []
|
self.objects = []
|
||||||
self.jdict = None
|
self.jdict = None
|
||||||
@@ -31,7 +30,9 @@ class XmlBasedRobot:
|
|||||||
self.robot_name = robot_name
|
self.robot_name = robot_name
|
||||||
self.self_collision = self_collision
|
self.self_collision = self_collision
|
||||||
|
|
||||||
def addToScene(self, bodies):
|
def addToScene(self, bullet_client, bodies):
|
||||||
|
self._p = bullet_client
|
||||||
|
|
||||||
if self.parts is not None:
|
if self.parts is not None:
|
||||||
parts = self.parts
|
parts = self.parts
|
||||||
else:
|
else:
|
||||||
@@ -52,14 +53,14 @@ class XmlBasedRobot:
|
|||||||
|
|
||||||
dump = 0
|
dump = 0
|
||||||
for i in range(len(bodies)):
|
for i in range(len(bodies)):
|
||||||
if p.getNumJoints(bodies[i]) == 0:
|
if self._p.getNumJoints(bodies[i]) == 0:
|
||||||
part_name, robot_name = p.getBodyInfo(bodies[i], 0)
|
part_name, robot_name = self._p.getBodyInfo(bodies[i])
|
||||||
self.robot_name = robot_name.decode("utf8")
|
self.robot_name = robot_name.decode("utf8")
|
||||||
part_name = part_name.decode("utf8")
|
part_name = part_name.decode("utf8")
|
||||||
parts[part_name] = BodyPart(part_name, bodies, i, -1)
|
parts[part_name] = BodyPart(self._p, part_name, bodies, i, -1)
|
||||||
for j in range(p.getNumJoints(bodies[i])):
|
for j in range(self._p.getNumJoints(bodies[i])):
|
||||||
p.setJointMotorControl2(bodies[i],j,p.POSITION_CONTROL,positionGain=0.1,velocityGain=0.1,force=0)
|
self._p.setJointMotorControl2(bodies[i],j,pybullet.POSITION_CONTROL,positionGain=0.1,velocityGain=0.1,force=0)
|
||||||
jointInfo = p.getJointInfo(bodies[i], j)
|
jointInfo = self._p.getJointInfo(bodies[i], j)
|
||||||
joint_name=jointInfo[1]
|
joint_name=jointInfo[1]
|
||||||
part_name=jointInfo[12]
|
part_name=jointInfo[12]
|
||||||
|
|
||||||
@@ -69,21 +70,21 @@ class XmlBasedRobot:
|
|||||||
if dump: print("ROBOT PART '%s'" % part_name)
|
if dump: print("ROBOT PART '%s'" % part_name)
|
||||||
if dump: print("ROBOT JOINT '%s'" % joint_name) # limits = %+0.2f..%+0.2f effort=%0.3f speed=%0.3f" % ((joint_name,) + j.limits()) )
|
if dump: print("ROBOT JOINT '%s'" % joint_name) # limits = %+0.2f..%+0.2f effort=%0.3f speed=%0.3f" % ((joint_name,) + j.limits()) )
|
||||||
|
|
||||||
parts[part_name] = BodyPart(part_name, bodies, i, j)
|
parts[part_name] = BodyPart(self._p, part_name, bodies, i, j)
|
||||||
|
|
||||||
if part_name == self.robot_name:
|
if part_name == self.robot_name:
|
||||||
self.robot_body = parts[part_name]
|
self.robot_body = parts[part_name]
|
||||||
|
|
||||||
if i == 0 and j == 0 and self.robot_body is None: # if nothing else works, we take this as robot_body
|
if i == 0 and j == 0 and self.robot_body is None: # if nothing else works, we take this as robot_body
|
||||||
parts[self.robot_name] = BodyPart(self.robot_name, bodies, 0, -1)
|
parts[self.robot_name] = BodyPart(self._p, self.robot_name, bodies, 0, -1)
|
||||||
self.robot_body = parts[self.robot_name]
|
self.robot_body = parts[self.robot_name]
|
||||||
|
|
||||||
if joint_name[:6] == "ignore":
|
if joint_name[:6] == "ignore":
|
||||||
Joint(joint_name, bodies, i, j).disable_motor()
|
Joint(self._p, joint_name, bodies, i, j).disable_motor()
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if joint_name[:8] != "jointfix":
|
if joint_name[:8] != "jointfix":
|
||||||
joints[joint_name] = Joint(joint_name, bodies, i, j)
|
joints[joint_name] = Joint(self._p, joint_name, bodies, i, j)
|
||||||
ordered_joints.append(joints[joint_name])
|
ordered_joints.append(joints[joint_name])
|
||||||
|
|
||||||
joints[joint_name].power_coef = 100.0
|
joints[joint_name].power_coef = 100.0
|
||||||
@@ -103,23 +104,24 @@ class MJCFBasedRobot(XmlBasedRobot):
|
|||||||
Base class for mujoco .xml based agents.
|
Base class for mujoco .xml based agents.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, model_xml, robot_name, action_dim, obs_dim, self_collision=True):
|
def __init__(self, model_xml, robot_name, action_dim, obs_dim, self_collision=True):
|
||||||
XmlBasedRobot.__init__(self, robot_name, action_dim, obs_dim, self_collision)
|
XmlBasedRobot.__init__(self, robot_name, action_dim, obs_dim, self_collision)
|
||||||
self.model_xml = model_xml
|
self.model_xml = model_xml
|
||||||
self.doneLoading=0
|
self.doneLoading=0
|
||||||
def reset(self):
|
def reset(self, bullet_client):
|
||||||
|
|
||||||
|
|
||||||
|
self._p = bullet_client
|
||||||
|
print("Created bullet_client with id=", self._p._client)
|
||||||
if (self.doneLoading==0):
|
if (self.doneLoading==0):
|
||||||
self.ordered_joints = []
|
self.ordered_joints = []
|
||||||
self.doneLoading=1
|
self.doneLoading=1
|
||||||
if self.self_collision:
|
if self.self_collision:
|
||||||
self.objects = p.loadMJCF(os.path.join(pybullet_data.getDataPath(),"mjcf", self.model_xml), flags=p.URDF_USE_SELF_COLLISION|p.URDF_USE_SELF_COLLISION_EXCLUDE_ALL_PARENTS)
|
self.objects = self._p.loadMJCF(os.path.join(pybullet_data.getDataPath(),"mjcf", self.model_xml), flags=pybullet.URDF_USE_SELF_COLLISION|pybullet.URDF_USE_SELF_COLLISION_EXCLUDE_ALL_PARENTS)
|
||||||
self.parts, self.jdict, self.ordered_joints, self.robot_body = self.addToScene(self.objects )
|
self.parts, self.jdict, self.ordered_joints, self.robot_body = self.addToScene(self._p, self.objects )
|
||||||
else:
|
else:
|
||||||
self.objects = p.loadMJCF(os.path.join(pybullet_data.getDataPath(),"mjcf", self.model_xml))
|
self.objects = self._p.loadMJCF(os.path.join(pybullet_data.getDataPath(),"mjcf", self.model_xml))
|
||||||
self.parts, self.jdict, self.ordered_joints, self.robot_body = self.addToScene(self.objects)
|
self.parts, self.jdict, self.ordered_joints, self.robot_body = self.addToScene(self._p, self.objects)
|
||||||
self.robot_specific_reset()
|
self.robot_specific_reset(self._p)
|
||||||
|
|
||||||
s = self.calc_state() # optimization: calc_state() can calculate something in self.* for calc_potential() to use
|
s = self.calc_state() # optimization: calc_state() can calculate something in self.* for calc_potential() to use
|
||||||
|
|
||||||
@@ -142,26 +144,27 @@ class URDFBasedRobot(XmlBasedRobot):
|
|||||||
self.baseOrientation = baseOrientation
|
self.baseOrientation = baseOrientation
|
||||||
self.fixed_base = fixed_base
|
self.fixed_base = fixed_base
|
||||||
|
|
||||||
def reset(self):
|
def reset(self, bullet_client):
|
||||||
|
self._p = bullet_client
|
||||||
self.ordered_joints = []
|
self.ordered_joints = []
|
||||||
|
|
||||||
print(os.path.join(os.path.dirname(__file__), "data", self.model_urdf))
|
print(os.path.join(os.path.dirname(__file__), "data", self.model_urdf))
|
||||||
|
|
||||||
if self.self_collision:
|
if self.self_collision:
|
||||||
self.parts, self.jdict, self.ordered_joints, self.robot_body = self.addToScene(
|
self.parts, self.jdict, self.ordered_joints, self.robot_body = self.addToScene(self._p,
|
||||||
p.loadURDF(os.path.join(pybullet_data.getDataPath(), self.model_urdf),
|
self._p.loadURDF(os.path.join(pybullet_data.getDataPath(), self.model_urdf),
|
||||||
basePosition=self.basePosition,
|
basePosition=self.basePosition,
|
||||||
baseOrientation=self.baseOrientation,
|
baseOrientation=self.baseOrientation,
|
||||||
useFixedBase=self.fixed_base,
|
useFixedBase=self.fixed_base,
|
||||||
flags=p.URDF_USE_SELF_COLLISION))
|
flags=pybullet.URDF_USE_SELF_COLLISION))
|
||||||
else:
|
else:
|
||||||
self.parts, self.jdict, self.ordered_joints, self.robot_body = self.addToScene(
|
self.parts, self.jdict, self.ordered_joints, self.robot_body = self.addToScene(self._p,
|
||||||
p.loadURDF(os.path.join(pybullet_data.getDataPath(), self.model_urdf),
|
self._p.loadURDF(os.path.join(pybullet_data.getDataPath(), self.model_urdf),
|
||||||
basePosition=self.basePosition,
|
basePosition=self.basePosition,
|
||||||
baseOrientation=self.baseOrientation,
|
baseOrientation=self.baseOrientation,
|
||||||
useFixedBase=self.fixed_base))
|
useFixedBase=self.fixed_base))
|
||||||
|
|
||||||
self.robot_specific_reset()
|
self.robot_specific_reset(self._p)
|
||||||
|
|
||||||
s = self.calc_state() # optimization: calc_state() can calculate something in self.* for calc_potential() to use
|
s = self.calc_state() # optimization: calc_state() can calculate something in self.* for calc_potential() to use
|
||||||
self.potential = self.calc_potential()
|
self.potential = self.calc_potential()
|
||||||
@@ -177,19 +180,21 @@ class SDFBasedRobot(XmlBasedRobot):
|
|||||||
Base class for SDF robots in a Scene.
|
Base class for SDF robots in a Scene.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, model_sdf, robot_name, action_dim, obs_dim, basePosition=[0, 0, 0], baseOrientation=[0, 0, 0, 1], fixed_base=False, self_collision=False):
|
def __init__(self, model_sdf, robot_name, action_dim, obs_dim, basePosition=[0, 0, 0], baseOrientation=[0, 0, 0, 1], fixed_base=False, self_collision=False):
|
||||||
XmlBasedRobot.__init__(self, robot_name, action_dim, obs_dim, self_collision)
|
XmlBasedRobot.__init__(self, robot_name, action_dim, obs_dim, self_collision)
|
||||||
|
|
||||||
self.model_sdf = model_sdf
|
self.model_sdf = model_sdf
|
||||||
self.fixed_base = fixed_base
|
self.fixed_base = fixed_base
|
||||||
|
|
||||||
def reset(self):
|
def reset(self, bullet_client):
|
||||||
|
self._p = bullet_client
|
||||||
|
|
||||||
self.ordered_joints = []
|
self.ordered_joints = []
|
||||||
|
|
||||||
self.parts, self.jdict, self.ordered_joints, self.robot_body = self.addToScene( # TODO: Not sure if this works, try it with kuka
|
self.parts, self.jdict, self.ordered_joints, self.robot_body = self.addToScene(self._p, # TODO: Not sure if this works, try it with kuka
|
||||||
p.loadSDF(os.path.join("models_robot", self.model_sdf)))
|
self._p.loadSDF(os.path.join("models_robot", self.model_sdf)))
|
||||||
|
|
||||||
self.robot_specific_reset()
|
self.robot_specific_reset(self._p)
|
||||||
|
|
||||||
s = self.calc_state() # optimization: calc_state() can calculate something in self.* for calc_potential() to use
|
s = self.calc_state() # optimization: calc_state() can calculate something in self.* for calc_potential() to use
|
||||||
self.potential = self.calc_potential()
|
self.potential = self.calc_potential()
|
||||||
@@ -208,14 +213,15 @@ class Pose_Helper: # dummy class to comply to original interface
|
|||||||
return self.body_part.current_position()
|
return self.body_part.current_position()
|
||||||
|
|
||||||
def rpy(self):
|
def rpy(self):
|
||||||
return p.getEulerFromQuaternion(self.body_part.current_orientation())
|
return pybullet.getEulerFromQuaternion(self.body_part.current_orientation())
|
||||||
|
|
||||||
def orientation(self):
|
def orientation(self):
|
||||||
return self.body_part.current_orientation()
|
return self.body_part.current_orientation()
|
||||||
|
|
||||||
class BodyPart:
|
class BodyPart:
|
||||||
def __init__(self, body_name, bodies, bodyIndex, bodyPartIndex):
|
def __init__(self, bullet_client, body_name, bodies, bodyIndex, bodyPartIndex):
|
||||||
self.bodies = bodies
|
self.bodies = bodies
|
||||||
|
self._p = bullet_client
|
||||||
self.bodyIndex = bodyIndex
|
self.bodyIndex = bodyIndex
|
||||||
self.bodyPartIndex = bodyPartIndex
|
self.bodyPartIndex = bodyPartIndex
|
||||||
self.initialPosition = self.current_position()
|
self.initialPosition = self.current_position()
|
||||||
@@ -224,9 +230,9 @@ class BodyPart:
|
|||||||
|
|
||||||
def state_fields_of_pose_of(self, body_id, link_id=-1): # a method you will most probably need a lot to get pose and orientation
|
def state_fields_of_pose_of(self, body_id, link_id=-1): # a method you will most probably need a lot to get pose and orientation
|
||||||
if link_id == -1:
|
if link_id == -1:
|
||||||
(x, y, z), (a, b, c, d) = p.getBasePositionAndOrientation(body_id)
|
(x, y, z), (a, b, c, d) = self._p.getBasePositionAndOrientation(body_id)
|
||||||
else:
|
else:
|
||||||
(x, y, z), (a, b, c, d), _, _, _, _ = p.getLinkState(body_id, link_id)
|
(x, y, z), (a, b, c, d), _, _, _, _ = self._p.getLinkState(body_id, link_id)
|
||||||
return np.array([x, y, z, a, b, c, d])
|
return np.array([x, y, z, a, b, c, d])
|
||||||
|
|
||||||
def get_pose(self):
|
def get_pose(self):
|
||||||
@@ -234,9 +240,9 @@ class BodyPart:
|
|||||||
|
|
||||||
def speed(self):
|
def speed(self):
|
||||||
if self.bodyPartIndex == -1:
|
if self.bodyPartIndex == -1:
|
||||||
(vx, vy, vz), _ = p.getBaseVelocity(self.bodies[self.bodyIndex])
|
(vx, vy, vz), _ = self._p.getBaseVelocity(self.bodies[self.bodyIndex])
|
||||||
else:
|
else:
|
||||||
(x,y,z), (a,b,c,d), _,_,_,_, (vx, vy, vz), (vr,vp,vy) = p.getLinkState(self.bodies[self.bodyIndex], self.bodyPartIndex, computeLinkVelocity=1)
|
(x,y,z), (a,b,c,d), _,_,_,_, (vx, vy, vz), (vr,vp,vy) = self._p.getLinkState(self.bodies[self.bodyIndex], self.bodyPartIndex, computeLinkVelocity=1)
|
||||||
return np.array([vx, vy, vz])
|
return np.array([vx, vy, vz])
|
||||||
|
|
||||||
def current_position(self):
|
def current_position(self):
|
||||||
@@ -249,39 +255,40 @@ class BodyPart:
|
|||||||
return self.current_orientation()
|
return self.current_orientation()
|
||||||
|
|
||||||
def reset_position(self, position):
|
def reset_position(self, position):
|
||||||
p.resetBasePositionAndOrientation(self.bodies[self.bodyIndex], position, self.get_orientation())
|
self._p.resetBasePositionAndOrientation(self.bodies[self.bodyIndex], position, self.get_orientation())
|
||||||
|
|
||||||
def reset_orientation(self, orientation):
|
def reset_orientation(self, orientation):
|
||||||
p.resetBasePositionAndOrientation(self.bodies[self.bodyIndex], self.get_position(), orientation)
|
self._p.resetBasePositionAndOrientation(self.bodies[self.bodyIndex], self.get_position(), orientation)
|
||||||
|
|
||||||
def reset_velocity(self, linearVelocity=[0,0,0], angularVelocity =[0,0,0]):
|
def reset_velocity(self, linearVelocity=[0,0,0], angularVelocity =[0,0,0]):
|
||||||
p.resetBaseVelocity(self.bodies[self.bodyIndex], linearVelocity, angularVelocity)
|
self._p.resetBaseVelocity(self.bodies[self.bodyIndex], linearVelocity, angularVelocity)
|
||||||
|
|
||||||
def reset_pose(self, position, orientation):
|
def reset_pose(self, position, orientation):
|
||||||
p.resetBasePositionAndOrientation(self.bodies[self.bodyIndex], position, orientation)
|
self._p.resetBasePositionAndOrientation(self.bodies[self.bodyIndex], position, orientation)
|
||||||
|
|
||||||
def pose(self):
|
def pose(self):
|
||||||
return self.bp_pose
|
return self.bp_pose
|
||||||
|
|
||||||
def contact_list(self):
|
def contact_list(self):
|
||||||
return p.getContactPoints(self.bodies[self.bodyIndex], -1, self.bodyPartIndex, -1)
|
return self._p.getContactPoints(self.bodies[self.bodyIndex], -1, self.bodyPartIndex, -1)
|
||||||
|
|
||||||
|
|
||||||
class Joint:
|
class Joint:
|
||||||
def __init__(self, joint_name, bodies, bodyIndex, jointIndex):
|
def __init__(self, bullet_client, joint_name, bodies, bodyIndex, jointIndex):
|
||||||
self.bodies = bodies
|
self.bodies = bodies
|
||||||
|
self._p = bullet_client
|
||||||
self.bodyIndex = bodyIndex
|
self.bodyIndex = bodyIndex
|
||||||
self.jointIndex = jointIndex
|
self.jointIndex = jointIndex
|
||||||
self.joint_name = joint_name
|
self.joint_name = joint_name
|
||||||
|
|
||||||
jointInfo = p.getJointInfo(self.bodies[self.bodyIndex], self.jointIndex)
|
jointInfo = self._p.getJointInfo(self.bodies[self.bodyIndex], self.jointIndex)
|
||||||
self.lowerLimit = jointInfo[8]
|
self.lowerLimit = jointInfo[8]
|
||||||
self.upperLimit = jointInfo[9]
|
self.upperLimit = jointInfo[9]
|
||||||
|
|
||||||
self.power_coeff = 0
|
self.power_coeff = 0
|
||||||
|
|
||||||
def set_state(self, x, vx):
|
def set_state(self, x, vx):
|
||||||
p.resetJointState(self.bodies[self.bodyIndex], self.jointIndex, x, vx)
|
self._p.resetJointState(self.bodies[self.bodyIndex], self.jointIndex, x, vx)
|
||||||
|
|
||||||
def current_position(self): # just some synonyme method
|
def current_position(self): # just some synonyme method
|
||||||
return self.get_state()
|
return self.get_state()
|
||||||
@@ -295,7 +302,7 @@ class Joint:
|
|||||||
)
|
)
|
||||||
|
|
||||||
def get_state(self):
|
def get_state(self):
|
||||||
x, vx,_,_ = p.getJointState(self.bodies[self.bodyIndex],self.jointIndex)
|
x, vx,_,_ = self._p.getJointState(self.bodies[self.bodyIndex],self.jointIndex)
|
||||||
return x, vx
|
return x, vx
|
||||||
|
|
||||||
def get_position(self):
|
def get_position(self):
|
||||||
@@ -311,23 +318,23 @@ class Joint:
|
|||||||
return vx
|
return vx
|
||||||
|
|
||||||
def set_position(self, position):
|
def set_position(self, position):
|
||||||
p.setJointMotorControl2(self.bodies[self.bodyIndex],self.jointIndex,p.POSITION_CONTROL, targetPosition=position)
|
self._p.setJointMotorControl2(self.bodies[self.bodyIndex],self.jointIndex,pybullet.POSITION_CONTROL, targetPosition=position)
|
||||||
|
|
||||||
def set_velocity(self, velocity):
|
def set_velocity(self, velocity):
|
||||||
p.setJointMotorControl2(self.bodies[self.bodyIndex],self.jointIndex,p.VELOCITY_CONTROL, targetVelocity=velocity)
|
self._p.setJointMotorControl2(self.bodies[self.bodyIndex],self.jointIndex,pybullet.VELOCITY_CONTROL, targetVelocity=velocity)
|
||||||
|
|
||||||
def set_motor_torque(self, torque): # just some synonyme method
|
def set_motor_torque(self, torque): # just some synonyme method
|
||||||
self.set_torque(torque)
|
self.set_torque(torque)
|
||||||
|
|
||||||
def set_torque(self, torque):
|
def set_torque(self, torque):
|
||||||
p.setJointMotorControl2(bodyIndex=self.bodies[self.bodyIndex], jointIndex=self.jointIndex, controlMode=p.TORQUE_CONTROL, force=torque) #, positionGain=0.1, velocityGain=0.1)
|
self._p.setJointMotorControl2(bodyIndex=self.bodies[self.bodyIndex], jointIndex=self.jointIndex, controlMode=pybullet.TORQUE_CONTROL, force=torque) #, positionGain=0.1, velocityGain=0.1)
|
||||||
|
|
||||||
def reset_current_position(self, position, velocity): # just some synonyme method
|
def reset_current_position(self, position, velocity): # just some synonyme method
|
||||||
self.reset_position(position, velocity)
|
self.reset_position(position, velocity)
|
||||||
|
|
||||||
def reset_position(self, position, velocity):
|
def reset_position(self, position, velocity):
|
||||||
p.resetJointState(self.bodies[self.bodyIndex],self.jointIndex,targetValue=position, targetVelocity=velocity)
|
self._p.resetJointState(self.bodies[self.bodyIndex],self.jointIndex,targetValue=position, targetVelocity=velocity)
|
||||||
self.disable_motor()
|
self.disable_motor()
|
||||||
|
|
||||||
def disable_motor(self):
|
def disable_motor(self):
|
||||||
p.setJointMotorControl2(self.bodies[self.bodyIndex],self.jointIndex,controlMode=p.POSITION_CONTROL, targetPosition=0, targetVelocity=0, positionGain=0.1, velocityGain=0.1, force=0)
|
self._p.setJointMotorControl2(self.bodies[self.bodyIndex],self.jointIndex,controlMode=pybullet.POSITION_CONTROL, targetPosition=0, targetVelocity=0, positionGain=0.1, velocityGain=0.1, force=0)
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
from robot_bases import XmlBasedRobot, MJCFBasedRobot, URDFBasedRobot
|
from robot_bases import XmlBasedRobot, MJCFBasedRobot, URDFBasedRobot
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import pybullet as p
|
import pybullet
|
||||||
import os
|
import os
|
||||||
import pybullet_data
|
import pybullet_data
|
||||||
from robot_bases import BodyPart
|
from robot_bases import BodyPart
|
||||||
|
|
||||||
class WalkerBase(MJCFBasedRobot):
|
class WalkerBase(MJCFBasedRobot):
|
||||||
def __init__(self, fn, robot_name, action_dim, obs_dim, power):
|
def __init__(self, fn, robot_name, action_dim, obs_dim, power):
|
||||||
MJCFBasedRobot.__init__(self, fn, robot_name, action_dim, obs_dim)
|
MJCFBasedRobot.__init__(self, fn, robot_name, action_dim, obs_dim)
|
||||||
self.power = power
|
self.power = power
|
||||||
self.camera_x = 0
|
self.camera_x = 0
|
||||||
@@ -15,7 +15,8 @@ class WalkerBase(MJCFBasedRobot):
|
|||||||
self.walk_target_y = 0
|
self.walk_target_y = 0
|
||||||
self.body_xyz=[0,0,0]
|
self.body_xyz=[0,0,0]
|
||||||
|
|
||||||
def robot_specific_reset(self):
|
def robot_specific_reset(self, bullet_client):
|
||||||
|
self._p = bullet_client
|
||||||
for j in self.ordered_joints:
|
for j in self.ordered_joints:
|
||||||
j.reset_current_position(self.np_random.uniform(low=-0.1, high=0.1), 0)
|
j.reset_current_position(self.np_random.uniform(low=-0.1, high=0.1), 0)
|
||||||
|
|
||||||
@@ -94,13 +95,13 @@ class Walker2D(WalkerBase):
|
|||||||
foot_list = ["foot", "foot_left"]
|
foot_list = ["foot", "foot_left"]
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
WalkerBase.__init__(self, "walker2d.xml", "torso", action_dim=6, obs_dim=22, power=0.40)
|
WalkerBase.__init__(self, "walker2d.xml", "torso", action_dim=6, obs_dim=22, power=0.40)
|
||||||
|
|
||||||
def alive_bonus(self, z, pitch):
|
def alive_bonus(self, z, pitch):
|
||||||
return +1 if z > 0.8 and abs(pitch) < 1.0 else -1
|
return +1 if z > 0.8 and abs(pitch) < 1.0 else -1
|
||||||
|
|
||||||
def robot_specific_reset(self):
|
def robot_specific_reset(self, bullet_client):
|
||||||
WalkerBase.robot_specific_reset(self)
|
WalkerBase.robot_specific_reset(self, bullet_client)
|
||||||
for n in ["foot_joint", "foot_left_joint"]:
|
for n in ["foot_joint", "foot_left_joint"]:
|
||||||
self.jdict[n].power_coef = 30.0
|
self.jdict[n].power_coef = 30.0
|
||||||
|
|
||||||
@@ -140,11 +141,11 @@ class Humanoid(WalkerBase):
|
|||||||
foot_list = ["right_foot", "left_foot"] # "left_hand", "right_hand"
|
foot_list = ["right_foot", "left_foot"] # "left_hand", "right_hand"
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
WalkerBase.__init__(self, 'humanoid_symmetric.xml', 'torso', action_dim=17, obs_dim=44, power=0.41)
|
WalkerBase.__init__(self, 'humanoid_symmetric.xml', 'torso', action_dim=17, obs_dim=44, power=0.41)
|
||||||
# 17 joints, 4 of them important for walking (hip, knee), others may as well be turned off, 17/4 = 4.25
|
# 17 joints, 4 of them important for walking (hip, knee), others may as well be turned off, 17/4 = 4.25
|
||||||
|
|
||||||
def robot_specific_reset(self):
|
def robot_specific_reset(self, bullet_client):
|
||||||
WalkerBase.robot_specific_reset(self)
|
WalkerBase.robot_specific_reset(self, bullet_client)
|
||||||
self.motor_names = ["abdomen_z", "abdomen_y", "abdomen_x"]
|
self.motor_names = ["abdomen_z", "abdomen_y", "abdomen_x"]
|
||||||
self.motor_power = [100, 100, 100]
|
self.motor_power = [100, 100, 100]
|
||||||
self.motor_names += ["right_hip_x", "right_hip_z", "right_hip_y", "right_knee"]
|
self.motor_names += ["right_hip_x", "right_hip_z", "right_hip_y", "right_knee"]
|
||||||
@@ -192,29 +193,29 @@ class Humanoid(WalkerBase):
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
def get_cube(x, y, z):
|
def get_cube(_p, x, y, z):
|
||||||
body = p.loadURDF(os.path.join(pybullet_data.getDataPath(),"cube_small.urdf"), x, y, z)
|
body = _p.loadURDF(os.path.join(pybullet_data.getDataPath(),"cube_small.urdf"), [x, y, z])
|
||||||
p.changeDynamics(body,-1, mass=1.2)#match Roboschool
|
_p.changeDynamics(body,-1, mass=1.2)#match Roboschool
|
||||||
part_name, _ = p.getBodyInfo(body, 0)
|
part_name, _ = _p.getBodyInfo(body)
|
||||||
part_name = part_name.decode("utf8")
|
part_name = part_name.decode("utf8")
|
||||||
bodies = [body]
|
bodies = [body]
|
||||||
return BodyPart(part_name, bodies, 0, -1)
|
return BodyPart(_p, part_name, bodies, 0, -1)
|
||||||
|
|
||||||
|
|
||||||
def get_sphere(x, y, z):
|
def get_sphere(_p, x, y, z):
|
||||||
body = p.loadURDF(os.path.join(pybullet_data.getDataPath(),"sphere2red_nocol.urdf"), x, y, z)
|
body = _p.loadURDF(os.path.join(pybullet_data.getDataPath(),"sphere2red_nocol.urdf"), [x, y, z])
|
||||||
part_name, _ = p.getBodyInfo(body, 0)
|
part_name, _ = _p.getBodyInfo(body)
|
||||||
part_name = part_name.decode("utf8")
|
part_name = part_name.decode("utf8")
|
||||||
bodies = [body]
|
bodies = [body]
|
||||||
return BodyPart(part_name, bodies, 0, -1)
|
return BodyPart(_p, part_name, bodies, 0, -1)
|
||||||
|
|
||||||
class HumanoidFlagrun(Humanoid):
|
class HumanoidFlagrun(Humanoid):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
Humanoid.__init__(self)
|
Humanoid.__init__(self)
|
||||||
self.flag = None
|
self.flag = None
|
||||||
|
|
||||||
def robot_specific_reset(self):
|
def robot_specific_reset(self, bullet_client):
|
||||||
Humanoid.robot_specific_reset(self)
|
Humanoid.robot_specific_reset(self, bullet_client)
|
||||||
self.flag_reposition()
|
self.flag_reposition()
|
||||||
|
|
||||||
def flag_reposition(self):
|
def flag_reposition(self):
|
||||||
@@ -228,9 +229,9 @@ class HumanoidFlagrun(Humanoid):
|
|||||||
#for b in self.flag.bodies:
|
#for b in self.flag.bodies:
|
||||||
# print("remove body uid",b)
|
# print("remove body uid",b)
|
||||||
# p.removeBody(b)
|
# p.removeBody(b)
|
||||||
p.resetBasePositionAndOrientation(self.flag.bodies[0],[self.walk_target_x, self.walk_target_y, 0.7],[0,0,0,1])
|
self._p.resetBasePositionAndOrientation(self.flag.bodies[0],[self.walk_target_x, self.walk_target_y, 0.7],[0,0,0,1])
|
||||||
else:
|
else:
|
||||||
self.flag = get_sphere(self.walk_target_x, self.walk_target_y, 0.7)
|
self.flag = get_sphere(self._p, self.walk_target_x, self.walk_target_y, 0.7)
|
||||||
self.flag_timeout = 600/self.scene.frame_skip #match Roboschool
|
self.flag_timeout = 600/self.scene.frame_skip #match Roboschool
|
||||||
|
|
||||||
def calc_state(self):
|
def calc_state(self):
|
||||||
@@ -250,14 +251,15 @@ class HumanoidFlagrunHarder(HumanoidFlagrun):
|
|||||||
self.aggressive_cube = None
|
self.aggressive_cube = None
|
||||||
self.frame = 0
|
self.frame = 0
|
||||||
|
|
||||||
def robot_specific_reset(self):
|
def robot_specific_reset(self, bullet_client):
|
||||||
HumanoidFlagrun.robot_specific_reset(self)
|
|
||||||
|
HumanoidFlagrun.robot_specific_reset(self, bullet_client)
|
||||||
|
|
||||||
self.frame = 0
|
self.frame = 0
|
||||||
if (self.aggressive_cube):
|
if (self.aggressive_cube):
|
||||||
p.resetBasePositionAndOrientation(self.aggressive_cube.bodies[0],[-1.5,0,0.05],[0,0,0,1])
|
self._p.resetBasePositionAndOrientation(self.aggressive_cube.bodies[0],[-1.5,0,0.05],[0,0,0,1])
|
||||||
else:
|
else:
|
||||||
self.aggressive_cube = get_cube(-1.5,0,0.05)
|
self.aggressive_cube = get_cube(self._p, -1.5,0,0.05)
|
||||||
self.on_ground_frame_counter = 0
|
self.on_ground_frame_counter = 0
|
||||||
self.crawl_start_potential = None
|
self.crawl_start_potential = None
|
||||||
self.crawl_ignored_potential = 0.0
|
self.crawl_ignored_potential = 0.0
|
||||||
|
|||||||
@@ -6,7 +6,8 @@ class InvertedPendulum(MJCFBasedRobot):
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
MJCFBasedRobot.__init__(self, 'inverted_pendulum.xml', 'cart', action_dim=1, obs_dim=5)
|
MJCFBasedRobot.__init__(self, 'inverted_pendulum.xml', 'cart', action_dim=1, obs_dim=5)
|
||||||
|
|
||||||
def robot_specific_reset(self):
|
def robot_specific_reset(self, bullet_client):
|
||||||
|
self._p = bullet_client
|
||||||
self.pole = self.parts["pole"]
|
self.pole = self.parts["pole"]
|
||||||
self.slider = self.jdict["slider"]
|
self.slider = self.jdict["slider"]
|
||||||
self.j1 = self.jdict["hinge"]
|
self.j1 = self.jdict["hinge"]
|
||||||
@@ -55,7 +56,8 @@ class InvertedDoublePendulum(MJCFBasedRobot):
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
MJCFBasedRobot.__init__(self, 'inverted_double_pendulum.xml', 'cart', action_dim=1, obs_dim=9)
|
MJCFBasedRobot.__init__(self, 'inverted_double_pendulum.xml', 'cart', action_dim=1, obs_dim=9)
|
||||||
|
|
||||||
def robot_specific_reset(self):
|
def robot_specific_reset(self, bullet_client):
|
||||||
|
self._p = bullet_client
|
||||||
self.pole2 = self.parts["pole2"]
|
self.pole2 = self.parts["pole2"]
|
||||||
self.slider = self.jdict["slider"]
|
self.slider = self.jdict["slider"]
|
||||||
self.j1 = self.jdict["hinge"]
|
self.j1 = self.jdict["hinge"]
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import sys, os
|
import sys, os
|
||||||
sys.path.append(os.path.dirname(__file__))
|
sys.path.append(os.path.dirname(__file__))
|
||||||
import pybullet as p
|
import pybullet
|
||||||
|
|
||||||
import gym
|
import gym
|
||||||
|
|
||||||
@@ -8,13 +8,14 @@ import gym
|
|||||||
class Scene:
|
class Scene:
|
||||||
"A base class for single- and multiplayer scenes"
|
"A base class for single- and multiplayer scenes"
|
||||||
|
|
||||||
def __init__(self, gravity, timestep, frame_skip):
|
def __init__(self, bullet_client, gravity, timestep, frame_skip):
|
||||||
|
self._p = bullet_client
|
||||||
self.np_random, seed = gym.utils.seeding.np_random(None)
|
self.np_random, seed = gym.utils.seeding.np_random(None)
|
||||||
self.timestep = timestep
|
self.timestep = timestep
|
||||||
self.frame_skip = frame_skip
|
self.frame_skip = frame_skip
|
||||||
|
|
||||||
self.dt = self.timestep * self.frame_skip
|
self.dt = self.timestep * self.frame_skip
|
||||||
self.cpp_world = World(gravity, timestep, frame_skip)
|
self.cpp_world = World(self._p, gravity, timestep, frame_skip)
|
||||||
|
|
||||||
self.test_window_still_open = True # or never opened
|
self.test_window_still_open = True # or never opened
|
||||||
self.human_render_detected = False # if user wants render("human"), we open test window
|
self.human_render_detected = False # if user wants render("human"), we open test window
|
||||||
@@ -55,7 +56,8 @@ class SingleRobotEmptyScene(Scene):
|
|||||||
|
|
||||||
class World:
|
class World:
|
||||||
|
|
||||||
def __init__(self, gravity, timestep, frame_skip):
|
def __init__(self, bullet_client, gravity, timestep, frame_skip):
|
||||||
|
self._p = bullet_client
|
||||||
self.gravity = gravity
|
self.gravity = gravity
|
||||||
self.timestep = timestep
|
self.timestep = timestep
|
||||||
self.frame_skip = frame_skip
|
self.frame_skip = frame_skip
|
||||||
@@ -65,12 +67,12 @@ class World:
|
|||||||
|
|
||||||
def clean_everything(self):
|
def clean_everything(self):
|
||||||
#p.resetSimulation()
|
#p.resetSimulation()
|
||||||
p.setGravity(0, 0, -self.gravity)
|
self._p.setGravity(0, 0, -self.gravity)
|
||||||
p.setDefaultContactERP(0.9)
|
self._p.setDefaultContactERP(0.9)
|
||||||
#print("self.numSolverIterations=",self.numSolverIterations)
|
#print("self.numSolverIterations=",self.numSolverIterations)
|
||||||
p.setPhysicsEngineParameter(fixedTimeStep=self.timestep*self.frame_skip, numSolverIterations=self.numSolverIterations, numSubSteps=self.frame_skip)
|
self._p.setPhysicsEngineParameter(fixedTimeStep=self.timestep*self.frame_skip, numSolverIterations=self.numSolverIterations, numSubSteps=self.frame_skip)
|
||||||
|
|
||||||
def step(self, frame_skip):
|
def step(self, frame_skip):
|
||||||
p.stepSimulation()
|
self._p.stepSimulation()
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import pybullet_data
|
|||||||
|
|
||||||
|
|
||||||
from pybullet_envs.scene_abstract import Scene
|
from pybullet_envs.scene_abstract import Scene
|
||||||
import pybullet as p
|
import pybullet
|
||||||
|
|
||||||
|
|
||||||
class StadiumScene(Scene):
|
class StadiumScene(Scene):
|
||||||
@@ -15,8 +15,8 @@ class StadiumScene(Scene):
|
|||||||
stadium_halfwidth = 50*0.25 # FOOBALL_FIELD_HALFWID
|
stadium_halfwidth = 50*0.25 # FOOBALL_FIELD_HALFWID
|
||||||
stadiumLoaded=0
|
stadiumLoaded=0
|
||||||
|
|
||||||
def episode_restart(self):
|
def episode_restart(self, bullet_client):
|
||||||
|
self._p = bullet_client
|
||||||
Scene.episode_restart(self) # contains cpp_world.clean_everything()
|
Scene.episode_restart(self) # contains cpp_world.clean_everything()
|
||||||
if (self.stadiumLoaded==0):
|
if (self.stadiumLoaded==0):
|
||||||
self.stadiumLoaded=1
|
self.stadiumLoaded=1
|
||||||
@@ -26,17 +26,17 @@ class StadiumScene(Scene):
|
|||||||
# stadium_pose.set_xyz(27, 21, 0) # see RUN_STARTLINE, RUN_RAD constants
|
# stadium_pose.set_xyz(27, 21, 0) # see RUN_STARTLINE, RUN_RAD constants
|
||||||
|
|
||||||
filename = os.path.join(pybullet_data.getDataPath(),"plane_stadium.sdf")
|
filename = os.path.join(pybullet_data.getDataPath(),"plane_stadium.sdf")
|
||||||
self.ground_plane_mjcf=p.loadSDF(filename)
|
self.ground_plane_mjcf=self._p.loadSDF(filename)
|
||||||
#filename = os.path.join(pybullet_data.getDataPath(),"stadium_no_collision.sdf")
|
#filename = os.path.join(pybullet_data.getDataPath(),"stadium_no_collision.sdf")
|
||||||
#self.ground_plane_mjcf = p.loadSDF(filename)
|
#self.ground_plane_mjcf = self._p.loadSDF(filename)
|
||||||
#
|
#
|
||||||
for i in self.ground_plane_mjcf:
|
for i in self.ground_plane_mjcf:
|
||||||
p.changeDynamics(i,-1,lateralFriction=0.8, restitution=0.5)
|
self._p.changeDynamics(i,-1,lateralFriction=0.8, restitution=0.5)
|
||||||
p.changeVisualShape(i,-1,rgbaColor=[1,1,1,0.8])
|
self._p.changeVisualShape(i,-1,rgbaColor=[1,1,1,0.8])
|
||||||
p.configureDebugVisualizer(p.COV_ENABLE_PLANAR_REFLECTION,1)
|
self._p.configureDebugVisualizer(pybullet.COV_ENABLE_PLANAR_REFLECTION,1)
|
||||||
|
|
||||||
# for j in range(p.getNumJoints(i)):
|
# for j in range(p.getNumJoints(i)):
|
||||||
# p.changeDynamics(i,j,lateralFriction=0)
|
# self._p.changeDynamics(i,j,lateralFriction=0)
|
||||||
#despite the name (stadium_no_collision), it DID have collision, so don't add duplicate ground
|
#despite the name (stadium_no_collision), it DID have collision, so don't add duplicate ground
|
||||||
|
|
||||||
class SinglePlayerStadiumScene(StadiumScene):
|
class SinglePlayerStadiumScene(StadiumScene):
|
||||||
|
|||||||
2
setup.py
2
setup.py
@@ -450,7 +450,7 @@ print("-----")
|
|||||||
|
|
||||||
setup(
|
setup(
|
||||||
name = 'pybullet',
|
name = 'pybullet',
|
||||||
version='1.9.6',
|
version='1.9.8',
|
||||||
description='Official Python Interface for the Bullet Physics SDK specialized for Robotics Simulation and Reinforcement Learning',
|
description='Official Python Interface for the Bullet Physics SDK specialized for Robotics Simulation and Reinforcement Learning',
|
||||||
long_description='pybullet is an easy to use Python module for physics simulation, robotics and deep reinforcement learning based on the Bullet Physics SDK. With pybullet you can load articulated bodies from URDF, SDF and other file formats. pybullet provides forward dynamics simulation, inverse dynamics computation, forward and inverse kinematics and collision detection and ray intersection queries. Aside from physics simulation, pybullet supports to rendering, with a CPU renderer and OpenGL visualization and support for virtual reality headsets.',
|
long_description='pybullet is an easy to use Python module for physics simulation, robotics and deep reinforcement learning based on the Bullet Physics SDK. With pybullet you can load articulated bodies from URDF, SDF and other file formats. pybullet provides forward dynamics simulation, inverse dynamics computation, forward and inverse kinematics and collision detection and ray intersection queries. Aside from physics simulation, pybullet supports to rendering, with a CPU renderer and OpenGL visualization and support for virtual reality headsets.',
|
||||||
url='https://github.com/bulletphysics/bullet3',
|
url='https://github.com/bulletphysics/bullet3',
|
||||||
|
|||||||
Reference in New Issue
Block a user