mani-skill-nightly 2025.6.7.814__py3-none-any.whl → 2025.6.13.2242__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 (54) hide show
  1. mani_skill/agents/robots/lerobot/__init__.py +0 -0
  2. mani_skill/agents/robots/lerobot/manipulator.py +124 -0
  3. mani_skill/agents/robots/so100/so_100.py +62 -11
  4. mani_skill/assets/robots/so100/README.md +1 -1
  5. mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/so100.urdf → so100.urdf} +19 -19
  6. mani_skill/envs/sapien_env.py +5 -1
  7. mani_skill/envs/sim2real_env.py +63 -61
  8. mani_skill/envs/tasks/digital_twins/__init__.py +1 -0
  9. mani_skill/envs/tasks/digital_twins/base_env.py +23 -18
  10. mani_skill/envs/tasks/digital_twins/so100_arm/__init__.py +1 -0
  11. mani_skill/envs/tasks/digital_twins/so100_arm/grasp_cube.py +423 -0
  12. mani_skill/vector/wrappers/gymnasium.py +1 -1
  13. {mani_skill_nightly-2025.6.7.814.dist-info → mani_skill_nightly-2025.6.13.2242.dist-info}/METADATA +4 -5
  14. {mani_skill_nightly-2025.6.7.814.dist-info → mani_skill_nightly-2025.6.13.2242.dist-info}/RECORD +54 -50
  15. /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Base.stl +0 -0
  16. /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Base.stl.convex.stl +0 -0
  17. /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Base_Motor.stl +0 -0
  18. /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Base_Motor.stl.convex.stl +0 -0
  19. /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Fixed_Jaw.stl +0 -0
  20. /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Fixed_Jaw.stl.convex.stl +0 -0
  21. /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Fixed_Jaw_Motor.stl +0 -0
  22. /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Fixed_Jaw_Motor.stl.convex.stl +0 -0
  23. /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Fixed_Jaw_part1.ply +0 -0
  24. /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Fixed_Jaw_part1.ply.convex.stl +0 -0
  25. /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Fixed_Jaw_part2.ply +0 -0
  26. /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Fixed_Jaw_part2.ply.convex.stl +0 -0
  27. /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Lower_Arm.stl +0 -0
  28. /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Lower_Arm.stl.convex.stl +0 -0
  29. /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Lower_Arm_Motor.stl +0 -0
  30. /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Lower_Arm_Motor.stl.convex.stl +0 -0
  31. /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Moving_Jaw.stl +0 -0
  32. /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Moving_Jaw.stl.convex.stl +0 -0
  33. /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Moving_Jaw_part1.ply +0 -0
  34. /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Moving_Jaw_part1.ply.convex.stl +0 -0
  35. /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Moving_Jaw_part2.ply +0 -0
  36. /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Moving_Jaw_part2.ply.convex.stl +0 -0
  37. /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Moving_Jaw_part3.ply +0 -0
  38. /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Moving_Jaw_part3.ply.convex.stl +0 -0
  39. /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Rotation_Pitch.stl +0 -0
  40. /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Rotation_Pitch.stl.convex.stl +0 -0
  41. /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Rotation_Pitch_Motor.stl +0 -0
  42. /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Rotation_Pitch_Motor.stl.convex.stl +0 -0
  43. /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Upper_Arm.stl +0 -0
  44. /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Upper_Arm.stl.convex.stl +0 -0
  45. /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Upper_Arm_Motor.stl +0 -0
  46. /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Upper_Arm_Motor.stl.convex.stl +0 -0
  47. /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Wrist_Pitch_Roll.stl +0 -0
  48. /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Wrist_Pitch_Roll.stl.convex.stl +0 -0
  49. /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Wrist_Pitch_Roll_Motor.stl +0 -0
  50. /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Wrist_Pitch_Roll_Motor.stl.convex.stl +0 -0
  51. /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/so100.srdf → so100.srdf} +0 -0
  52. {mani_skill_nightly-2025.6.7.814.dist-info → mani_skill_nightly-2025.6.13.2242.dist-info}/LICENSE +0 -0
  53. {mani_skill_nightly-2025.6.7.814.dist-info → mani_skill_nightly-2025.6.13.2242.dist-info}/WHEEL +0 -0
  54. {mani_skill_nightly-2025.6.7.814.dist-info → mani_skill_nightly-2025.6.13.2242.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,423 @@
1
+ from dataclasses import dataclass
2
+ from typing import Any, Dict, Tuple
3
+
4
+ import numpy as np
5
+ import sapien
6
+ import torch
7
+ from transforms3d.euler import euler2quat
8
+
9
+ import mani_skill.envs.utils.randomization as randomization
10
+ from mani_skill.agents.robots.so100.so_100 import SO100
11
+ from mani_skill.envs.tasks.digital_twins.base_env import BaseDigitalTwinEnv
12
+ from mani_skill.sensors.camera import CameraConfig
13
+ from mani_skill.utils import common, sapien_utils
14
+ from mani_skill.utils.logging_utils import logger
15
+ from mani_skill.utils.registration import register_env
16
+ from mani_skill.utils.scene_builder.table import TableSceneBuilder
17
+ from mani_skill.utils.structs.actor import Actor
18
+ from mani_skill.utils.structs.pose import Pose
19
+ from mani_skill.utils.structs.types import GPUMemoryConfig, SimConfig
20
+
21
+
22
+ # there are many ways to parameterize an environment's domain randomization. This is a simple way to do it
23
+ # with dataclasses that can be created and modified by the user and passed into the environment constructor.
24
+ @dataclass
25
+ class SO100GraspCubeDomainRandomizationConfig:
26
+ ### task agnostic domain randomizations, many of which you can copy over to your own tasks ###
27
+ initial_qpos_noise_scale: float = 0.02
28
+ randomize_robot_color: bool = True
29
+ randomize_lighting: bool = True
30
+ max_camera_offset: Tuple[float, float, float] = (0.025, 0.025, 0.025)
31
+ """max camera offset from the base camera position in x, y, and z axes"""
32
+ camera_target_noise: float = 1e-3
33
+ """scale of noise added to the camera target position"""
34
+ camera_view_rot_noise: float = 5e-3
35
+ """scale of noise added to the camera view rotation"""
36
+ camera_fov_noise: float = np.deg2rad(2)
37
+ """scale of noise added to the camera fov"""
38
+
39
+ ### task-specific related domain randomizations that occur during scene loading ###
40
+ cube_half_size_range: Tuple[float, float] = (0.022 / 2, 0.028 / 2)
41
+ cube_friction_mean: float = 0.3
42
+ cube_friction_std: float = 0.05
43
+ cube_friction_bounds: Tuple[float, float] = (0.1, 0.5)
44
+ randomize_cube_color: bool = True
45
+
46
+
47
+ @register_env("SO100GraspCube-v1", max_episode_steps=64)
48
+ class SO100GraspCubeEnv(BaseDigitalTwinEnv):
49
+ """
50
+ **Task Description:**
51
+ A simple task where the objective is to grasp a cube with the SO100 arm and bring it up to a target rest pose.
52
+
53
+ **Randomizations:**
54
+ - the cube's xy position is randomized on top of a table in a region of size [0.2, 0.2] x [-0.2, -0.2]. It is placed flat on the table
55
+ - the cube's z-axis rotation is randomized to a random angle
56
+
57
+ **Success Conditions:**
58
+ - the cube is lifted, grasped, and the robot returns to a rest pose above the surface of the table
59
+ """
60
+
61
+ # _sample_video_link = "https://github.com/haosulab/ManiSkill/raw/main/figures/environment_demos/PickCube-v1_rt.mp4"
62
+ SUPPORTED_ROBOTS = ["so100"]
63
+ SUPPORTED_OBS_MODES = ["none", "state", "state_dict", "rgb+segmentation"]
64
+ agent: SO100
65
+
66
+ def __init__(
67
+ self,
68
+ *args,
69
+ robot_uids="so100",
70
+ control_mode="pd_joint_target_delta_pos",
71
+ greenscreen_overlay_path=None,
72
+ domain_randomization_config=SO100GraspCubeDomainRandomizationConfig(),
73
+ domain_randomization=True,
74
+ base_camera_settings=dict(
75
+ fov=52 * np.pi / 180,
76
+ pos=[0.5, 0.3, 0.35],
77
+ target=[0.3, 0.0, 0.1],
78
+ ),
79
+ spawn_box_pos=[0.3, 0.05],
80
+ spawn_box_half_size=0.2 / 2,
81
+ **kwargs,
82
+ ):
83
+ self.domain_randomization = domain_randomization
84
+ """whether randomization is turned on or off."""
85
+ self.domain_randomization_config = domain_randomization_config
86
+ """domain randomization config"""
87
+ self.base_camera_settings = base_camera_settings
88
+ """what the camera fov, position and target are when domain randomization is off. DR is centered around these settings"""
89
+
90
+ if greenscreen_overlay_path is None:
91
+ logger.warning(
92
+ "No greenscreen overlay path provided, no greenscreen will be used"
93
+ )
94
+ self.rgb_overlay_mode = "none"
95
+
96
+ # set the camera called "base_camera" to use the greenscreen overlay when rendering
97
+ else:
98
+ self.rgb_overlay_paths = dict(base_camera=greenscreen_overlay_path)
99
+
100
+ self.spawn_box_pos = spawn_box_pos
101
+ self.spawn_box_half_size = spawn_box_half_size
102
+ super().__init__(
103
+ *args, robot_uids=robot_uids, control_mode=control_mode, **kwargs
104
+ )
105
+
106
+ @property
107
+ def _default_sim_config(self):
108
+ return SimConfig(sim_freq=100, control_freq=20)
109
+
110
+ @property
111
+ def _default_sensor_configs(self):
112
+ # we just set a default camera pose here for now. For sim2real we will modify this during training accordingly.
113
+ # note that we pass in the camera mount which is created in the _load_scene function later. This mount lets us
114
+ # randomize camera poses at each environment step. Here we just randomize some camera configuration like fov.
115
+ if self.domain_randomization:
116
+ camera_fov_noise = self.domain_randomization_config.camera_fov_noise * (
117
+ 2 * self._batched_episode_rng.rand() - 1
118
+ )
119
+ else:
120
+ camera_fov_noise = 0
121
+ return [
122
+ CameraConfig(
123
+ "base_camera",
124
+ pose=sapien.Pose(),
125
+ width=128,
126
+ height=128,
127
+ fov=camera_fov_noise + self.base_camera_settings["fov"],
128
+ near=0.01,
129
+ far=100,
130
+ mount=self.camera_mount,
131
+ )
132
+ ]
133
+
134
+ @property
135
+ def _default_human_render_camera_configs(self):
136
+ # this camera and angle is simply used for visualization purposes, not policy observations
137
+ pose = sapien_utils.look_at([0.5, 0.3, 0.35], [0.3, 0.0, 0.1])
138
+ return CameraConfig(
139
+ "render_camera", pose, 512, 512, 52 * np.pi / 180, 0.01, 100
140
+ )
141
+
142
+ def _load_agent(self, options: dict):
143
+ # load the robot arm at this initial pose
144
+ super()._load_agent(
145
+ options, sapien.Pose(p=[0, 0, 0], q=euler2quat(0, 0, np.pi / 2))
146
+ )
147
+
148
+ def _load_lighting(self, options: dict):
149
+ if self.domain_randomization:
150
+ if self.domain_randomization_config.randomize_lighting:
151
+ ambient_colors = self._batched_episode_rng.uniform(0.2, 0.5, size=(3,))
152
+ for i, scene in enumerate(self.scene.sub_scenes):
153
+ scene.render_system.ambient_light = ambient_colors[i]
154
+ else:
155
+ self.scene.set_ambient_light([0.3, 0.3, 0.3])
156
+ self.scene.add_directional_light(
157
+ [1, 1, -1], [1, 1, 1], shadow=False, shadow_scale=5, shadow_map_size=2048
158
+ )
159
+ self.scene.add_directional_light([0, 0, -1], [1, 1, 1])
160
+
161
+ def _load_scene(self, options: dict):
162
+ # we use a predefined table scene builder which simply adds a table and floor to the scene
163
+ # where the 0, 0, 0 position is the center of the table
164
+ self.table_scene = TableSceneBuilder(self)
165
+ self.table_scene.build()
166
+
167
+ # some default values for cube geometry
168
+ half_sizes = (
169
+ np.ones(self.num_envs)
170
+ * (
171
+ self.domain_randomization_config.cube_half_size_range[1]
172
+ + self.domain_randomization_config.cube_half_size_range[0]
173
+ )
174
+ / 2
175
+ )
176
+ colors = np.zeros((self.num_envs, 3))
177
+ colors[:, 0] = 1
178
+ frictions = (
179
+ np.ones(self.num_envs) * self.domain_randomization_config.cube_friction_mean
180
+ )
181
+
182
+ # randomize cube sizes, colors, and frictions
183
+ if self.domain_randomization:
184
+ # note that we use self._batched_episode_rng instead of torch.rand or np.random as it ensures even with a different number of parallel
185
+ # environments the same seed leads to the same RNG, which is important for reproducibility as geometric changes here aren't saveable in environment state
186
+ half_sizes = self._batched_episode_rng.uniform(
187
+ low=self.domain_randomization_config.cube_half_size_range[0],
188
+ high=self.domain_randomization_config.cube_half_size_range[1],
189
+ )
190
+ if self.domain_randomization_config.randomize_cube_color:
191
+ colors = self._batched_episode_rng.uniform(low=0, high=1, size=(3,))
192
+ frictions = self._batched_episode_rng.normal(
193
+ self.domain_randomization_config.cube_friction_mean,
194
+ self.domain_randomization_config.cube_friction_std,
195
+ )
196
+ frictions = frictions.clip(
197
+ *self.domain_randomization_config.cube_friction_bounds
198
+ )
199
+
200
+ self.cube_half_sizes = common.to_tensor(half_sizes, device=self.device)
201
+ colors = np.concatenate([colors, np.ones((self.num_envs, 1))], axis=-1)
202
+
203
+ # build our cubes
204
+ cubes = []
205
+ for i in range(self.num_envs):
206
+ # create a different cube in each parallel environment
207
+ # using our randomized colors, frictions, and sizes
208
+ builder = self.scene.create_actor_builder()
209
+ friction = frictions[i]
210
+ material = sapien.pysapien.physx.PhysxMaterial(
211
+ static_friction=friction,
212
+ dynamic_friction=friction,
213
+ restitution=0,
214
+ )
215
+ builder.add_box_collision(
216
+ half_size=[half_sizes[i]] * 3, material=material, density=200 # 25
217
+ )
218
+ builder.add_box_visual(
219
+ half_size=[half_sizes[i]] * 3,
220
+ material=sapien.render.RenderMaterial(
221
+ base_color=colors[i],
222
+ ),
223
+ )
224
+ builder.initial_pose = sapien.Pose(p=[0, 0, half_sizes[i]])
225
+ builder.set_scene_idxs([i])
226
+ cube = builder.build(name=f"cube-{i}")
227
+ cubes.append(cube)
228
+ self.remove_from_state_dict_registry(cube)
229
+
230
+ # since we are building many different cubes but simulating in parallel, we need to merge them into a single actor
231
+ # so we can access each different cube's information with a single object
232
+ self.cube = Actor.merge(cubes, name="cube")
233
+ self.add_to_state_dict_registry(self.cube)
234
+
235
+ # we want to only keep the robot and the cube in the render, everything else is greenscreened.
236
+ self.remove_object_from_greenscreen(self.agent.robot)
237
+ self.remove_object_from_greenscreen(self.cube)
238
+
239
+ # a hardcoded initial joint configuration for the robot to start from
240
+ self.rest_qpos = torch.tensor(
241
+ [0, 0, 0, np.pi / 2, np.pi / 2, 0],
242
+ device=self.device,
243
+ )
244
+ # hardcoded pose for the table that places it such that the robot base is at 0 and on the edge of the table.
245
+ self.table_pose = Pose.create_from_pq(
246
+ p=[-0.12 + 0.737, 0, -0.9196429], q=euler2quat(0, 0, np.pi / 2)
247
+ )
248
+
249
+ # we build a 3rd-view camera mount to put cameras on which let us randomize camera poses at each timestep
250
+ builder = self.scene.create_actor_builder()
251
+ builder.initial_pose = sapien.Pose()
252
+ self.camera_mount = builder.build_kinematic("camera_mount")
253
+
254
+ def sample_camera_poses(self, n: int):
255
+ # a custom function to sample random camera poses
256
+ # the way this works is we first sample "eyes", which are the camera positions
257
+ # then we use the noised_look_at function to sample the full camera poses given the sampled eyes
258
+ # and a target position the camera is pointing at
259
+ if self.domain_randomization:
260
+ # in case these haven't been moved to torch tensors on the environment device
261
+ self.base_camera_settings["pos"] = common.to_tensor(
262
+ self.base_camera_settings["pos"], device=self.device
263
+ )
264
+ self.base_camera_settings["target"] = common.to_tensor(
265
+ self.base_camera_settings["target"], device=self.device
266
+ )
267
+ self.domain_randomization_config.max_camera_offset = common.to_tensor(
268
+ self.domain_randomization_config.max_camera_offset, device=self.device
269
+ )
270
+
271
+ eyes = randomization.camera.make_camera_rectangular_prism(
272
+ n,
273
+ scale=self.domain_randomization_config.max_camera_offset,
274
+ center=self.base_camera_settings["pos"],
275
+ theta=0,
276
+ device=self.device,
277
+ )
278
+ return randomization.camera.noised_look_at(
279
+ eyes,
280
+ target=self.base_camera_settings["target"],
281
+ look_at_noise=self.domain_randomization_config.camera_target_noise,
282
+ view_axis_rot_noise=self.domain_randomization_config.camera_view_rot_noise,
283
+ device=self.device,
284
+ )
285
+ else:
286
+ return sapien_utils.look_at(
287
+ eye=self.base_camera_settings["pos"],
288
+ target=self.base_camera_settings["target"],
289
+ )
290
+
291
+ def _initialize_episode(self, env_idx: torch.Tensor, options: dict):
292
+ # we randomize the pose of the cube accordingly so that the policy can learn to pick up the cube from
293
+ # many different orientations and positions.
294
+ with torch.device(self.device):
295
+ b = len(env_idx)
296
+ self.table_scene.initialize(env_idx)
297
+ # move the table back so that the robot is at 0 and on the edge of the table.
298
+ self.table_scene.table.set_pose(self.table_pose)
299
+
300
+ # sample a random initial joint configuration for the robot
301
+ self.agent.robot.set_qpos(
302
+ self.rest_qpos + torch.randn(size=(b, self.rest_qpos.shape[-1])) * 0.02
303
+ )
304
+ self.agent.robot.set_pose(
305
+ Pose.create_from_pq(p=[0, 0, 0], q=euler2quat(0, 0, np.pi / 2))
306
+ )
307
+
308
+ # initialize the cube at a random position and rotation around the z-axis
309
+ spawn_box_pos = self.agent.robot.pose.p + torch.tensor(
310
+ [self.spawn_box_pos[0], self.spawn_box_pos[1], 0]
311
+ )
312
+ xyz = torch.zeros((b, 3))
313
+ xyz[:, :2] = (
314
+ torch.rand((b, 2)) * self.spawn_box_half_size * 2
315
+ - self.spawn_box_half_size
316
+ )
317
+ xyz[:, :2] += spawn_box_pos[env_idx, :2]
318
+ xyz[:, 2] = self.cube_half_sizes[env_idx]
319
+ qs = randomization.random_quaternions(b, lock_x=True, lock_y=True)
320
+ self.cube.set_pose(Pose.create_from_pq(xyz, qs))
321
+
322
+ # randomize the camera poses
323
+ self.camera_mount.set_pose(self.sample_camera_poses(n=b))
324
+
325
+ def _before_control_step(self):
326
+ # update the camera poses before agent actions are executed
327
+ if self.domain_randomization:
328
+ self.camera_mount.set_pose(self.sample_camera_poses(n=self.num_envs))
329
+ if self.gpu_sim_enabled:
330
+ self.scene._gpu_apply_all()
331
+
332
+ def _get_obs_agent(self):
333
+ # the default get_obs_agent function in ManiSkill records qpos and qvel. However
334
+ # SO100 arm qvel are likely too noisy to learn from and not implemented.
335
+ obs = dict(qpos=self.agent.robot.get_qpos())
336
+ controller_state = self.agent.controller.get_state()
337
+ if len(controller_state) > 0:
338
+ obs.update(controller=controller_state)
339
+ return obs
340
+
341
+ def _get_obs_extra(self, info: Dict):
342
+ # we ensure that the observation data is always retrievable in the real world, using only real world
343
+ # available data (joint positions or the controllers target joint positions in this case).
344
+ obs = dict(
345
+ dist_to_rest_qpos=self.agent.controller._target_qpos[:, :-1]
346
+ - self.rest_qpos[:-1],
347
+ )
348
+ if self.obs_mode_struct.state:
349
+ # state based policies can gain access to more information that helps learning
350
+ obs.update(
351
+ is_grasped=info["is_grasped"],
352
+ obj_pose=self.cube.pose.raw_pose,
353
+ tcp_pos=self.agent.tcp_pos,
354
+ tcp_to_obj_pos=self.cube.pose.p - self.agent.tcp_pos,
355
+ )
356
+ return obs
357
+
358
+ def evaluate(self):
359
+ # evaluation function to generate some useful metrics/flags and evaluate the success of the task
360
+
361
+ tcp_to_obj_dist = torch.linalg.norm(
362
+ self.cube.pose.p - self.agent.tcp_pos,
363
+ axis=-1,
364
+ )
365
+ reached_object = tcp_to_obj_dist < 0.03
366
+ is_grasped = self.agent.is_grasping(self.cube)
367
+
368
+ target_qpos = self.agent.controller._target_qpos.clone()
369
+ distance_to_rest_qpos = torch.linalg.norm(
370
+ target_qpos[:, :-1] - self.rest_qpos[:-1], axis=-1
371
+ )
372
+ reached_rest_qpos = distance_to_rest_qpos < 0.2
373
+
374
+ cube_lifted = self.cube.pose.p[..., -1] >= (self.cube_half_sizes + 1e-3)
375
+
376
+ success = cube_lifted & is_grasped & reached_rest_qpos
377
+
378
+ # determine if robot is touching the table. for safety reasons we want the robot to avoid hitting the table when grasping the cube
379
+ l_contact_forces = self.scene.get_pairwise_contact_forces(
380
+ self.agent.finger1_link, self.table_scene.table
381
+ )
382
+ r_contact_forces = self.scene.get_pairwise_contact_forces(
383
+ self.agent.finger2_link, self.table_scene.table
384
+ )
385
+ lforce = torch.linalg.norm(l_contact_forces, axis=1)
386
+ rforce = torch.linalg.norm(r_contact_forces, axis=1)
387
+ touching_table = torch.logical_or(
388
+ lforce >= 1e-2,
389
+ rforce >= 1e-2,
390
+ )
391
+ return {
392
+ "is_grasped": is_grasped,
393
+ "reached_object": reached_object,
394
+ "distance_to_rest_qpos": distance_to_rest_qpos,
395
+ "touching_table": touching_table,
396
+ "cube_lifted": cube_lifted,
397
+ "success": success,
398
+ }
399
+
400
+ def compute_dense_reward(self, obs: Any, action: torch.Tensor, info: Dict):
401
+ # note the info object is the data returned by the evaluate function. We can reuse information
402
+ # to save compute time.
403
+ # this reward function essentially has two stages, before and after grasping.
404
+ # in stage 1 we reward the robot for reaching the object and grasping it.
405
+ # in stage 2 if the robot is grasping the object, we reward it for controlling the robot returning to the predefined rest pose.
406
+ # in all stages we penalize the robot for touching the table.
407
+ # this reward function is very simple and can easily be improved to learn more robust behaviors or solve more complex problems.
408
+
409
+ tcp_to_obj_dist = torch.linalg.norm(
410
+ self.cube.pose.p - self.agent.tcp_pose.p, axis=1
411
+ )
412
+ reaching_reward = 1 - torch.tanh(5 * tcp_to_obj_dist)
413
+ reward = reaching_reward + info["is_grasped"]
414
+ place_reward = torch.exp(-2 * info["distance_to_rest_qpos"])
415
+ reward += place_reward * info["is_grasped"]
416
+ reward -= 2 * info["touching_table"].float()
417
+ return reward
418
+
419
+ def compute_normalized_dense_reward(
420
+ self, obs: Any, action: torch.Tensor, info: Dict
421
+ ):
422
+ # for more stable RL we often also permit defining a noramlized reward function where you manually scale the reward down by its max value like so
423
+ return self.compute_dense_reward(obs=obs, action=action, info=info) / 3
@@ -6,8 +6,8 @@ import gymnasium as gym
6
6
  import torch
7
7
  from gymnasium.vector import VectorEnv
8
8
 
9
- from mani_skill.utils.structs.types import Array
10
9
  from mani_skill.utils.common import torch_clone_dict
10
+ from mani_skill.utils.structs.types import Array
11
11
 
12
12
  if TYPE_CHECKING:
13
13
  from mani_skill.envs.sapien_env import BaseEnv
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mani-skill-nightly
3
- Version: 2025.6.7.814
3
+ Version: 2025.6.13.2242
4
4
  Summary: ManiSkill3: A Unified Benchmark for Generalizable Manipulation Skills
5
5
  Home-page: https://github.com/haosulab/ManiSkill
6
6
  Author: ManiSkill contributors
@@ -72,13 +72,12 @@ ManiSkill is a powerful unified framework for robot simulation and training powe
72
72
  - Example tasks cover a wide range of different robot embodiments (humanoids, mobile manipulators, single-arm robots) as well as a wide range of different tasks (table-top, drawing/cleaning, dextrous manipulation)
73
73
  - Flexible and simple task building API that abstracts away much of the complex GPU memory management code via an object oriented design
74
74
  - Real2sim environments for scalably evaluating real-world policies 100x faster via GPU simulation.
75
+ - Sim2real support for deploying policies trained in simulation to the real world
75
76
  - Many tuned robot learning baselines in Reinforcement Learning (e.g. PPO, SAC, [TD-MPC2](https://github.com/nicklashansen/tdmpc2)), Imitation Learning (e.g. Behavior Cloning, [Diffusion Policy](https://github.com/real-stanford/diffusion_policy)), and large Vision Language Action (VLA) models (e.g. [Octo](https://github.com/octo-models/octo), [RDT-1B](https://github.com/thu-ml/RoboticsDiffusionTransformer), [RT-x](https://robotics-transformer-x.github.io/))
76
77
 
77
78
  For more details we encourage you to take a look at our [paper](https://arxiv.org/abs/2410.00425), published at [RSS 2025](https://roboticsconference.org/).
78
79
 
79
- There are more features to be added to ManiSkill 3, see [our roadmap](https://maniskill.readthedocs.io/en/latest/roadmap/index.html) for planned features that will be added over time before the official v3 is released.
80
-
81
- Please refer to our [documentation](https://maniskill.readthedocs.io/en/latest/user_guide) to learn more information from tutorials on building tasks to data collection.
80
+ Please refer to our [documentation](https://maniskill.readthedocs.io/en/latest/user_guide) to learn more information from tutorials on building tasks to sim2real to running baselines.
82
81
 
83
82
  **NOTE:**
84
83
  This project currently is in a **beta release**, so not all features have been added in yet and there may be some bugs. If you find any bugs or have any feature requests please post them to our [GitHub issues](https://github.com/haosulab/ManiSkill/issues/) or discuss about them on [GitHub discussions](https://github.com/haosulab/ManiSkill/discussions/). We also have a [Discord Server](https://discord.gg/x8yUZe5AdN) through which we make announcements and discuss about ManiSkill.
@@ -111,7 +110,7 @@ For a full list of example scripts you can run, see [the docs](https://maniskill
111
110
 
112
111
  ## System Support
113
112
 
114
- We currently best support Linux based systems. There is limited support for windows and no support for MacOS at the moment. We are working on trying to support more features on other systems but this may take some time. Most constraints stem from what the [SAPIEN](https://github.com/haosulab/SAPIEN/) package is capable of supporting.
113
+ We currently best support Linux based systems. There is limited support for windows and MacOS at the moment. We are working on trying to support more features on other systems but this may take some time. Most constraints stem from what the [SAPIEN](https://github.com/haosulab/SAPIEN/) package is capable of supporting.
115
114
 
116
115
  | System / GPU | CPU Sim | GPU Sim | Rendering |
117
116
  | -------------------- | ------- | ------- | --------- |
@@ -39,12 +39,14 @@ mani_skill/agents/robots/inspire_hand/floating_inspire_hand.py,sha256=_zhBWkiVuu
39
39
  mani_skill/agents/robots/koch/__init__.py,sha256=-bZbNQnXk6rlXgSkIG2umLENJkNqAQb7jnjTe3r5Jfs,23
40
40
  mani_skill/agents/robots/koch/koch.py,sha256=r5morOu6Fv35qpSm2OFhhO2Aaw2x9ZtT3wrET-YtiCw,6736
41
41
  mani_skill/agents/robots/koch/koch_real.py,sha256=w8lIzRsAZEvLGXbC598ktpGiHKuPp3XDspmU1xYXKqc,124
42
+ mani_skill/agents/robots/lerobot/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
43
+ mani_skill/agents/robots/lerobot/manipulator.py,sha256=6D4Qa-lhnwV7E1u2Y1JqUd-YRaYH9Swl1VvNG3K2YmQ,5642
42
44
  mani_skill/agents/robots/panda/__init__.py,sha256=VnFJLcmPMBjo-mlBpfMo5acYKud_wngRAcf67uiugSk,102
43
45
  mani_skill/agents/robots/panda/panda.py,sha256=aufC9et7TK5Ojms03ITT3cb7jsVClcbqLquGWaXzEH4,10760
44
46
  mani_skill/agents/robots/panda/panda_stick.py,sha256=YEGYLPGZFKkCTTAry4F82_fNZqrso3LdMWgBfT_RRbY,6131
45
47
  mani_skill/agents/robots/panda/panda_wristcam.py,sha256=eSw652CaA82YfetCqasHGAcUkaJ_aXJijJm6tHZmKyQ,875
46
48
  mani_skill/agents/robots/so100/__init__.py,sha256=54RRpI3ue89zbNtSKOK8JxvSaKrHt6PXQrriTN6X01c,26
47
- mani_skill/agents/robots/so100/so_100.py,sha256=UYLjB40n6lfXZnBRTBA2apjfp0MkKqsXf5aVXm5NyiI,4838
49
+ mani_skill/agents/robots/so100/so_100.py,sha256=WohuT8mw0fm2-mSPPZNDeZfKjuL_QaibnvkIfLZpIrA,7096
48
50
  mani_skill/agents/robots/so100/so_100_real.py,sha256=-M1iRAe81AQgnM8XE32Q2jsFBmE87MGXgQwA138BVis,125
49
51
  mani_skill/agents/robots/stompy/__init__.py,sha256=fNuqeJqKneHPnzvjDYtzbpV3MIGGll8-CMok89hf0zo,27
50
52
  mani_skill/agents/robots/stompy/stompy.py,sha256=doBI0c4QCbjCiaHAxdngI73Ux_ISBy6N5JTgPovrX34,4052
@@ -412,45 +414,45 @@ mani_skill/assets/robots/panda/sciurus17_description/meshes/collision/Body.stl,s
412
414
  mani_skill/assets/robots/panda/sciurus17_description/meshes/visual/Base.stl,sha256=B2lPVapaEG5gR2OavvSwMI0ju0oMaowvwQ9CxQJ1oNo,1609684
413
415
  mani_skill/assets/robots/panda/sciurus17_description/meshes/visual/Body.stl,sha256=uzaYY9covWVKTHaflatAHHWghs-zRe52DnGhyZUe-9I,6158284
414
416
  mani_skill/assets/robots/so100/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
415
- mani_skill/assets/robots/so100/README.md,sha256=NhEpAetOHh3fsU5LQBlE0w09TajOwCIfk7ArvyGddgU,495
416
- mani_skill/assets/robots/so100/SO_5DOF_ARM100_8j/so100.srdf,sha256=lCeGWnczz1hym8W1EVMxj9aRU3eEOPm6xcUuFOyBKFs,1137
417
- mani_skill/assets/robots/so100/SO_5DOF_ARM100_8j/so100.urdf,sha256=6431c-upH-sM2gwoaFIzf3eMw7HngJv2iTpSzjsQnn0,13478
418
- mani_skill/assets/robots/so100/SO_5DOF_ARM100_8j/meshes/Base.stl,sha256=u4r7AwPAEl8mWnl2Jc-vZGrCFNXS3JyYY0jEFXVeKnQ,443484
419
- mani_skill/assets/robots/so100/SO_5DOF_ARM100_8j/meshes/Base.stl.convex.stl,sha256=gD_BSuiNCbIT6jZWtVyXowlJRU3Qy9Je8fgqMNx9fio,14884
420
- mani_skill/assets/robots/so100/SO_5DOF_ARM100_8j/meshes/Base_Motor.stl,sha256=qsRIXUSOykGNKpPfP3j0Sb1Zsh7BrypXkXGBn9ROpXY,154284
421
- mani_skill/assets/robots/so100/SO_5DOF_ARM100_8j/meshes/Base_Motor.stl.convex.stl,sha256=Ocr0peOz9lHzFKCAdKM_SE6LcExwvsoQckZ8_Rc7NfQ,15684
422
- mani_skill/assets/robots/so100/SO_5DOF_ARM100_8j/meshes/Fixed_Jaw.stl,sha256=VSiGcHMDPqpMJ6gIcYCVTz8GNb1p1RfVys6S8B3SZrI,264584
423
- mani_skill/assets/robots/so100/SO_5DOF_ARM100_8j/meshes/Fixed_Jaw.stl.convex.stl,sha256=KIUaborQ22Cenv6qX8SIq0kSJuumid2Bpy3ft3VZCr4,36384
424
- mani_skill/assets/robots/so100/SO_5DOF_ARM100_8j/meshes/Fixed_Jaw_Motor.stl,sha256=AyG_uQLVoRnE8qk0q0vn6eqMk6AuFoXwZvmcJKXKPs8,151884
425
- mani_skill/assets/robots/so100/SO_5DOF_ARM100_8j/meshes/Fixed_Jaw_Motor.stl.convex.stl,sha256=U8JfRYrTAUcCrYB6bmvBz4DK65XLrf0mFwUEHstTDe0,15684
426
- mani_skill/assets/robots/so100/SO_5DOF_ARM100_8j/meshes/Fixed_Jaw_part1.ply,sha256=LKjUCMOjZbrCYugtqs1sne30DpDBryjEhkjfv2NvUTA,628
427
- mani_skill/assets/robots/so100/SO_5DOF_ARM100_8j/meshes/Fixed_Jaw_part1.ply.convex.stl,sha256=qR-CMJKGbLUZ_4slkNbKfe2SHHDAbWT5Uk-tLCRKbGI,684
428
- mani_skill/assets/robots/so100/SO_5DOF_ARM100_8j/meshes/Fixed_Jaw_part2.ply,sha256=t58_KuU4NRPqVZ0ESd7dFSgaaNTvv6OHHqAk0xALrpE,879
429
- mani_skill/assets/robots/so100/SO_5DOF_ARM100_8j/meshes/Fixed_Jaw_part2.ply.convex.stl,sha256=3WFi65RNxwAkRVLeNucjukCXzNJWiPBqdBO4Ez9jfZI,1284
430
- mani_skill/assets/robots/so100/SO_5DOF_ARM100_8j/meshes/Lower_Arm.stl,sha256=oEURvGXLtwKy1gI3ZN6UeIiwagn78nKAPznCJyQymj4,347184
431
- mani_skill/assets/robots/so100/SO_5DOF_ARM100_8j/meshes/Lower_Arm.stl.convex.stl,sha256=ub6hY2Yw7waaU8HfcVBnBtqXLK7K2TDwFkVSlZvMFl8,51484
432
- mani_skill/assets/robots/so100/SO_5DOF_ARM100_8j/meshes/Lower_Arm_Motor.stl,sha256=BzaPpMUN6nDoFXrM7nEHISDAyzdPZyyFq6HQgXArxHY,151884
433
- mani_skill/assets/robots/so100/SO_5DOF_ARM100_8j/meshes/Lower_Arm_Motor.stl.convex.stl,sha256=buaks3hdZTc4hYgHlyk2mVyWSaucVv5qbPRW04o-DPw,15384
434
- mani_skill/assets/robots/so100/SO_5DOF_ARM100_8j/meshes/Moving_Jaw.stl,sha256=bZySMCTHXm8KjYMAMXxNihfdSYgCYMvGC3_l4Mba36g,177184
435
- mani_skill/assets/robots/so100/SO_5DOF_ARM100_8j/meshes/Moving_Jaw.stl.convex.stl,sha256=2iw7-03U05FtDftzFWX1Lusy8H5nDOWHBNmOv_Pj5jc,33784
436
- mani_skill/assets/robots/so100/SO_5DOF_ARM100_8j/meshes/Moving_Jaw_part1.ply,sha256=0ixh1WOz04a2Ao6eEkePFDo42FnKKZOhHVK2f1iDFgI,628
437
- mani_skill/assets/robots/so100/SO_5DOF_ARM100_8j/meshes/Moving_Jaw_part1.ply.convex.stl,sha256=wzGnx7ekzd3riUtPcuiXoqd7VJ2fKjNe6nfxCpDshWc,684
438
- mani_skill/assets/robots/so100/SO_5DOF_ARM100_8j/meshes/Moving_Jaw_part2.ply,sha256=XkBI9LBCrkne4D0lepfKY5HIuuG9BMe-mCuTfJn0Lxg,582
439
- mani_skill/assets/robots/so100/SO_5DOF_ARM100_8j/meshes/Moving_Jaw_part2.ply.convex.stl,sha256=Qho0200UJrGr4fMO1zUl8HZ0ZFEw35TSk1sqwghON-E,684
440
- mani_skill/assets/robots/so100/SO_5DOF_ARM100_8j/meshes/Moving_Jaw_part3.ply,sha256=JLF3MhwnfjBw4DV7FhG_DXx39oTQm-YV5fd1jxZUqvk,701
441
- mani_skill/assets/robots/so100/SO_5DOF_ARM100_8j/meshes/Moving_Jaw_part3.ply.convex.stl,sha256=oNkqycR38oMhHTtbkl8YTX8DGiABhTq_q7o8AKCjxrQ,984
442
- mani_skill/assets/robots/so100/SO_5DOF_ARM100_8j/meshes/Rotation_Pitch.stl,sha256=ShR29X0o0sBlvA7eamdMs-us8RkzcpFu8eD_Mu65LPA,347584
443
- mani_skill/assets/robots/so100/SO_5DOF_ARM100_8j/meshes/Rotation_Pitch.stl.convex.stl,sha256=14Mf2cqTV7ROU-KtUqhcGLThDBH43NW8bFGq09rHdOw,39884
444
- mani_skill/assets/robots/so100/SO_5DOF_ARM100_8j/meshes/Rotation_Pitch_Motor.stl,sha256=9PvPGNjy6R0Sp2fBZ5QwFA3ODIHqFHjMFTv846Fi22E,154284
445
- mani_skill/assets/robots/so100/SO_5DOF_ARM100_8j/meshes/Rotation_Pitch_Motor.stl.convex.stl,sha256=FACCkMkbcrt2z30Gw9AArH4tDcujHKWTElRnnDOriug,15584
446
- mani_skill/assets/robots/so100/SO_5DOF_ARM100_8j/meshes/Upper_Arm.stl,sha256=2XrTfJBAD-ObstWs6LQpDz0SYuE_HU8WZJRCF1LV87c,215184
447
- mani_skill/assets/robots/so100/SO_5DOF_ARM100_8j/meshes/Upper_Arm.stl.convex.stl,sha256=dby4vbH6R6-m7-N-dcu4RFwDPmClwFk9yaZzNuII1uI,41984
448
- mani_skill/assets/robots/so100/SO_5DOF_ARM100_8j/meshes/Upper_Arm_Motor.stl,sha256=uv2yy56aiE5itfvxWx9wamV3HagnZNvnA98SjZ801yM,152284
449
- mani_skill/assets/robots/so100/SO_5DOF_ARM100_8j/meshes/Upper_Arm_Motor.stl.convex.stl,sha256=M67D7YnAs9bSZE9ZwtvHSBiI6ZmpA7Osw9QZRSlFyTQ,15984
450
- mani_skill/assets/robots/so100/SO_5DOF_ARM100_8j/meshes/Wrist_Pitch_Roll.stl,sha256=WOg84ciyTh-jp5Zy6pZepBQ5hsgaIThtzW2hy8_clLs,341684
451
- mani_skill/assets/robots/so100/SO_5DOF_ARM100_8j/meshes/Wrist_Pitch_Roll.stl.convex.stl,sha256=EDRq5U5RfVYWwwROLFi-I83fzG-rP7Rj4MJI2G_2Udg,52384
452
- mani_skill/assets/robots/so100/SO_5DOF_ARM100_8j/meshes/Wrist_Pitch_Roll_Motor.stl,sha256=iaw_sdJTb6T3xA50Sb5Lk019d2-c0EU8hCdn-YD_bBg,133684
453
- mani_skill/assets/robots/so100/SO_5DOF_ARM100_8j/meshes/Wrist_Pitch_Roll_Motor.stl.convex.stl,sha256=zCFOlOkXJkA0Zontif3LARKf11veiFllwQ69FoPeFxQ,14584
417
+ mani_skill/assets/robots/so100/README.md,sha256=1OHvI_IzM7mbJkiqdpqRQG5x5hnvN94Q4EzhBwxxeeU,496
418
+ mani_skill/assets/robots/so100/so100.srdf,sha256=lCeGWnczz1hym8W1EVMxj9aRU3eEOPm6xcUuFOyBKFs,1137
419
+ mani_skill/assets/robots/so100/so100.urdf,sha256=3umHyptafpYaa8h-txw7AJIpaPdyFFJ83dTPyGCCKrw,13496
420
+ mani_skill/assets/robots/so100/meshes/Base.stl,sha256=u4r7AwPAEl8mWnl2Jc-vZGrCFNXS3JyYY0jEFXVeKnQ,443484
421
+ mani_skill/assets/robots/so100/meshes/Base.stl.convex.stl,sha256=gD_BSuiNCbIT6jZWtVyXowlJRU3Qy9Je8fgqMNx9fio,14884
422
+ mani_skill/assets/robots/so100/meshes/Base_Motor.stl,sha256=qsRIXUSOykGNKpPfP3j0Sb1Zsh7BrypXkXGBn9ROpXY,154284
423
+ mani_skill/assets/robots/so100/meshes/Base_Motor.stl.convex.stl,sha256=Ocr0peOz9lHzFKCAdKM_SE6LcExwvsoQckZ8_Rc7NfQ,15684
424
+ mani_skill/assets/robots/so100/meshes/Fixed_Jaw.stl,sha256=VSiGcHMDPqpMJ6gIcYCVTz8GNb1p1RfVys6S8B3SZrI,264584
425
+ mani_skill/assets/robots/so100/meshes/Fixed_Jaw.stl.convex.stl,sha256=KIUaborQ22Cenv6qX8SIq0kSJuumid2Bpy3ft3VZCr4,36384
426
+ mani_skill/assets/robots/so100/meshes/Fixed_Jaw_Motor.stl,sha256=AyG_uQLVoRnE8qk0q0vn6eqMk6AuFoXwZvmcJKXKPs8,151884
427
+ mani_skill/assets/robots/so100/meshes/Fixed_Jaw_Motor.stl.convex.stl,sha256=U8JfRYrTAUcCrYB6bmvBz4DK65XLrf0mFwUEHstTDe0,15684
428
+ mani_skill/assets/robots/so100/meshes/Fixed_Jaw_part1.ply,sha256=LKjUCMOjZbrCYugtqs1sne30DpDBryjEhkjfv2NvUTA,628
429
+ mani_skill/assets/robots/so100/meshes/Fixed_Jaw_part1.ply.convex.stl,sha256=qR-CMJKGbLUZ_4slkNbKfe2SHHDAbWT5Uk-tLCRKbGI,684
430
+ mani_skill/assets/robots/so100/meshes/Fixed_Jaw_part2.ply,sha256=t58_KuU4NRPqVZ0ESd7dFSgaaNTvv6OHHqAk0xALrpE,879
431
+ mani_skill/assets/robots/so100/meshes/Fixed_Jaw_part2.ply.convex.stl,sha256=3WFi65RNxwAkRVLeNucjukCXzNJWiPBqdBO4Ez9jfZI,1284
432
+ mani_skill/assets/robots/so100/meshes/Lower_Arm.stl,sha256=oEURvGXLtwKy1gI3ZN6UeIiwagn78nKAPznCJyQymj4,347184
433
+ mani_skill/assets/robots/so100/meshes/Lower_Arm.stl.convex.stl,sha256=ub6hY2Yw7waaU8HfcVBnBtqXLK7K2TDwFkVSlZvMFl8,51484
434
+ mani_skill/assets/robots/so100/meshes/Lower_Arm_Motor.stl,sha256=BzaPpMUN6nDoFXrM7nEHISDAyzdPZyyFq6HQgXArxHY,151884
435
+ mani_skill/assets/robots/so100/meshes/Lower_Arm_Motor.stl.convex.stl,sha256=buaks3hdZTc4hYgHlyk2mVyWSaucVv5qbPRW04o-DPw,15384
436
+ mani_skill/assets/robots/so100/meshes/Moving_Jaw.stl,sha256=bZySMCTHXm8KjYMAMXxNihfdSYgCYMvGC3_l4Mba36g,177184
437
+ mani_skill/assets/robots/so100/meshes/Moving_Jaw.stl.convex.stl,sha256=2iw7-03U05FtDftzFWX1Lusy8H5nDOWHBNmOv_Pj5jc,33784
438
+ mani_skill/assets/robots/so100/meshes/Moving_Jaw_part1.ply,sha256=0ixh1WOz04a2Ao6eEkePFDo42FnKKZOhHVK2f1iDFgI,628
439
+ mani_skill/assets/robots/so100/meshes/Moving_Jaw_part1.ply.convex.stl,sha256=wzGnx7ekzd3riUtPcuiXoqd7VJ2fKjNe6nfxCpDshWc,684
440
+ mani_skill/assets/robots/so100/meshes/Moving_Jaw_part2.ply,sha256=XkBI9LBCrkne4D0lepfKY5HIuuG9BMe-mCuTfJn0Lxg,582
441
+ mani_skill/assets/robots/so100/meshes/Moving_Jaw_part2.ply.convex.stl,sha256=Qho0200UJrGr4fMO1zUl8HZ0ZFEw35TSk1sqwghON-E,684
442
+ mani_skill/assets/robots/so100/meshes/Moving_Jaw_part3.ply,sha256=JLF3MhwnfjBw4DV7FhG_DXx39oTQm-YV5fd1jxZUqvk,701
443
+ mani_skill/assets/robots/so100/meshes/Moving_Jaw_part3.ply.convex.stl,sha256=oNkqycR38oMhHTtbkl8YTX8DGiABhTq_q7o8AKCjxrQ,984
444
+ mani_skill/assets/robots/so100/meshes/Rotation_Pitch.stl,sha256=ShR29X0o0sBlvA7eamdMs-us8RkzcpFu8eD_Mu65LPA,347584
445
+ mani_skill/assets/robots/so100/meshes/Rotation_Pitch.stl.convex.stl,sha256=14Mf2cqTV7ROU-KtUqhcGLThDBH43NW8bFGq09rHdOw,39884
446
+ mani_skill/assets/robots/so100/meshes/Rotation_Pitch_Motor.stl,sha256=9PvPGNjy6R0Sp2fBZ5QwFA3ODIHqFHjMFTv846Fi22E,154284
447
+ mani_skill/assets/robots/so100/meshes/Rotation_Pitch_Motor.stl.convex.stl,sha256=FACCkMkbcrt2z30Gw9AArH4tDcujHKWTElRnnDOriug,15584
448
+ mani_skill/assets/robots/so100/meshes/Upper_Arm.stl,sha256=2XrTfJBAD-ObstWs6LQpDz0SYuE_HU8WZJRCF1LV87c,215184
449
+ mani_skill/assets/robots/so100/meshes/Upper_Arm.stl.convex.stl,sha256=dby4vbH6R6-m7-N-dcu4RFwDPmClwFk9yaZzNuII1uI,41984
450
+ mani_skill/assets/robots/so100/meshes/Upper_Arm_Motor.stl,sha256=uv2yy56aiE5itfvxWx9wamV3HagnZNvnA98SjZ801yM,152284
451
+ mani_skill/assets/robots/so100/meshes/Upper_Arm_Motor.stl.convex.stl,sha256=M67D7YnAs9bSZE9ZwtvHSBiI6ZmpA7Osw9QZRSlFyTQ,15984
452
+ mani_skill/assets/robots/so100/meshes/Wrist_Pitch_Roll.stl,sha256=WOg84ciyTh-jp5Zy6pZepBQ5hsgaIThtzW2hy8_clLs,341684
453
+ mani_skill/assets/robots/so100/meshes/Wrist_Pitch_Roll.stl.convex.stl,sha256=EDRq5U5RfVYWwwROLFi-I83fzG-rP7Rj4MJI2G_2Udg,52384
454
+ mani_skill/assets/robots/so100/meshes/Wrist_Pitch_Roll_Motor.stl,sha256=iaw_sdJTb6T3xA50Sb5Lk019d2-c0EU8hCdn-YD_bBg,133684
455
+ mani_skill/assets/robots/so100/meshes/Wrist_Pitch_Roll_Motor.stl.convex.stl,sha256=zCFOlOkXJkA0Zontif3LARKf11veiFllwQ69FoPeFxQ,14584
454
456
  mani_skill/assets/robots/trifinger/cube_multicolor_rrc.urdf,sha256=cJ1b7QsYy1aZpAVI-bGkL5xPyzQHToRwcwVZJLTGCuY,451
455
457
  mani_skill/assets/robots/trifinger/high_table_boundary.urdf,sha256=KalDpF19dXuNua26RHGkTycz1S-DV57T-9T7NTlgOCE,1343
456
458
  mani_skill/assets/robots/trifinger/table_without_border.urdf,sha256=P2y3watglInvmtgPideXQET8_KlTVzjeg9XlEW_O7lY,1545
@@ -537,9 +539,9 @@ mani_skill/assets/robots/xarm7/meshes/visual/link7.glb,sha256=aZatACOv20VJbi2tOE
537
539
  mani_skill/assets/robots/xarm7/meshes/visual/link_base.glb,sha256=vcy2lN1V72jIsSDRT0ZKVskR_0pVOXtDvBkxO2GENWs,467668
538
540
  mani_skill/envs/__init__.py,sha256=YPlttBErTcf9vSnkZ54EQ8vTABSfFFrBdUY0AkF4vmg,43
539
541
  mani_skill/envs/minimal_template.py,sha256=9THHWA1vkHatptc9g5Ojh-UBUKWQmLHVeq4fcaqv2aY,2200
540
- mani_skill/envs/sapien_env.py,sha256=mW0ar_nP7TbkdTqycSBq7rjELcWFg1NC2IokV9L7UzQ,72251
542
+ mani_skill/envs/sapien_env.py,sha256=cnJlWCqf1cajCCkok5cDClUKiGtbwpIcDAJmrw8Hfgs,72435
541
543
  mani_skill/envs/scene.py,sha256=_E3n86SmGloC7xSGHF37Pbc-42RC54hSXYlj4s8F4WA,48215
542
- mani_skill/envs/sim2real_env.py,sha256=n4TMNry9ZIx9d9A6BCFDJTEgpNPhcwecCwV5hNhca7w,19220
544
+ mani_skill/envs/sim2real_env.py,sha256=3mkQX4TonE2pUC5_Atmx0IYDH2_v6GSwOPJvQMEvCNY,19214
543
545
  mani_skill/envs/template.py,sha256=0wnwKjnGOF7RvTR5Gz4VopaUiFxnIioXwmb4nPVxAs8,11939
544
546
  mani_skill/envs/scenes/__init__.py,sha256=uL2T3AuoUkqe2FXmFjo4OQAMQDsePa6qVjCjEzJLqtE,868
545
547
  mani_skill/envs/scenes/base_env.py,sha256=jiqKIzWhFWQ_jtRYPXehYixYRQ1-q1YFMBv_T8Ki6eg,7128
@@ -561,11 +563,13 @@ mani_skill/envs/tasks/control/assets/common/visual.xml,sha256=7B0nSrcNlWBBM9r6ks
561
563
  mani_skill/envs/tasks/dexterity/__init__.py,sha256=wXXGA6ZdY5HExcnf3Dux4sMFUgmWjyIKTjWF7PCYYIU,121
562
564
  mani_skill/envs/tasks/dexterity/rotate_single_object_in_hand.py,sha256=cKnlWB5EcTjNVi53wSkqxVgVUYhuRm5QJcPmg9sP-iI,14165
563
565
  mani_skill/envs/tasks/dexterity/rotate_valve.py,sha256=SwSaOUXPZJEC5UdrcLGYwat2m3YUQFpHQ_WHCD77890,11659
564
- mani_skill/envs/tasks/digital_twins/__init__.py,sha256=tp7odz4SZqkM3dpO8HiQuIwECymbLtQXIDcG71T2WfA,35
565
- mani_skill/envs/tasks/digital_twins/base_env.py,sha256=B_YhUdgKclk7IB5qFPj9Ej-0uSyDY1_ubfUcyHyy7_0,8105
566
+ mani_skill/envs/tasks/digital_twins/__init__.py,sha256=_yWWBFH-P69UTPvo9GRa8Ux_FXOjLWdkiK3rs2ojX3o,60
567
+ mani_skill/envs/tasks/digital_twins/base_env.py,sha256=cMHO3jp_NSYiCc5enrRHQLILTJL3LQ2A9Og8xNaQ01w,8273
566
568
  mani_skill/envs/tasks/digital_twins/bridge_dataset_eval/__init__.py,sha256=2okxye0Tg_kmmKNXP7h4MlAxxGS5cJE3OKAo4LIVAcs,172
567
569
  mani_skill/envs/tasks/digital_twins/bridge_dataset_eval/base_env.py,sha256=HFjZwcMOSNduDmyD-qo9zVeHqHOdXdx0H11japbTpEI,21997
568
570
  mani_skill/envs/tasks/digital_twins/bridge_dataset_eval/put_on_in_scene.py,sha256=kDKEX-e1Hq5kZiBs9xfEzU2jjx35eHWriAAYFJcBbgE,9419
571
+ mani_skill/envs/tasks/digital_twins/so100_arm/__init__.py,sha256=uehHSCaHoZDB9awMtF81r4A-X4fM6NFmErzOsgzgSs4,42
572
+ mani_skill/envs/tasks/digital_twins/so100_arm/grasp_cube.py,sha256=vJMNx6tmPVMP1ttiB0AMo-a5PhQR0y8GBsbu2X_GR3E,19397
569
573
  mani_skill/envs/tasks/drawing/__init__.py,sha256=eZ7CnzIWBOHUihvOKStSQK94eKSv5wchRdSodiDYBlw,72
570
574
  mani_skill/envs/tasks/drawing/draw.py,sha256=WlhxJjt0-DlkxC3t-o0M8BoOwdwWpM9reupFg5OqiZc,8146
571
575
  mani_skill/envs/tasks/drawing/draw_svg.py,sha256=UKnVl_tMfUNHmOg24Ny-wFynb5CaZC0uIHvW9sBxbyo,16206
@@ -817,11 +821,11 @@ mani_skill/utils/wrappers/record.py,sha256=757N7D6m6bH02BjIlLvFxGwbQDqDouiRv7F_6
817
821
  mani_skill/utils/wrappers/visual_encoders.py,sha256=ISLO5ceaRkINhvce92VuZMDMCU3I4F7cQWFW2aVP-14,2205
818
822
  mani_skill/vector/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
819
823
  mani_skill/vector/wrappers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
820
- mani_skill/vector/wrappers/gymnasium.py,sha256=v1MDPIrVACBKCulrpdXBK2jDZQI7LKYFZgGgaCC5avY,7408
824
+ mani_skill/vector/wrappers/gymnasium.py,sha256=0kNe_iquf8J3503obkbmCKNaYr5m3cPrC_hBZS0Nl9Y,7408
821
825
  mani_skill/vector/wrappers/sb3.py,sha256=SlXdiEPqcNHYMhJCzA29kBU6zK7DKTe1nc0L6Z3QQtY,4722
822
826
  mani_skill/viewer/__init__.py,sha256=srvDBsk4LQU75K2VIttrhiQ68p_ro7PSDqQRls2PY5c,1722
823
- mani_skill_nightly-2025.6.7.814.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
824
- mani_skill_nightly-2025.6.7.814.dist-info/METADATA,sha256=4rF4IKuYYzAgblhivBT2Lwbxu13igRFqhZJAkEg8s6k,9409
825
- mani_skill_nightly-2025.6.7.814.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
826
- mani_skill_nightly-2025.6.7.814.dist-info/top_level.txt,sha256=bkBgOVl_MZMoQx2aRFsSFEYlZLxjWlip5vtJ39FB3jA,11
827
- mani_skill_nightly-2025.6.7.814.dist-info/RECORD,,
827
+ mani_skill_nightly-2025.6.13.2242.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
828
+ mani_skill_nightly-2025.6.13.2242.dist-info/METADATA,sha256=_TGx8uZcjGTHNreJ70k9uNxVVcN3qOHY6GUBX4OFkwI,9272
829
+ mani_skill_nightly-2025.6.13.2242.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
830
+ mani_skill_nightly-2025.6.13.2242.dist-info/top_level.txt,sha256=bkBgOVl_MZMoQx2aRFsSFEYlZLxjWlip5vtJ39FB3jA,11
831
+ mani_skill_nightly-2025.6.13.2242.dist-info/RECORD,,