|
|
import os |
|
|
import numpy as np |
|
|
from tray_sim import SIMULATOR_MODEL, run_tray_simulation, classify_stability |
|
|
|
|
|
def main(): |
|
|
sim = SIMULATOR_MODEL() |
|
|
sim.create_pusher('3.0 3.0 0.05') |
|
|
|
|
|
|
|
|
physical_parameters_for_object_id_tray = { |
|
|
'sliding_friction': 0.1, |
|
|
'armature': 0.1, |
|
|
'stiffness': 0.0, |
|
|
'mass': 0.5, |
|
|
'damping': 20 |
|
|
} |
|
|
sim.create_tray(object_physics=physical_parameters_for_object_id_tray) |
|
|
|
|
|
|
|
|
physical_parameters_for_object_id_1 = { |
|
|
'sliding_friction': 0.22, |
|
|
'armature': 0.41, |
|
|
'stiffness': 0.53, |
|
|
'mass': 20.0, |
|
|
'damping': 7.0 |
|
|
} |
|
|
physical_parameters_for_object_id_2 = { |
|
|
'sliding_friction': 0.52, |
|
|
'armature': 0.63, |
|
|
'stiffness': 1.22, |
|
|
'mass': 10.0, |
|
|
'damping': 8.0 |
|
|
} |
|
|
physical_parameters_for_object_id_3 = { |
|
|
'sliding_friction': 0.73, |
|
|
'armature': 1.04, |
|
|
'stiffness': 0.94, |
|
|
'mass': 4.0, |
|
|
'damping': 7.9 |
|
|
} |
|
|
|
|
|
|
|
|
sim.create_object( |
|
|
object_id=1, |
|
|
object_name='bottle', |
|
|
object_location=('row_1', 'column_3'), |
|
|
object_color='orange', |
|
|
object_physics=physical_parameters_for_object_id_1 |
|
|
) |
|
|
sim.create_object( |
|
|
object_id=2, |
|
|
object_name='martini_glass', |
|
|
object_location=('row_1', 'column_2'), |
|
|
object_color='orange', |
|
|
object_physics=physical_parameters_for_object_id_2 |
|
|
) |
|
|
sim.create_object( |
|
|
object_id=3, |
|
|
object_name='wine_glass', |
|
|
object_location=('row_1', 'column_1'), |
|
|
object_color='orange', |
|
|
object_physics=physical_parameters_for_object_id_3 |
|
|
) |
|
|
|
|
|
|
|
|
model = sim.model |
|
|
data = sim.data |
|
|
trajectories = { |
|
|
'bottle': [], |
|
|
'martini_glass': [], |
|
|
'wine_glass': [] |
|
|
} |
|
|
sample_steps = [0, 25, 50, 75, 100, 125, 150, 175, 199] |
|
|
|
|
|
for t in range(200): |
|
|
if t == 50: |
|
|
pusher_idx = 3 * 7 |
|
|
pusher_vel_idx = 3 * 6 |
|
|
direction = np.array([0.0, 0.0, 0.05]) - np.array([3.0, 3.0, 0.05]) |
|
|
direction[2] = 0.0 |
|
|
direction /= np.linalg.norm(direction) |
|
|
push_velocity = -4.8 * direction / np.sqrt(2) |
|
|
data.qvel[pusher_vel_idx:pusher_vel_idx+3] = push_velocity |
|
|
|
|
|
mujoco.mj_step(model, data) |
|
|
|
|
|
if t in sample_steps: |
|
|
for i, obj_name in enumerate(['bottle', 'martini_glass', 'wine_glass'], 1): |
|
|
pos = data.qpos[(i-1)*7:(i-1)*7+3] |
|
|
|
|
|
if obj_name == 'bottle': |
|
|
pos[2] += 1.1 |
|
|
else: |
|
|
pos[2] += 0.5 |
|
|
trajectories[obj_name].append([round(p, 1) for p in pos]) |
|
|
|
|
|
sim.create_scene() |
|
|
sim_out = sim.run_simulation() |
|
|
del sim |
|
|
|
|
|
|
|
|
with open('object_traj_example_1.txt', 'w') as f: |
|
|
f.write("bottle_motion_trajectory (x, y, z) = [\n") |
|
|
for pos in trajectories['bottle']: |
|
|
f.write(f"({pos[0]}, {pos[1]}, {pos[2]}),\n") |
|
|
f.write("]\n") |
|
|
f.write("martini_glass_motion_trajectory (x, y, z) = [\n") |
|
|
for pos in trajectories['martini_glass']: |
|
|
f.write(f"({pos[0]}, {pos[1]}, {pos[2]}),\n") |
|
|
f.write("]\n") |
|
|
f.write("wine_glass_motion_trajectory (x, y, z) = [\n") |
|
|
for pos in trajectories['wine_glass']: |
|
|
f.write(f"({pos[0]}, {pos[1]}, {pos[2]}),\n") |
|
|
f.write("]\n") |
|
|
|
|
|
return trajectories |
|
|
|
|
|
if __name__ == "__main__": |
|
|
trajectories = main() |
|
|
print("Trajectories saved to object_traj_example_1.txt") |