|
import simulate as sm |
|
from simulate.assets.action_mapping import ActionMapping |
|
import time |
|
|
|
CAMERA_HEIGHT = 40 |
|
CAMERA_WIDTH = 64 |
|
|
|
scene = sm.Scene(engine="unity") |
|
|
|
scene += sm.LightSun() |
|
scene += sm.Box( |
|
name="table_surface", |
|
position=[1, 0, 1], |
|
bounds=[0, 7, 0, 1, 0, 11], |
|
material=sm.Material.GREEN, |
|
with_collider=True, |
|
with_rigid_body=True, |
|
physics_component=sm.RigidBodyComponent( |
|
use_gravity=True, |
|
kinematic=True, |
|
collision_detection="continuous" |
|
), |
|
) |
|
|
|
scene += sm.Box( |
|
name="border_left", |
|
position=[0, 0, 0], |
|
bounds=[0, 1, 0, 2, 0, 13], |
|
material=sm.Material.GREEN, |
|
with_collider=True, |
|
with_rigid_body=True, |
|
physics_component=sm.RigidBodyComponent( |
|
use_gravity=True, |
|
kinematic=True, |
|
collision_detection="continuous" |
|
), |
|
) |
|
|
|
scene += sm.Box( |
|
name="border_right", |
|
position=[7, 0, 0], |
|
bounds=[0, 1, 0, 2, 0, 13], |
|
material=sm.Material.GREEN, |
|
with_collider=True, |
|
with_rigid_body=True, |
|
physics_component=sm.RigidBodyComponent( |
|
use_gravity=True, |
|
mass=1, |
|
kinematic=True, |
|
collision_detection="continuous" |
|
), |
|
) |
|
|
|
scene += sm.Box( |
|
name="border_top", |
|
position=[0, 0, 0], |
|
bounds=[0, 8, 0, 2, 0, 1], |
|
material=sm.Material.GREEN, |
|
with_collider=True, |
|
with_rigid_body=True, |
|
physics_component=sm.RigidBodyComponent( |
|
use_gravity=True, |
|
kinematic=True, |
|
collision_detection="continuous" |
|
), |
|
) |
|
|
|
scene += sm.Box( |
|
name="border_bottom", |
|
position=[0, 0, 12], |
|
bounds=[0, 8, 0, 2, 0, 1], |
|
material=sm.Material.GREEN, |
|
with_collider=True, |
|
with_rigid_body=True, |
|
physics_component=sm.RigidBodyComponent( |
|
use_gravity=True, |
|
kinematic=True, |
|
collision_detection="continuous" |
|
), |
|
) |
|
|
|
cue_ball = sm.Sphere( |
|
name="cue_ball", |
|
position=[4, 1.2, 9], |
|
radius=0.2, |
|
material=sm.Material.WHITE, |
|
with_collider=True, |
|
with_rigid_body=True, |
|
physics_component=sm.RigidBodyComponent( |
|
use_gravity=True, |
|
constraints=["freeze_position_y"], |
|
mass=1, |
|
collision_detection="continuous" |
|
), |
|
) |
|
|
|
|
|
cue_ball.is_actor = True |
|
|
|
mapping = [ |
|
ActionMapping("add_force", axis=[0, 0, -1], is_impulse=True), |
|
] |
|
|
|
cue_ball.actuator = sm.Actuator( |
|
mapping=mapping, |
|
high=[10], |
|
low=[-10], |
|
shape=(1,) |
|
) |
|
|
|
cue_ball += sm.StateSensor(target_entity=cue_ball, properties=["position"]) |
|
|
|
scene += cue_ball |
|
|
|
target_ball = sm.Sphere( |
|
name="target_ball", |
|
position=[4, 1.2, 6], |
|
radius=0.2, |
|
material=sm.Material.RED, |
|
with_collider=True, |
|
with_rigid_body=True, |
|
physics_component=sm.RigidBodyComponent( |
|
use_gravity=True, |
|
constraints=["freeze_position_y"], |
|
mass=0.5, |
|
collision_detection="continuous" |
|
), |
|
) |
|
|
|
scene += target_ball |
|
|
|
scene += sm.Camera(name="camera", position=[0,0,0], rotation=[35, 0, 0]) |
|
|
|
scene.show() |
|
|
|
|
|
env = sm.RLEnv(scene) |
|
env.reset() |
|
|
|
for i in range(500): |
|
action = scene.action_space.sample() |
|
|
|
print("###############################") |
|
obs, reward, done, info = env.step(action) |
|
print("###############################") |
|
print(action) |
|
print(f"Ball position {obs.get('StateSensor')}") |
|
print(f"step {i}, reward {reward[0]}, observation") |
|
time.sleep(0.1) |
|
|
|
env.close() |
|
|
|
|
|
|
|
|
|
|