move scene and simulator
This commit is contained in:
parent
87838a1120
commit
e4f3ec9a0e
|
@ -0,0 +1,59 @@
|
|||
import pybullet as p
|
||||
import os, inspect
|
||||
|
||||
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
|
||||
parentdir = os.path.dirname(currentdir)
|
||||
os.sys.path.insert(0, parentdir)
|
||||
import pybullet_data
|
||||
from gibson2.data.datasets import get_model_path
|
||||
|
||||
|
||||
class Scene:
|
||||
def load(self):
|
||||
raise (NotImplementedError())
|
||||
|
||||
|
||||
class StadiumScene(Scene):
|
||||
zero_at_running_strip_start_line = True # if False, center of coordinates (0,0,0) will be at the middle of the stadium
|
||||
stadium_halflen = 105 * 0.25 # FOOBALL_FIELD_HALFLEN
|
||||
stadium_halfwidth = 50 * 0.25 # FOOBALL_FIELD_HALFWID
|
||||
|
||||
def load(self):
|
||||
filename = os.path.join(pybullet_data.getDataPath(), "stadium_no_collision.sdf")
|
||||
self.stadium = p.loadSDF(filename)
|
||||
planeName = os.path.join(pybullet_data.getDataPath(), "mjcf/ground_plane.xml")
|
||||
self.ground_plane_mjcf = p.loadMJCF(planeName)
|
||||
for i in self.ground_plane_mjcf:
|
||||
pos, orn = p.getBasePositionAndOrientation(i)
|
||||
p.resetBasePositionAndOrientation(i, [pos[0], pos[1], pos[2] - 0.005], orn)
|
||||
|
||||
for i in self.ground_plane_mjcf:
|
||||
p.changeVisualShape(i, -1, rgbaColor=[1, 1, 1, 0.5])
|
||||
|
||||
self.scene_obj_list = self.stadium
|
||||
|
||||
return [self.stadium, self.ground_plane_mjcf]
|
||||
|
||||
|
||||
class BuildingScene(Scene):
|
||||
def __init__(self, model_id):
|
||||
self.model_id = model_id
|
||||
|
||||
def load(self):
|
||||
filename = os.path.join(get_model_path(self.model_id), "mesh_z_up.obj")
|
||||
scaling = [1, 1, 1]
|
||||
collisionId = p.createCollisionShape(p.GEOM_MESH, fileName=filename, meshScale=scaling,
|
||||
flags=p.GEOM_FORCE_CONCAVE_TRIMESH)
|
||||
visualId = -1
|
||||
boundaryUid = p.createMultiBody(baseCollisionShapeIndex=collisionId, baseVisualShapeIndex=visualId)
|
||||
p.changeDynamics(boundaryUid, -1, lateralFriction=1)
|
||||
self.scene_obj_list = [(boundaryUid, -1)] # baselink index -1
|
||||
|
||||
planeName = os.path.join(pybullet_data.getDataPath(), "mjcf/ground_plane.xml")
|
||||
self.ground_plane_mjcf = p.loadMJCF(planeName)
|
||||
|
||||
p.resetBasePositionAndOrientation(self.ground_plane_mjcf[0], posObj=[0, 0, 0], ornObj=[0, 0, 0, 1])
|
||||
p.changeVisualShape(boundaryUid, -1, rgbaColor=[168 / 255.0, 164 / 255.0, 92 / 255.0, 1.0],
|
||||
specularColor=[0.5, 0.5, 0.5])
|
||||
|
||||
return [(boundaryUid,), self.ground_plane_mjcf]
|
|
@ -1,84 +0,0 @@
|
|||
import sys, os
|
||||
sys.path.append(os.path.dirname(__file__))
|
||||
import pybullet as p
|
||||
import time
|
||||
import gym
|
||||
|
||||
|
||||
class Scene:
|
||||
"A base class for single- and multiplayer scenes"
|
||||
|
||||
def __init__(self, gravity, timestep, frame_skip, env):
|
||||
#self.np_random, seed = gym.utils.seeding.np_random(None)
|
||||
self.timestep = timestep
|
||||
self.frame_skip = frame_skip
|
||||
self.env = env
|
||||
|
||||
self.dt = self.timestep * self.frame_skip
|
||||
self.cpp_world = World(gravity, timestep, frame_skip)
|
||||
|
||||
self.test_window_still_open = True # or never opened
|
||||
self.human_render_detected = False # if user wants render("human"), we open test window
|
||||
|
||||
self.multiplayer_robots = {}
|
||||
|
||||
def test_window(self):
|
||||
"Call this function every frame, to see what's going on. Not necessary in learning."
|
||||
self.human_render_detected = True
|
||||
return self.test_window_still_open
|
||||
|
||||
def actor_introduce(self, robot):
|
||||
"Usually after scene reset"
|
||||
if not self.multiplayer: return
|
||||
self.multiplayer_robots[robot.player_n] = robot
|
||||
|
||||
def actor_is_active(self, robot):
|
||||
"""
|
||||
Used by robots to see if they are free to exclusiveley put their HUD on the test window.
|
||||
Later can be used for click-focus robots.
|
||||
"""
|
||||
return not self.multiplayer
|
||||
|
||||
def episode_restart(self):
|
||||
"This function gets overridden by specific scene, to reset specific objects into their start positions"
|
||||
self.cpp_world.clean_everything()
|
||||
#self.cpp_world.test_window_history_reset()
|
||||
|
||||
def global_step(self):
|
||||
"""
|
||||
The idea is: apply motor torques for all robots, then call global_step(), then collect
|
||||
observations from robots using step() with the same action.
|
||||
"""
|
||||
self.cpp_world.step(self.frame_skip)
|
||||
|
||||
class SingleRobotEmptyScene(Scene):
|
||||
multiplayer = False # this class is used "as is" for InvertedPendulum, Reacher
|
||||
|
||||
class World:
|
||||
|
||||
def __init__(self, gravity, timestep, frame_skip):
|
||||
self.gravity = gravity
|
||||
self.timestep = timestep
|
||||
self.frame_skip = frame_skip
|
||||
self.clean_everything()
|
||||
self._is_render = False
|
||||
self._last_frame_time = 0.0
|
||||
|
||||
def clean_everything(self):
|
||||
#p.resetSimulation()
|
||||
p.setGravity(0, 0, -self.gravity)
|
||||
#p.setDefaultContactERP(0.9)
|
||||
p.setPhysicsEngineParameter(fixedTimeStep=self.timestep*self.frame_skip, numSolverIterations=50, numSubSteps=(self.frame_skip-1))
|
||||
|
||||
def step(self, frame_skip):
|
||||
if self._is_render:
|
||||
# Sleep, otherwise the computation takes less time than real time,
|
||||
# which will make the visualization like a fast-forward video.
|
||||
time_spent = time.time() - self._last_frame_time
|
||||
self._last_frame_time = time.time()
|
||||
#time_to_sleep = self.timestep * self.frame_skip - time_spent
|
||||
#if time_to_sleep > 0:
|
||||
# time.sleep(time_to_sleep)
|
||||
p.stepSimulation()
|
||||
|
||||
|
|
@ -1,71 +0,0 @@
|
|||
import os, inspect
|
||||
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
|
||||
parentdir = os.path.dirname(currentdir)
|
||||
os.sys.path.insert(0,parentdir)
|
||||
import pybullet_data
|
||||
|
||||
from gibson2.data.datasets import get_model_path
|
||||
from gibson2.core.physics.scene_abstract import Scene
|
||||
import pybullet as p
|
||||
|
||||
|
||||
class BuildingScene(Scene):
|
||||
def __init__(self, robot, model_id, gravity, timestep, frame_skip, env = None):
|
||||
Scene.__init__(self, gravity, timestep, frame_skip, env)
|
||||
|
||||
# contains cpp_world.clean_everything()
|
||||
# stadium_pose = cpp_household.Pose()
|
||||
# if self.zero_at_running_strip_start_line:
|
||||
# stadium_pose.set_xyz(27, 21, 0) # see RUN_STARTLINE, RUN_RAD constants
|
||||
|
||||
filename = os.path.join(get_model_path(model_id), "mesh_z_up.obj")
|
||||
#filename = os.path.join(get_model_path(model_id), "3d", "blender.obj")
|
||||
#textureID = p.loadTexture(os.path.join(get_model_path(model_id), "3d", "rgb.mtl"))
|
||||
|
||||
if robot.model_type == "MJCF":
|
||||
MJCF_SCALING = robot.mjcf_scaling
|
||||
scaling = [1.0/MJCF_SCALING, 1.0/MJCF_SCALING, 0.6/MJCF_SCALING]
|
||||
else:
|
||||
scaling = [1, 1, 1]
|
||||
magnified = [2, 2, 2]
|
||||
|
||||
collisionId = p.createCollisionShape(p.GEOM_MESH, fileName=filename, meshScale=scaling, flags=p.GEOM_FORCE_CONCAVE_TRIMESH)
|
||||
|
||||
|
||||
view_only_mesh = os.path.join(get_model_path(model_id), "mesh_view_only_z_up.obj")
|
||||
if os.path.exists(view_only_mesh):
|
||||
visualId = p.createVisualShape(p.GEOM_MESH,
|
||||
fileName=view_only_mesh,
|
||||
meshScale=scaling, flags=p.GEOM_FORCE_CONCAVE_TRIMESH)
|
||||
else:
|
||||
visualId = -1
|
||||
|
||||
boundaryUid = p.createMultiBody(baseCollisionShapeIndex = collisionId, baseVisualShapeIndex = visualId)
|
||||
p.changeDynamics(boundaryUid, -1, lateralFriction=1)
|
||||
#print(p.getDynamicsInfo(boundaryUid, -1))
|
||||
self.scene_obj_list = [(boundaryUid, -1)] # baselink index -1
|
||||
|
||||
|
||||
planeName = os.path.join(pybullet_data.getDataPath(), "mjcf/ground_plane.xml")
|
||||
self.ground_plane_mjcf = p.loadMJCF(planeName)
|
||||
|
||||
if "z_offset" in self.env.config:
|
||||
z_offset = self.env.config["z_offset"]
|
||||
else:
|
||||
z_offset = -10 #with hole filling, we don't need ground plane to be the same height as actual floors
|
||||
|
||||
p.resetBasePositionAndOrientation(self.ground_plane_mjcf[0], posObj = [0,0,z_offset], ornObj = [0,0,0,1])
|
||||
p.changeVisualShape(boundaryUid, -1, rgbaColor=[168 / 255.0, 164 / 255.0, 92 / 255.0, 1.0],
|
||||
specularColor=[0.5, 0.5, 0.5])
|
||||
|
||||
def episode_restart(self):
|
||||
Scene.episode_restart(self)
|
||||
|
||||
|
||||
class SinglePlayerBuildingScene(BuildingScene):
|
||||
multiplayer = False
|
||||
def __init__(self, robot, model_id, gravity, timestep, frame_skip, env = None):
|
||||
BuildingScene.__init__(self, robot, model_id, gravity, timestep, frame_skip, env)
|
||||
|
||||
|
||||
|
|
@ -1,53 +0,0 @@
|
|||
from gibson2.core.physics.scene_abstract import Scene
|
||||
import pybullet as p
|
||||
import os
|
||||
import pybullet_data
|
||||
|
||||
class StadiumScene(Scene):
|
||||
zero_at_running_strip_start_line = True # if False, center of coordinates (0,0,0) will be at the middle of the stadium
|
||||
stadium_halflen = 105*0.25 # FOOBALL_FIELD_HALFLEN
|
||||
stadium_halfwidth = 50*0.25 # FOOBALL_FIELD_HALFWID
|
||||
|
||||
def __init__(self, robot, gravity, timestep, frame_skip, env=None):
|
||||
Scene.__init__(self, gravity, timestep, frame_skip, env)
|
||||
|
||||
filename = os.path.join(pybullet_data.getDataPath(), "stadium_no_collision.sdf")
|
||||
self.stadium = p.loadSDF(filename)
|
||||
planeName = os.path.join(pybullet_data.getDataPath(), "mjcf/ground_plane.xml")
|
||||
self.ground_plane_mjcf = p.loadMJCF(planeName)
|
||||
for i in self.ground_plane_mjcf:
|
||||
pos, orn = p.getBasePositionAndOrientation(i)
|
||||
p.resetBasePositionAndOrientation(i, [pos[0], pos[1], pos[2] - 0.005], orn)
|
||||
|
||||
for i in self.ground_plane_mjcf:
|
||||
p.changeVisualShape(i, -1, rgbaColor=[1, 1, 1, 0.5])
|
||||
|
||||
self.scene_obj_list = self.stadium
|
||||
|
||||
|
||||
def episode_restart(self):
|
||||
Scene.episode_restart(self) # contains cpp_world.clean_everything()
|
||||
|
||||
|
||||
class SinglePlayerStadiumScene(StadiumScene):
|
||||
"This scene created by environment, to work in a way as if there was no concept of scene visible to user."
|
||||
multiplayer = False
|
||||
|
||||
class MultiplayerStadiumScene(StadiumScene):
|
||||
multiplayer = True
|
||||
players_count = 3
|
||||
def actor_introduce(self, robot):
|
||||
StadiumScene.actor_introduce(self, robot)
|
||||
i = robot.player_n - 1 # 0 1 2 => -1 0 +1
|
||||
robot.move_robot(0, i, 0)
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
cid = p.connect(p.SHARED_MEMORY)
|
||||
if (cid < 0):
|
||||
p.connect(p.GUI)
|
||||
|
||||
scene = StadiumScene(gravity=9.8, timestep=0.0165, frame_skip=1)
|
||||
scene.episode_restart()
|
||||
while True:
|
||||
pass
|
|
@ -0,0 +1,32 @@
|
|||
import pybullet as p
|
||||
from gibson2.core.physics.scene import StadiumScene, BuildingScene
|
||||
|
||||
|
||||
class Simulator:
|
||||
def __init__(self, gravity=9.8, timestep=1 / 240.0):
|
||||
self.gravity = gravity
|
||||
self.timestep = timestep
|
||||
self.cid = p.connect(p.GUI)
|
||||
p.setTimeStep(self.timestep)
|
||||
p.setGravity(0, 0, -self.gravity)
|
||||
self.objects = []
|
||||
|
||||
def import_scene(self, scene):
|
||||
new_objects = scene.load()
|
||||
for item in new_objects:
|
||||
self.objects.append(item)
|
||||
|
||||
def step(self):
|
||||
p.stepSimulation()
|
||||
|
||||
def isconnected(self):
|
||||
return p.getConnectionInfo(self.cid)['isConnected']
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
s = Simulator()
|
||||
scene = BuildingScene('space7')
|
||||
s.import_scene(scene)
|
||||
|
||||
while s.isconnected():
|
||||
s.step()
|
Loading…
Reference in New Issue