Skip to content

Commit 3bbf82a

Browse files
dbellicoso-bdaiexploy-bot
authored andcommitted
Revert "Add mjlab exporter" (#60)
Reverts rai-inst/exploy#47 GitOrigin-RevId: 5aed3efa04600951ca27abea0b97e2798f5a9ef1
1 parent 1af4806 commit 3bbf82a

40 files changed

Lines changed: 1858 additions & 3628 deletions

.github/workflows/test.yml

Lines changed: 1 addition & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ jobs:
9090
cache-write: ${{ github.event_name == 'push' && github.ref_name == 'main' }}
9191
environments: isaaclab
9292

93-
- name: Run IsaacLab Export Test
93+
- name: Run Isaac Lab Export Test
9494
env:
9595
OMNI_KIT_ACCEPT_EULA: yes
9696
run: pixi run -e isaaclab export-isaaclab-ci
@@ -116,41 +116,3 @@ jobs:
116116
env:
117117
OMNI_KIT_ACCEPT_EULA: yes
118118
run: pixi run -e isaaclab test
119-
120-
test-mjlab-export:
121-
name: Test Export mjlab
122-
runs-on: github-gpu-runner
123-
timeout-minutes: 60
124-
steps:
125-
- name: Checkout
126-
uses: actions/checkout@v6
127-
128-
- name: Setup pixi
129-
uses: prefix-dev/setup-pixi@v0.9.4
130-
with:
131-
pixi-version: latest
132-
cache: true
133-
cache-write: ${{ github.event_name == 'push' && github.ref_name == 'main' }}
134-
environments: mjlab
135-
136-
- name: Run mjlab Export Test
137-
run: pixi run -e mjlab export-mjlab-ci
138-
139-
test-frameworks-mjlab:
140-
name: Test Frameworks - mjlab
141-
runs-on: github-gpu-runner
142-
timeout-minutes: 60
143-
steps:
144-
- name: Checkout
145-
uses: actions/checkout@v6
146-
147-
- name: Setup pixi
148-
uses: prefix-dev/setup-pixi@v0.9.4
149-
with:
150-
pixi-version: latest
151-
cache: true
152-
cache-write: ${{ github.event_name == 'push' && github.ref_name == 'main' }}
153-
environments: mjlab
154-
155-
- name: Run Frameworks mjlab Tests
156-
run: pixi run -e mjlab test

.ruff.toml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,14 @@ select = [
1919
ignore = [
2020
"E501", # line-too-long (formatter handles this)
2121
"E402", # module-level-import-not-at-top-of-file (needed for some frameworks)
22+
"F401", # unused-import (may be for re-export)
23+
"F841", # unused-variable (sometimes intentional)
2224
]
2325

26+
[lint.per-file-ignores]
27+
"__init__.py" = ["F401"] # Allow unused imports in __init__.py
28+
"examples/exporter_scripts/export_isaaclab.py" = ["E402", "F401", "F403"] # Allow import flexibility for isaaclab
29+
2430
[format]
2531
quote-style = "double"
2632
indent-style = "space"

.vscode/launch.json

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,11 @@
88
"name": "[Examples] Export IsaacLab task.",
99
"type": "debugpy",
1010
"request": "launch",
11-
"program": "${workspaceFolder}/examples/exporter_scripts/isaaclab/export.py",
11+
"program": "${workspaceFolder}/examples/exporter_scripts/export_isaaclab.py",
1212
"console": "integratedTerminal",
1313
"python": "${workspaceFolder}/.pixi/envs/isaaclab/bin/python",
1414
"justMyCode": false
1515
},
16-
{
17-
"name": "[Examples] Export mjlab task.",
18-
"type": "debugpy",
19-
"request": "launch",
20-
"program": "${workspaceFolder}/examples/exporter_scripts/mjlab/export.py",
21-
"console": "integratedTerminal",
22-
"python": "${workspaceFolder}/.pixi/envs/mjlab/bin/python",
23-
"justMyCode": false,
24-
},
2516
{
2617
"name": "[Core] Tests.",
2718
"type": "debugpy",
@@ -36,6 +27,6 @@
3627
"env": {
3728
"PYTHONPATH": "${workspaceFolder}"
3829
}
39-
}
30+
},
4031
]
4132
}

