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.
- mani_skill/agents/robots/lerobot/__init__.py +0 -0
- mani_skill/agents/robots/lerobot/manipulator.py +124 -0
- mani_skill/agents/robots/so100/so_100.py +62 -11
- mani_skill/assets/robots/so100/README.md +1 -1
- mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/so100.urdf → so100.urdf} +19 -19
- mani_skill/envs/sapien_env.py +5 -1
- mani_skill/envs/sim2real_env.py +63 -61
- mani_skill/envs/tasks/digital_twins/__init__.py +1 -0
- mani_skill/envs/tasks/digital_twins/base_env.py +23 -18
- mani_skill/envs/tasks/digital_twins/so100_arm/__init__.py +1 -0
- mani_skill/envs/tasks/digital_twins/so100_arm/grasp_cube.py +423 -0
- mani_skill/vector/wrappers/gymnasium.py +1 -1
- {mani_skill_nightly-2025.6.7.814.dist-info → mani_skill_nightly-2025.6.13.2242.dist-info}/METADATA +4 -5
- {mani_skill_nightly-2025.6.7.814.dist-info → mani_skill_nightly-2025.6.13.2242.dist-info}/RECORD +54 -50
- /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Base.stl +0 -0
- /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Base.stl.convex.stl +0 -0
- /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Base_Motor.stl +0 -0
- /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Base_Motor.stl.convex.stl +0 -0
- /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Fixed_Jaw.stl +0 -0
- /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Fixed_Jaw.stl.convex.stl +0 -0
- /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Fixed_Jaw_Motor.stl +0 -0
- /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Fixed_Jaw_Motor.stl.convex.stl +0 -0
- /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Fixed_Jaw_part1.ply +0 -0
- /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Fixed_Jaw_part1.ply.convex.stl +0 -0
- /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Fixed_Jaw_part2.ply +0 -0
- /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Fixed_Jaw_part2.ply.convex.stl +0 -0
- /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Lower_Arm.stl +0 -0
- /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Lower_Arm.stl.convex.stl +0 -0
- /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Lower_Arm_Motor.stl +0 -0
- /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Lower_Arm_Motor.stl.convex.stl +0 -0
- /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Moving_Jaw.stl +0 -0
- /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Moving_Jaw.stl.convex.stl +0 -0
- /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Moving_Jaw_part1.ply +0 -0
- /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Moving_Jaw_part1.ply.convex.stl +0 -0
- /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Moving_Jaw_part2.ply +0 -0
- /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Moving_Jaw_part2.ply.convex.stl +0 -0
- /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Moving_Jaw_part3.ply +0 -0
- /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Moving_Jaw_part3.ply.convex.stl +0 -0
- /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Rotation_Pitch.stl +0 -0
- /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Rotation_Pitch.stl.convex.stl +0 -0
- /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Rotation_Pitch_Motor.stl +0 -0
- /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Rotation_Pitch_Motor.stl.convex.stl +0 -0
- /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Upper_Arm.stl +0 -0
- /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Upper_Arm.stl.convex.stl +0 -0
- /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Upper_Arm_Motor.stl +0 -0
- /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Upper_Arm_Motor.stl.convex.stl +0 -0
- /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Wrist_Pitch_Roll.stl +0 -0
- /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Wrist_Pitch_Roll.stl.convex.stl +0 -0
- /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Wrist_Pitch_Roll_Motor.stl +0 -0
- /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Wrist_Pitch_Roll_Motor.stl.convex.stl +0 -0
- /mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/so100.srdf → so100.srdf} +0 -0
- {mani_skill_nightly-2025.6.7.814.dist-info → mani_skill_nightly-2025.6.13.2242.dist-info}/LICENSE +0 -0
- {mani_skill_nightly-2025.6.7.814.dist-info → mani_skill_nightly-2025.6.13.2242.dist-info}/WHEEL +0 -0
- {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
|
{mani_skill_nightly-2025.6.7.814.dist-info → mani_skill_nightly-2025.6.13.2242.dist-info}/METADATA
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: mani-skill-nightly
|
3
|
-
Version: 2025.6.
|
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
|
-
|
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
|
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
|
| -------------------- | ------- | ------- | --------- |
|
{mani_skill_nightly-2025.6.7.814.dist-info → mani_skill_nightly-2025.6.13.2242.dist-info}/RECORD
RENAMED
@@ -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=
|
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=
|
416
|
-
mani_skill/assets/robots/so100/
|
417
|
-
mani_skill/assets/robots/so100/
|
418
|
-
mani_skill/assets/robots/so100/
|
419
|
-
mani_skill/assets/robots/so100/
|
420
|
-
mani_skill/assets/robots/so100/
|
421
|
-
mani_skill/assets/robots/so100/
|
422
|
-
mani_skill/assets/robots/so100/
|
423
|
-
mani_skill/assets/robots/so100/
|
424
|
-
mani_skill/assets/robots/so100/
|
425
|
-
mani_skill/assets/robots/so100/
|
426
|
-
mani_skill/assets/robots/so100/
|
427
|
-
mani_skill/assets/robots/so100/
|
428
|
-
mani_skill/assets/robots/so100/
|
429
|
-
mani_skill/assets/robots/so100/
|
430
|
-
mani_skill/assets/robots/so100/
|
431
|
-
mani_skill/assets/robots/so100/
|
432
|
-
mani_skill/assets/robots/so100/
|
433
|
-
mani_skill/assets/robots/so100/
|
434
|
-
mani_skill/assets/robots/so100/
|
435
|
-
mani_skill/assets/robots/so100/
|
436
|
-
mani_skill/assets/robots/so100/
|
437
|
-
mani_skill/assets/robots/so100/
|
438
|
-
mani_skill/assets/robots/so100/
|
439
|
-
mani_skill/assets/robots/so100/
|
440
|
-
mani_skill/assets/robots/so100/
|
441
|
-
mani_skill/assets/robots/so100/
|
442
|
-
mani_skill/assets/robots/so100/
|
443
|
-
mani_skill/assets/robots/so100/
|
444
|
-
mani_skill/assets/robots/so100/
|
445
|
-
mani_skill/assets/robots/so100/
|
446
|
-
mani_skill/assets/robots/so100/
|
447
|
-
mani_skill/assets/robots/so100/
|
448
|
-
mani_skill/assets/robots/so100/
|
449
|
-
mani_skill/assets/robots/so100/
|
450
|
-
mani_skill/assets/robots/so100/
|
451
|
-
mani_skill/assets/robots/so100/
|
452
|
-
mani_skill/assets/robots/so100/
|
453
|
-
mani_skill/assets/robots/so100/
|
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=
|
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=
|
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=
|
565
|
-
mani_skill/envs/tasks/digital_twins/base_env.py,sha256=
|
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=
|
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.
|
824
|
-
mani_skill_nightly-2025.6.
|
825
|
-
mani_skill_nightly-2025.6.
|
826
|
-
mani_skill_nightly-2025.6.
|
827
|
-
mani_skill_nightly-2025.6.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|
/mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Base_Motor.stl.convex.stl
RENAMED
File without changes
|
File without changes
|
/mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Fixed_Jaw.stl.convex.stl
RENAMED
File without changes
|
File without changes
|
/mani_skill/assets/robots/so100/{SO_5DOF_ARM100_8j/meshes → meshes}/Fixed_Jaw_Motor.stl.convex.stl
RENAMED
File without changes
|