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.
Files changed (40) hide show
  1. tinysim/__init__.py +7 -2
  2. tinysim/_tk_base.py +20 -2
  3. tinysim/_widget_base.py +41 -0
  4. tinysim/flappy/__init__.py +5 -3
  5. tinysim/flappy/tk.py +10 -34
  6. tinysim/flappy/widget.py +9 -38
  7. tinysim/frogger/__init__.py +21 -4
  8. tinysim/frogger/tk.py +12 -28
  9. tinysim/frogger/widget.py +8 -37
  10. tinysim/mountain_car/__init__.py +17 -12
  11. tinysim/mountain_car/tk.py +9 -27
  12. tinysim/mountain_car/widget.py +8 -37
  13. tinysim/tinyspace.py +68 -0
  14. tinysim/topdown_driving/__init__.py +16 -18
  15. tinysim/topdown_driving/tk.py +13 -38
  16. tinysim/topdown_driving/track_0.json +1 -753
  17. tinysim/topdown_driving/widget.py +8 -42
  18. {tinysim-0.0.4.dist-info → tinysim-0.0.5.dist-info}/METADATA +5 -6
  19. {tinysim-0.0.4.dist-info → tinysim-0.0.5.dist-info}/RECORD +35 -35
  20. {tinysim-0.0.4.dist-info → tinysim-0.0.5.dist-info}/WHEEL +1 -1
  21. tinysim_mujoco/gl_viewer.py +36 -11
  22. tinysim_mujoco/manipulation/__init__.py +19 -5
  23. tinysim_mujoco/manipulation/push_env.py +268 -0
  24. tinysim_mujoco/manipulation/push_env_cam.py +274 -0
  25. tinysim_mujoco/manipulation/xmls/panda.xml +59 -16
  26. tinysim_mujoco/manipulation/xmls/scene.xml +0 -3
  27. tinysim_mujoco/manipulation/xmls/table.xml +17 -13
  28. tinysim_mujoco/notebook_viewer.py +3 -6
  29. tinysim_mujoco/unitree_a1/__init__.py +7 -10
  30. tinysim_warp/__init__.py +108 -0
  31. tinysim_warp/cart_pole/__init__.py +44 -200
  32. tinysim_warp/quadruped/__init__.py +23 -160
  33. tinysim_warp/simple_quadruped/__init__.py +20 -91
  34. tinysim_warp/simple_quadruped/simple_quadruped.urdf +0 -9
  35. tinysim/simple_amr/__init__.py +0 -0
  36. tinysim/simple_amr/example_maps.py +0 -121
  37. tinysim/simple_amr/sim.js +0 -430
  38. tinysim/simple_amr/styles.css +0 -54
  39. tinysim/simple_amr/widget.py +0 -73
  40. {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
- try:
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 __init__(self, use_cuda_graph=False, headless=False, num_envs=8):
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), -math.pi * 0.5)
31
- rot_y = wp.quat_from_axis_angle(wp.vec3(0.0, 1.0, 0.0), math.pi * 0.5)
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, xform=wp.transform(offsets[i], wp.quat_identity())
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
- # finalize model
74
- self.model = builder.finalize()
75
- self.model.ground = True
76
- self.model.joint_attach_ke = 16000.0
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
- self.use_cuda_graph = (
98
- use_cuda_graph
99
- and wp.get_device().is_cuda
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 set_leg_poses(self, actions):
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 step(self, actions):
126
- self.set_leg_poses(actions)
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>
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