control/matcher.cpp

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -295,13 +295,9 @@ std::vector<std::unique_ptr<Input>> DepthImageMatcher::createInputs() const {
295295
// --------------- Body matchers ------------------------------
296296
bool BodyPositionMatcher::matches(const Match& maybe_match) {
297297
std::smatch match;
298-
std::regex pattern =
299-
std::regex(fmt::format("obj\\.({})\\.({})\\.pos_b_rt_w_in_w", alphanumeric, alphanumeric));
298+
std::regex pattern = std::regex(
299+
fmt::format("obj\\.({})\\.bodies\\.({})\\.pos_b_rt_w_in_w", alphanumeric, alphanumeric));
300300
if (std::regex_match(maybe_match.name, match, pattern) && match.size() > 2) {
301-
// Exclude "base" - that's handled by BasePositionMatcher
302-
if (match[2].str() == "base") {
303-
return false;
304-
}
305301
found_matches_[match[2].str()] = maybe_match;
306302
return true;
307303
}
@@ -319,12 +315,8 @@ std::vector<std::unique_ptr<Input>> BodyPositionMatcher::createInputs() const {
319315
bool BodyOrientationMatcher::matches(const Match& maybe_match) {
320316
std::smatch match;
321317
std::regex pattern =
322-
std::regex(fmt::format("obj\\.({})\\.({})\\.w_Q_b", alphanumeric, alphanumeric));
318+
std::regex(fmt::format("obj\\.({})\\.bodies\\.({})\\.w_Q_b", alphanumeric, alphanumeric));
323319
if (std::regex_match(maybe_match.name, match, pattern) && match.size() > 2) {
324-
// Exclude "base" - that's handled by BaseOrientationMatcher
325-
if (match[2].str() == "base") {
326-
return false;
327-
}
328320
found_matches_[match[2].str()] = maybe_match;
329321
return true;
330322
}

control/test/components_test.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ TEST_F(OnnxComponentsTest, JointVelocityInput_InitAndRead) {
133133
}
134134

135135
TEST_F(OnnxComponentsTest, BodyOrientationInput_InitAndRead) {
136-
BodyOrientationInput body_input("obj.box1.box.w_Q_b", "test_body");
136+
BodyOrientationInput body_input("obj.box1.bodies.box.w_Q_b", "test_body");
137137

138138
// Test initialization
139139
EXPECT_CALL(state_mock_, initBodyOrientationW("test_body")).WillOnce(Return(true));

control/test/testdata/test_onnx_generator.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@
4040
"sensor.ray_caster.trail.b",
4141
"sensor.depth_image.one",
4242
# body
43-
"obj.box1.box.pos_b_rt_w_in_w",
44-
"obj.box1.box.w_Q_b",
43+
"obj.box1.bodies.box.pos_b_rt_w_in_w",
44+
"obj.box1.bodies.box.w_Q_b",
4545
# memory
4646
"memory.output.joint_targets.jt1.pos.in",
4747
# step count

docs/api/frameworks/isaaclab.rst

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
IsaacLab Framework
1+
Isaac Lab Framework
22
===================
33

4-
IsaacLab integration for RL policy export.
4+
Isaac Lab integration for RL policy export.
55

66
This module provides the ``IsaacLabExportableEnvironment`` class and utilities
7-
for exporting policies trained in NVIDIA IsaacLab to ONNX format.
7+
for exporting policies trained in NVIDIA Isaac Lab to ONNX format.
88

99
.. automodule:: exploy.exporter.frameworks.isaaclab
1010
:members:

examples/exporter_scripts/isaaclab/export.py renamed to examples/exporter_scripts/isaaclab/export_isaaclab.py

Lines changed: 45 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@
1717

1818
def make_simulation_app() -> tuple[SimulationApp, argparse.Namespace]:
1919
# Create argument parser for headless mode
20-
parser = argparse.ArgumentParser(description="Export IsaacLab environment to ONNX")
20+
parser = argparse.ArgumentParser(description="Export Isaac Lab environment to ONNX")
2121

2222
# Add custom arguments
2323
parser.add_argument(
2424
"--task",
2525
type=str,
26-
default="IsaacLab-Velocity-Rough-G1-Play-v0",
27-
help="Name of the IsaacLab task to export (default: IsaacLab-Velocity-Rough-G1-Play-v0)",
26+
default="Isaac-Velocity-Rough-G1-Play-v0",
27+
help="Name of the Isaac Lab task to export (default: Isaac-Velocity-Rough-G1-Play-v0)",
2828
)
2929
parser.add_argument(
3030
"--pause-on-failure",
@@ -61,14 +61,20 @@ def make_simulation_app() -> tuple[SimulationApp, argparse.Namespace]:
6161
from exploy.exporter.core.evaluator import evaluate
6262
from exploy.exporter.core.exporter import export_environment_as_onnx
6363
from exploy.exporter.core.session_wrapper import SessionWrapper
64-
from exploy.exporter.frameworks.isaaclab import environments # noqa: F401
64+
from exploy.exporter.frameworks.isaaclab import (
65+
environments, # noqa: F401
66+
inputs,
67+
memory,
68+
outputs,
69+
)
70+
from exploy.exporter.frameworks.isaaclab.actor import make_exportable_actor
6571
from exploy.exporter.frameworks.isaaclab.env import IsaacLabExportableEnvironment
66-
from exploy.exporter.frameworks.manager_based import inputs, memory, outputs
67-
from exploy.exporter.frameworks.manager_based.actor import make_exportable_actor
6872

6973

70-
def export(task_name: str = "Isaac-Velocity-Rough-G1-Play-v0", pause_on_failure: bool = False):
71-
"""Test IsaacLab ONNX export and evaluation pipeline."""
74+
def export_isaaclab(
75+
task_name: str = "Isaac-Velocity-Rough-G1-Play-v0", pause_on_failure: bool = False
76+
):
77+
"""Test Isaac Lab ONNX export and evaluation pipeline."""
7278
test_dir = pathlib.Path(__file__).parent / "exporter_tests"
7379

7480
task_device = "cpu"
@@ -87,42 +93,50 @@ def export(task_name: str = "Isaac-Velocity-Rough-G1-Play-v0", pause_on_failure:
8793
onnx_export_dir = test_dir
8894
onnx_export_file = "test_export.onnx"
8995

90-
unwrapped_env = env.unwrapped
91-
exportable_env = IsaacLabExportableEnvironment(unwrapped_env)
96+
exportable_env = IsaacLabExportableEnvironment(env.unwrapped)
9297

9398
# Get the policy and its normalizer.
9499
alg: PPO = runner.alg
95100
assert isinstance(alg, PPO), f"Expected PPO algorithm, got: {type(alg).__name__}"
96101
actor = make_exportable_actor(exportable_env, alg.policy, device=task_device)
97102

98-
articulations = unwrapped_env.unwrapped.scene.articulations
103+
articulations = env.unwrapped.scene.articulations
99104
context_manager = exportable_env.context_manager()
100105

101-
inputs.add_base_vel(articulations, context_manager)
106+
inputs.add_base_vel(
107+
articulations=articulations,
108+
context_manager=context_manager,
109+
)
110+
111+
inputs.add_body_pos_and_quat(
112+
articulations=articulations,
113+
context_manager=context_manager,
114+
)
102115

103-
inputs.add_body_pos_and_quat(articulations, context_manager)
116+
inputs.add_commands(
117+
command_manager=env.unwrapped.command_manager,
118+
context_manager=context_manager,
119+
)
104120

105-
inputs.add_command(
106-
unwrapped_env,
107-
context_manager,
108-
command_name="base_velocity",
109-
command_type="se2_velocity",
121+
inputs.add_joint_pos_and_vel(
122+
articulations=articulations,
123+
context_manager=context_manager,
110124
)
111125

112-
inputs.add_joint_pos_and_vel(articulations, context_manager)
126+
inputs.add_sensor_inputs(
127+
sensors=env.unwrapped.scene.sensors,
128+
context_manager=context_manager,
129+
)
113130

114-
for sensor_name, sensor in unwrapped_env.scene.sensors.items():
115-
inputs.add_sensor_input(sensor_name, sensor, context_manager)
131+
memory.add_memory(
132+
env=env.unwrapped,
133+
context_manager=context_manager,
134+
)
116135

117-
memory.add_memory(unwrapped_env, context_manager, attr_name="action")
118-
for action_term_name in unwrapped_env.action_manager.active_terms:
119-
memory.add_memory(
120-
unwrapped_env,
121-
context_manager,
122-
attr_name="processed_actions",
123-
action_term_name=action_term_name,
124-
)
125-
outputs.add_output(unwrapped_env, context_manager, action_term_name=action_term_name)
136+
outputs.add_outputs(
137+
action_manager=env.unwrapped.action_manager,
138+
context_manager=context_manager,
139+
)
126140

127141
export_environment_as_onnx(
128142
env=exportable_env,
@@ -167,7 +181,7 @@ def export(task_name: str = "Isaac-Velocity-Rough-G1-Play-v0", pause_on_failure:
167181
import sys
168182

169183
try:
170-
export(task_name=args.task, pause_on_failure=args.pause_on_failure)
184+
export_isaaclab(task_name=args.task, pause_on_failure=args.pause_on_failure)
171185
except Exception as e:
172186
print(f"❌ Test ERROR: {e}")
173187
import traceback

0 commit comments

Comments
 (0)