tinysim 0.0.4__py3-none-any.whl → 0.0.5__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- tinysim/__init__.py +7 -2
- tinysim/_tk_base.py +20 -2
- tinysim/_widget_base.py +41 -0
- tinysim/flappy/__init__.py +5 -3
- tinysim/flappy/tk.py +10 -34
- tinysim/flappy/widget.py +9 -38
- tinysim/frogger/__init__.py +21 -4
- tinysim/frogger/tk.py +12 -28
- tinysim/frogger/widget.py +8 -37
- tinysim/mountain_car/__init__.py +17 -12
- tinysim/mountain_car/tk.py +9 -27
- tinysim/mountain_car/widget.py +8 -37
- tinysim/tinyspace.py +68 -0
- tinysim/topdown_driving/__init__.py +16 -18
- tinysim/topdown_driving/tk.py +13 -38
- tinysim/topdown_driving/track_0.json +1 -753
- tinysim/topdown_driving/widget.py +8 -42
- {tinysim-0.0.4.dist-info → tinysim-0.0.5.dist-info}/METADATA +5 -6
- {tinysim-0.0.4.dist-info → tinysim-0.0.5.dist-info}/RECORD +35 -35
- {tinysim-0.0.4.dist-info → tinysim-0.0.5.dist-info}/WHEEL +1 -1
- tinysim_mujoco/gl_viewer.py +36 -11
- tinysim_mujoco/manipulation/__init__.py +19 -5
- tinysim_mujoco/manipulation/push_env.py +268 -0
- tinysim_mujoco/manipulation/push_env_cam.py +274 -0
- tinysim_mujoco/manipulation/xmls/panda.xml +59 -16
- tinysim_mujoco/manipulation/xmls/scene.xml +0 -3
- tinysim_mujoco/manipulation/xmls/table.xml +17 -13
- tinysim_mujoco/notebook_viewer.py +3 -6
- tinysim_mujoco/unitree_a1/__init__.py +7 -10
- tinysim_warp/__init__.py +108 -0
- tinysim_warp/cart_pole/__init__.py +44 -200
- tinysim_warp/quadruped/__init__.py +23 -160
- tinysim_warp/simple_quadruped/__init__.py +20 -91
- tinysim_warp/simple_quadruped/simple_quadruped.urdf +0 -9
- tinysim/simple_amr/__init__.py +0 -0
- tinysim/simple_amr/example_maps.py +0 -121
- tinysim/simple_amr/sim.js +0 -430
- tinysim/simple_amr/styles.css +0 -54
- tinysim/simple_amr/widget.py +0 -73
- {tinysim-0.0.4.dist-info → tinysim-0.0.5.dist-info}/top_level.txt +0 -0
|
@@ -1,34 +1,17 @@
|
|
|
1
|
-
import math
|
|
2
|
-
import os
|
|
3
1
|
import pathlib
|
|
4
2
|
|
|
5
3
|
import numpy as np
|
|
4
|
+
import warp as wp
|
|
6
5
|
|
|
7
|
-
|
|
8
|
-
import warp as wp
|
|
9
|
-
import warp.sim.render
|
|
10
|
-
except ImportError:
|
|
11
|
-
raise ImportError(
|
|
12
|
-
"Warp is not installed. Install using `pip install tinysim[warp]`"
|
|
13
|
-
)
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
def compute_env_offsets(num_envs, env_offset=(5.0, 0.0, 0.0)):
|
|
17
|
-
env_offset = np.array(env_offset, dtype=float)
|
|
18
|
-
axis = np.nonzero(env_offset)[0]
|
|
19
|
-
axis = axis[0] if len(axis) else 0
|
|
20
|
-
env_offsets = np.zeros((num_envs, 3))
|
|
21
|
-
env_offsets[:, axis] = np.arange(num_envs) * env_offset[axis]
|
|
22
|
-
env_offsets -= env_offsets.mean(axis=0)
|
|
23
|
-
env_offsets[:, 1] = 0.0
|
|
24
|
-
return env_offsets
|
|
6
|
+
from tinysim_warp import WarpBaseEnv
|
|
25
7
|
|
|
26
8
|
|
|
27
|
-
class SimpleRobotDogBaseEnv:
|
|
28
|
-
def
|
|
9
|
+
class SimpleRobotDogBaseEnv(WarpBaseEnv):
|
|
10
|
+
def build_model(self):
|
|
11
|
+
builder = wp.sim.ModelBuilder()
|
|
29
12
|
articulation_builder = wp.sim.ModelBuilder()
|
|
30
|
-
rot_x = wp.quat_from_axis_angle(wp.vec3(1.0, 0.0, 0.0), -
|
|
31
|
-
rot_y = wp.quat_from_axis_angle(wp.vec3(0.0, 1.0, 0.0),
|
|
13
|
+
rot_x = wp.quat_from_axis_angle(wp.vec3(1.0, 0.0, 0.0), -np.pi * 0.5)
|
|
14
|
+
rot_y = wp.quat_from_axis_angle(wp.vec3(0.0, 1.0, 0.0), np.pi * 0.5)
|
|
32
15
|
xform = wp.transform(wp.vec3(0.0, 0.35, 0.0), rot_y * rot_x)
|
|
33
16
|
wp.sim.parse_urdf(
|
|
34
17
|
# os.path.join(warp.examples.get_asset_directory(), "quadruped.urdf"),
|
|
@@ -48,21 +31,10 @@ class SimpleRobotDogBaseEnv:
|
|
|
48
31
|
limit_kd=1.0e1,
|
|
49
32
|
)
|
|
50
33
|
|
|
51
|
-
builder = wp.sim.ModelBuilder()
|
|
52
|
-
|
|
53
|
-
self.sim_time = 0.0
|
|
54
|
-
fps = 100
|
|
55
|
-
self.frame_dt = 1.0 / fps
|
|
56
|
-
|
|
57
|
-
self.sim_substeps = 10
|
|
58
|
-
self.sim_dt = self.frame_dt / self.sim_substeps
|
|
59
|
-
|
|
60
|
-
self.num_envs = num_envs
|
|
61
|
-
offsets = compute_env_offsets(self.num_envs)
|
|
62
|
-
|
|
63
34
|
for i in range(self.num_envs):
|
|
64
35
|
builder.add_builder(
|
|
65
|
-
articulation_builder,
|
|
36
|
+
articulation_builder,
|
|
37
|
+
xform=wp.transform(self.env_offsets[i], wp.quat_identity()),
|
|
66
38
|
)
|
|
67
39
|
builder.joint_q[-8:] = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] # fmt: skip
|
|
68
40
|
builder.joint_act[-8:] = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] # fmt: skip
|
|
@@ -70,50 +42,18 @@ class SimpleRobotDogBaseEnv:
|
|
|
70
42
|
builder.joint_axis_mode
|
|
71
43
|
)
|
|
72
44
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
self.model.joint_attach_kd = 200.0
|
|
78
|
-
self.use_tile_gemm = False
|
|
79
|
-
self.fuse_cholesky = False
|
|
80
|
-
|
|
81
|
-
self.integrator = wp.sim.FeatherstoneIntegrator(
|
|
82
|
-
self.model,
|
|
83
|
-
use_tile_gemm=self.use_tile_gemm,
|
|
84
|
-
fuse_cholesky=self.fuse_cholesky,
|
|
85
|
-
)
|
|
86
|
-
|
|
87
|
-
self.renderer = wp.sim.render.SimRendererOpenGL(
|
|
88
|
-
self.model, "example", headless=headless
|
|
89
|
-
)
|
|
90
|
-
self.state_0 = self.model.state()
|
|
91
|
-
self.state_1 = self.model.state()
|
|
92
|
-
|
|
93
|
-
wp.sim.eval_fk(
|
|
94
|
-
self.model, self.model.joint_q, self.model.joint_qd, None, self.state_0
|
|
95
|
-
)
|
|
45
|
+
model = builder.finalize()
|
|
46
|
+
model.joint_attach_ke = 16000.0
|
|
47
|
+
model.joint_attach_kd = 200.0
|
|
48
|
+
return model
|
|
96
49
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
and wp.is_mempool_enabled(wp.get_device())
|
|
50
|
+
def solver(self):
|
|
51
|
+
return wp.sim.FeatherstoneIntegrator(
|
|
52
|
+
self.model, use_tile_gemm=False, fuse_cholesky=False
|
|
101
53
|
)
|
|
102
|
-
if self.use_cuda_graph:
|
|
103
|
-
with wp.ScopedCapture() as capture:
|
|
104
|
-
self.simulate()
|
|
105
|
-
self.graph = capture.graph
|
|
106
|
-
|
|
107
|
-
def simulate(self):
|
|
108
|
-
for _ in range(self.sim_substeps):
|
|
109
|
-
self.state_0.clear_forces()
|
|
110
|
-
wp.sim.collide(self.model, self.state_0)
|
|
111
|
-
self.integrator.simulate(
|
|
112
|
-
self.model, self.state_0, self.state_1, self.sim_dt
|
|
113
|
-
)
|
|
114
|
-
self.state_0, self.state_1 = self.state_1, self.state_0
|
|
115
54
|
|
|
116
|
-
def
|
|
55
|
+
def apply_actions(self, actions):
|
|
56
|
+
# Set the target positions for all legs
|
|
117
57
|
action_space_size = 8 * self.num_envs
|
|
118
58
|
if len(actions) != action_space_size:
|
|
119
59
|
raise ValueError(
|
|
@@ -122,19 +62,8 @@ class SimpleRobotDogBaseEnv:
|
|
|
122
62
|
|
|
123
63
|
wp.copy(self.model.joint_act, wp.array(actions, dtype=wp.float32))
|
|
124
64
|
|
|
125
|
-
def
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
if self.use_cuda_graph:
|
|
129
|
-
wp.capture_launch(self.graph)
|
|
130
|
-
else:
|
|
131
|
-
self.simulate()
|
|
132
|
-
self.sim_time += self.frame_dt
|
|
133
|
-
|
|
134
|
-
def render(self):
|
|
135
|
-
self.renderer.begin_frame(self.sim_time)
|
|
136
|
-
self.renderer.render(self.state_0)
|
|
137
|
-
self.renderer.end_frame()
|
|
65
|
+
def get_obs(self):
|
|
66
|
+
return
|
|
138
67
|
|
|
139
68
|
|
|
140
69
|
if __name__ == "__main__":
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
<?xml version="1.0" encoding="utf-8"?>
|
|
2
2
|
<robot name="quadruped">
|
|
3
|
-
|
|
4
|
-
<!-- Base -->
|
|
5
3
|
<link name="base">
|
|
6
4
|
<visual>
|
|
7
5
|
<origin rpy="0 1.57079632679 0" xyz="0 0 0"/>
|
|
@@ -22,7 +20,6 @@
|
|
|
22
20
|
</inertial>
|
|
23
21
|
</link>
|
|
24
22
|
|
|
25
|
-
<!-- LEFT FRONT LEG -->
|
|
26
23
|
<link name="LF_HAA">
|
|
27
24
|
<visual>
|
|
28
25
|
<origin rpy="1.57079632679 0 0" xyz="0 0 0"/>
|
|
@@ -77,9 +74,6 @@
|
|
|
77
74
|
<limit effort="80.0" velocity="20."/>
|
|
78
75
|
</joint>
|
|
79
76
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
<!-- RIGHT FRONT LEG -->
|
|
83
77
|
<link name="RF_HAA">
|
|
84
78
|
<visual>
|
|
85
79
|
<origin rpy="1.57079632679 0 0" xyz="0 0 0"/>
|
|
@@ -134,7 +128,6 @@
|
|
|
134
128
|
<limit effort="80.0" velocity="20."/>
|
|
135
129
|
</joint>
|
|
136
130
|
|
|
137
|
-
<!-- LEFT HIND LEG -->
|
|
138
131
|
<link name="LH_HAA">
|
|
139
132
|
<visual>
|
|
140
133
|
<origin rpy="1.57079632679 0 0" xyz="0 0 0"/>
|
|
@@ -189,7 +182,6 @@
|
|
|
189
182
|
<limit effort="80.0" velocity="20."/>
|
|
190
183
|
</joint>
|
|
191
184
|
|
|
192
|
-
<!-- RIGHT HIND LEG -->
|
|
193
185
|
<link name="RH_HAA">
|
|
194
186
|
<visual>
|
|
195
187
|
<origin rpy="1.57079632679 0 0" xyz="0 0 0"/>
|
|
@@ -243,5 +235,4 @@
|
|
|
243
235
|
<axis xyz="1 0 0"/>
|
|
244
236
|
<limit effort="80.0" velocity="20."/>
|
|
245
237
|
</joint>
|
|
246
|
-
|
|
247
238
|
</robot>
|
tinysim/simple_amr/__init__.py
DELETED
|
File without changes
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
import random
|
|
2
|
-
import math
|
|
3
|
-
import copy
|
|
4
|
-
|
|
5
|
-
empty_map = {
|
|
6
|
-
"name": "rect_triangle_map",
|
|
7
|
-
"robot": {
|
|
8
|
-
"pos": [500, 300],
|
|
9
|
-
"angle": 0,
|
|
10
|
-
}, # speed: 0.01, turn_speed: 0.04, lidar: { numBeams: 30, fov: 6.28, maxRange: 1000}
|
|
11
|
-
"map": [
|
|
12
|
-
{
|
|
13
|
-
"type": "rectangle",
|
|
14
|
-
"x": 400,
|
|
15
|
-
"y": 0,
|
|
16
|
-
"width": 800,
|
|
17
|
-
"height": 30,
|
|
18
|
-
"bodyInfo": {"angle": 0, "render": {"fillStyle": "#2f6f8f"}},
|
|
19
|
-
"label": "Wall",
|
|
20
|
-
},
|
|
21
|
-
{
|
|
22
|
-
"type": "rectangle",
|
|
23
|
-
"x": 400,
|
|
24
|
-
"y": 590,
|
|
25
|
-
"width": 800,
|
|
26
|
-
"height": 20,
|
|
27
|
-
"bodyInfo": {"angle": 0, "render": {"fillStyle": "#2f6f8f"}},
|
|
28
|
-
"label": "Wall",
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
"type": "rectangle",
|
|
32
|
-
"x": 10,
|
|
33
|
-
"y": 500,
|
|
34
|
-
"width": 20,
|
|
35
|
-
"height": 1000,
|
|
36
|
-
"bodyInfo": {"angle": 0, "render": {"fillStyle": "#2f6f8f"}},
|
|
37
|
-
"label": "Wall",
|
|
38
|
-
},
|
|
39
|
-
{
|
|
40
|
-
"type": "rectangle",
|
|
41
|
-
"x": 790,
|
|
42
|
-
"y": 500,
|
|
43
|
-
"width": 20,
|
|
44
|
-
"height": 1000,
|
|
45
|
-
"bodyInfo": {"angle": 0, "render": {"fillStyle": "#2f6f8f"}},
|
|
46
|
-
"label": "Wall",
|
|
47
|
-
},
|
|
48
|
-
],
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
def gen_simple_map():
|
|
53
|
-
map_data = copy.deepcopy(empty_map)
|
|
54
|
-
width = 800
|
|
55
|
-
height = 600
|
|
56
|
-
|
|
57
|
-
# Generate static obstacles
|
|
58
|
-
for _ in range(6):
|
|
59
|
-
w = 60 + random.random() * 120
|
|
60
|
-
h = 40 + random.random() * 100
|
|
61
|
-
x = 120 + random.random() * (width - 240)
|
|
62
|
-
y = 120 + random.random() * (height - 240)
|
|
63
|
-
angle = random.random() * math.pi
|
|
64
|
-
rect = {
|
|
65
|
-
"type": "rectangle",
|
|
66
|
-
"x": x,
|
|
67
|
-
"y": y,
|
|
68
|
-
"width": w,
|
|
69
|
-
"height": h,
|
|
70
|
-
"bodyInfo": {
|
|
71
|
-
"angle": angle,
|
|
72
|
-
"render": {"fillStyle": "#2f6f8f"},
|
|
73
|
-
"label": "Obstacle",
|
|
74
|
-
},
|
|
75
|
-
}
|
|
76
|
-
map_data["map"].append(rect)
|
|
77
|
-
|
|
78
|
-
# Generate dynamic pushable boxes
|
|
79
|
-
for _ in range(3):
|
|
80
|
-
size = 40 + random.random() * 20
|
|
81
|
-
x = 100 + random.random() * (width - 200)
|
|
82
|
-
y = 100 + random.random() * (height - 200)
|
|
83
|
-
box = {
|
|
84
|
-
"type": "rectangle",
|
|
85
|
-
"x": x,
|
|
86
|
-
"y": y,
|
|
87
|
-
"width": size,
|
|
88
|
-
"height": size,
|
|
89
|
-
"bodyInfo": {
|
|
90
|
-
"isStatic": False,
|
|
91
|
-
"frictionAir": 0.1,
|
|
92
|
-
"friction": 0.5,
|
|
93
|
-
"restitution": 0.2,
|
|
94
|
-
"density": 0.002,
|
|
95
|
-
"render": {"fillStyle": "#b2df8a"},
|
|
96
|
-
"label": "Pushable Box",
|
|
97
|
-
},
|
|
98
|
-
}
|
|
99
|
-
map_data["map"].append(box)
|
|
100
|
-
|
|
101
|
-
for i in range(2):
|
|
102
|
-
size = 40 + random.random() * 20
|
|
103
|
-
x = 100 + random.random() * (width - 200)
|
|
104
|
-
y = 100 + random.random() * (height - 200)
|
|
105
|
-
angle = random.random() * math.pi
|
|
106
|
-
box = {
|
|
107
|
-
"type": "rectangle",
|
|
108
|
-
"x": x,
|
|
109
|
-
"y": y,
|
|
110
|
-
"width": size,
|
|
111
|
-
"height": size,
|
|
112
|
-
"bodyInfo": {
|
|
113
|
-
"isStatic": True,
|
|
114
|
-
"angle": angle,
|
|
115
|
-
"label": "Goal",
|
|
116
|
-
"render": {"fillStyle": "#ffffff"},
|
|
117
|
-
},
|
|
118
|
-
}
|
|
119
|
-
map_data["map"].append(box)
|
|
120
|
-
|
|
121
|
-
return map_data
|