diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..ea32980 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,2 @@ +# Ignore everything +* diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..c75a976 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,693 @@ +{ + // Ref: ~/.local/share/ov/pkg/isaac_sim-2023.1.0/.vscode/settings.json + "python.analysis.extraPaths": [ + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.exporter.urdf", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.exporter.urdf/pip_prebundle", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.app.selector", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.app.setup", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.articulation_inspector", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.asset_browser", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.assets_check", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.benchmark_environments", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.benchmarks", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.camera_inspector", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.cloner", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.conveyor", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.core", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.core_archive", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.core_archive/pip_prebundle", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.core_nodes", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.cortex", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.cortex.sample_behaviors", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.cortex_sync", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.debug_draw", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.diff_usd", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.dofbot", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.dynamic_control", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.examples", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.examples_nodes", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.extension_templates", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.franka", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.gain_tuner", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.gxf_bridge", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.gym", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.internal_tools", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.kit", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.lula", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.lula/pip_prebundle", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.lula_test_widget", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.manipulators", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.merge_mesh", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.mjcf", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.ml_archive", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.ml_archive/pip_prebundle", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.motion_generation", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.occupancy_map", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.ocs2", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.onshape", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.partition", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.physics_inspector", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.physics_utilities", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.proximity_sensor", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.quadruped", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.range_sensor", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.repl", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.robot_assembler", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.robot_benchmark", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.robot_description_editor", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.ros2_bridge", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.ros_bridge", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.scene_blox", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.sensor", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.shapenet", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.statistics_logging", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.surface_gripper", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.synthetic_recorder", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.synthetic_utils", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.tests", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.ui", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.ui_template", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.unit_converter", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.universal_robots", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.urdf", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.utils", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.version", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.wheeled_robots", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.isaac.window.about", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.kit.loop-isaac", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.kit.property.isaac", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.pip.cloud", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.pip.cloud/pip_prebundle", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.pip.compute", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.pip.compute/pip_prebundle", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.replicator.isaac", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/exts/omni.usd.schema.isaac", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.anim.curve-105.23.0+105.1.lx64.r.cp310.ub3f", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.anim.curve.bundle-1.2.0+105.1.ub3f", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.anim.curve.ui-1.3.1+105.1.ub3f", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.anim.curve_editor-105.16.0+105.1.ub3f", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.anim.graph.bundle-105.1.1+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.anim.graph.core-105.1.14+105.1.lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.anim.graph.schema-105.1.1+lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.anim.graph.ui-105.1.3+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.anim.motion_path.bundle-1.1.0+105.1.ub3f", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.anim.motion_path.core-1.1.3+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.anim.motion_path.ui-1.1.3+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.anim.navigation.bundle-105.1.0+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.anim.navigation.core-105.1.3+105.1.lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.anim.navigation.schema-105.1.0+lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.anim.navigation.ui-105.1.3+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.anim.people-0.1.11", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.anim.retarget.bundle-105.1.1+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.anim.retarget.core-105.1.5+105.1.lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.anim.retarget.ui-105.1.4+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.anim.shared.core-105.8.2+105.1.lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.anim.skelJoint-105.1.14+105.1.lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.anim.timeline-105.0.15+105.1.lx64.r.cp310.ub3f", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.anim.widget.timeline-0.1.8+105.1.ub3f", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.anim.window.timeline-105.11.14+105.1.ub3f", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.asset_validator.core-0.8.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.asset_validator.ui-0.8.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.audio.boom-0.5.5+105.1.lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.blast-0.13.6+105.1.lx64.r", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.curve.creator-105.0.3+105.1.lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.curve.manipulator-105.1.8+105.1.lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.entity.spawn.bundle-0.2.0", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.entity.spawn.core-0.2.0+105.1.ub3f", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.entity.spawn.ui-0.4.1+105.1.ub3f", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.flowusd-105.1.44+105.1.lx64.r.cp310.ub3f", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.flowusd.bundle-1.0.2+105.1.ub3f", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.flowusd.ui-105.1.2+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.genproc.bundle-105.1.0+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.genproc.core-105.1.4+105.1.lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.genproc.ui-105.1.0+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.graph.bundle.action-2.0.4", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.graph.visualization.nodes-2.1.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.graph.window.action-1.11.2+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.graph.window.core-1.84.0+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.graph.window.generic-1.9.3+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.graph.window.particle.system-105.1.18+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.importer.mjcf-1.1.0+105.1.lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.importer.urdf-1.1.3+105.1.lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.isaac.onshape-0.6.5+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.agent-0.1.7", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.agent.watcher-0.2.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.asset_converter-2.0.12+lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.browser.asset-1.3.5", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.browser.asset_provider.actorcore-1.0.6", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.browser.asset_provider.local-1.0.9", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.browser.asset_provider.sketchfab-1.0.10", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.browser.asset_provider.turbosquid-1.0.9", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.browser.asset_store-1.2.0", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.browser.core-2.3.9", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.browser.deepsearch-1.1.4", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.browser.folder.core-1.9.7", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.browser.material-1.4.2", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.browser.sample-1.4.6", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.browser.showcase-1.0.4", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.browser.texture-1.2.0", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.collaboration.viewport.camera-2.0.13", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.converter.cad-200.0.0-rc.4+105.0", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.converter.cad_core-200.0.0-rc.3+105.0.lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.converter.geojson-0.0.10+lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.converter.lib3mf-1.1.3", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.converter.ogc-1.1.21+lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.core.collection-0.1.5", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.data2ui.core-1.0.13+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.data2ui.usd-1.0.13+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.environment.core-1.3.3", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.environment.sunstudy-1.0.10", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.graph.delegate.default-1.1.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.graph.delegate.modern-1.9.0", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.graph.delegate.neo-1.0.5", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.graph.editor.core-1.5.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.graph.editor.example-1.0.22", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.graph.usd.commands-1.3.0", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.graph.widget.variables-2.0.4", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.livestream.core-2.0.0+105.1.lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.livestream.core-2.2.1+105.1.lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.livestream.native-2.0.0+105.1.lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.livestream.native-2.3.0+105.1.lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.livestream.webrtc-2.2.1+105.1.lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.manipulator.tool.mesh_snap-1.4.4+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.menu.stage-1.2.3", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.mesh.raycast-105.3.1+105.1.lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.ngsearch-0.2.4", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.nvdf.telemetry-1.2.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.painter_link-204.0.4", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.playlist.core-1.1.9", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.pointclouds-1.1.2+cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.preferences.animation-1.1.0+105.1.ub3f", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.prim.icon-1.0.10", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.profiler.tracy-1.1.4+105.1.lx64", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.profiler.window-2.1.2", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.property.collection-0.1.15", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.property.environment-1.1.5", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.property.sbsar-105.0.3", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.property.sequence-0.3.0", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.property.visualization-104.0.4", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.quicksearch.actions-0.8.11", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.quicksearch.commands-1.1.3", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.quicksearch.hdri-0.8.12", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.quicksearch.material-0.8.10", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.quicksearch.menu-0.8.7", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.quicksearch.props-0.8.7", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.quicksearch.select-0.8.3", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.quicksearch.settings-0.8.6", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.scripting-105.1.1+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.search.files-1.0.4", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.search.service-0.1.9", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.sequencer.core-103.4.1+105.0", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.sequencer.usd-103.4.2+105.0", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.stage_column.payload-1.0.10", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.stage_column.variant-1.0.12", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.stagerecorder.bundle-105.0.2+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.stagerecorder.core-105.0.4+105.1.lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.stagerecorder.ui-105.0.4+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.streamsdk.plugins-2.1.3+105.1.lx64.r", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.streamsdk.plugins-2.3.7+105.1.lx64.r", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.testing.services-1.6.28", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.text3d-1.3.0", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.thumbnails.mdl-1.0.23", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.thumbnails.usd-1.0.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.tool.asset_exporter-1.2.11", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.tool.asset_importer-2.4.18", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.tool.measure-105.1.1+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.tool.remove_unused.controller-0.1.3", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.tool.remove_unused.core-0.1.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.tools.mergemesh-0.1.6", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.tools.surface_instancer-0.1.23+lx64.ub3f", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.usd_presenter.conn.manager-0.1.4", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.variant.editor-105.0.4", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.variant.presenter-105.1.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.viewport.menubar.lighting-105.0.5+ub3f", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.viewport.menubar.waypoint-104.2.12", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.waypoint.bundle-1.0.4", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.waypoint.core-1.3.34", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.waypoint.playlist-1.0.4", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.widget.calendar-1.0.8", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.widget.collection-0.1.13", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.widget.extended_searchfield-1.0.24", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.widget.material_preview-1.0.7", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.widget.sliderbar-1.0.10", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.widget.timeline-105.0.1+105.0", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.widget.zoombar-1.0.4", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.widgets.custom-1.0.5", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.window.collection-0.1.17", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.window.environment-1.6.10", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.window.material-1.4.0", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.window.material_graph-1.8.9", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.window.movie_capture-2.2.15", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.window.quicksearch-2.4.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.window.section-105.0.5", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.window.sequencer-103.4.1+105.0", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.window.usddebug-1.0.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.xr.advertise-105.1.0-142+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.xr.core-105.1.0-142+105.1.lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.xr.profile.ar-105.1.0-142+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.xr.profile.common-105.1.0-142+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.xr.profile.tabletar-105.1.0-142+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.xr.profile.vr-105.1.0-142+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.xr.sceneview_utils-105.1.0-142+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.xr.system.cloudxr-105.1.0-142+105.1.lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.xr.system.openxr-105.1.0-142+105.1.lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.xr.system.playback-105.1.0-142+105.1.lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.xr.system.simulatedxr-105.1.0-142+105.1.lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.xr.system.steamvr-105.1.0-142+105.1.lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.xr.telemetry-105.1.0-142+105.1.lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.xr.ui.config.common-105.1.0-142+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.xr.ui.config.generic-105.1.0-142+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.xr.ui.config.htcvive-105.1.0-142+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.xr.ui.config.magicleap-105.1.0-142+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.xr.ui.config.metaquest-105.1.0-142+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.xr.ui.stage.common-105.1.0-142+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.xr.ui.window.profile-105.1.0-142+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.kit.xr.ui.window.viewport-105.1.0-142+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.no_code_ui.bundle-1.0.7", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.ocean-0.4.4", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.paint.brush.attributes-1.3.1+105.0", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.paint.brush.scatter-105.1.4+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.paint.brush.scripting-105.0.2+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.paint.system.bundle-105.9.2+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.paint.system.core-105.9.0+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.paint.system.ui-105.1.4+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.particle.system.bundle-105.1.0+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.particle.system.core-105.1.6+105.1.lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.particle.system.ui-105.1.10+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.pip.torch-2_0_1-2.0.2+105.1.lx64", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.pip.torch-2_0_1-2.0.2+105.1.lx64/torch-2-0-1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.potree_converter-1.0.3+105.1.lx64.r.cp310.ub3f", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.product_configurator.panel-1.0.15", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.product_configurator.utils-1.2.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.ramp-105.1.12+105.1.lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.replicator.composer-1.2.17+lx64", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.replicator.core-1.10.10+105.1.lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.replicator.replicator_yaml-2.0.4+lx64", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.scene.optimizer.bundle-105.1.8+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.scene.optimizer.core-105.1.8+105.1.lx64.r.cp310.ub3f", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.scene.optimizer.ui-105.1.3+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.scene.visualization.bundle-105.1.0+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.scene.visualization.core-105.4.10+105.1.lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.scene.visualization.ui-105.1.1+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.schema.audio.boom-0.4.0+105.1.lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.sensors.fov_preview_visualization-0.1.0-isaacsim.3", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.sensors.nv.beams-0.1.2-isaacsim.3+lx64.r", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.sensors.nv.camera-0.6.0-isaacsim.3+lx64.r", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.sensors.nv.common-0.0.2-isaacsim.3+lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.sensors.nv.ids-0.0.3-isaacsim.3+lx64.r", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.sensors.nv.lidar-0.1.4-isaacsim.3+lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.sensors.nv.lidar_tools-0.1.0-isaacsim.3+lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.sensors.nv.material_tools-0.1.0-isaacsim.3+lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.sensors.nv.materials-0.1.1-isaacsim.3+lx64.r", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.sensors.nv.radar-0.1.1-isaacsim.3+lx64.r", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.sensors.nv.radar_tools-0.1.0-isaacsim.3+lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.sensors.nv.ultrasonic-0.1.2-isaacsim.3+lx64.r", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.sensors.nv.wpm-0.1.2-isaacsim.3+lx64.r", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.services.browser.asset-1.3.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.services.carb.event_stream-1.0.0", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.services.client-0.5.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.services.core-1.5.5", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.services.facilities.base-1.0.3", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.services.facilities.workqueue-1.1.2", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.services.pip_archive-0.11.0+lx64", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.services.starfleet.auth-0.1.5", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.services.streamclient.webrtc-1.3.8", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.services.streamclient.websocket-2.0.0", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.services.streaming.manager-0.3.8", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.services.thumbnails.images-1.3.2", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.services.transport.client.base-1.2.3", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.services.transport.client.http_async-1.3.4", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.services.transport.server.base-1.1.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.services.transport.server.http-1.3.0", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.services.transport.server.tcp_socket-1.0.2", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.services.transport.server.zeroconf-1.0.8", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.services.usd-1.1.0", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.simready.explorer-1.0.26", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.slangnode-105.1.2+105.1.lx64.r.cp310.ub3f", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.tools.array-105.0.4", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.tools.distribute-105.0.4", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.tools.pivot-105.0.3", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.tools.randomizer-105.0.2", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.usd.fileformat.e57-1.1.4+105.1.lx64.r.cp310.ub3f", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.usd.fileformat.sbsar-105.0.5+lx64.r.cp310.ub3f", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.usd.metrics.assembler-105.1.5+105.1.lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.usd.metrics.assembler.physics-105.1.2+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.usd.metrics.assembler.ui-105.1.10+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.usd.schema.destruction-0.6.0+105.1.lx64.r", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.usd.schema.flow-105.1.11+105.1.ub3f", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.usd.schema.metrics.assembler-105.1.2+105.1.lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.usd.schema.scene.visualization-2.0.2+105.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.usd.schema.sequence-2.3.0+105.0.lx64.r.cp310", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.vdb_timesample_editor-0.1.8", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.warehouse_creator-0.3.4", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.warp-0.10.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/omni.warp.core-0.10.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/extscache/semantics.schema.editor-0.3.4", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/carb.audio", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/carb.windowing.plugins", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.activity.core", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.activity.freeze_monitor", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.activity.profiler", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.activity.pump", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.activity.ui", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.activity.usd_resolver", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.app.setup", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.app.workflow.startup", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.appwindow", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.assets", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.audioplayer", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.audiorecorder", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.command.usd", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.datastore", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.debugdraw", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.example.ui", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.fabric.fabric_inspector", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.gpu_foundation", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.gpucompute.plugins", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.graph", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.graph.action", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.graph.core", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.graph.docs", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.graph.examples.cpp", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.graph.examples.python", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.graph.exec", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.graph.expression", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.graph.image.core", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.graph.io", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.graph.nodes", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.graph.rtxtest", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.graph.scriptnode", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.graph.test", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.graph.tools", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.graph.tutorials", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.graph.ui", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.graph.ui_nodes", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.hsscclient", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.hydra.engine.stats", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.hydra.index", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.hydra.index_remote", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.hydra.iray", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.hydra.pxr", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.hydra.pxr.settings", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.hydra.rtx", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.hydra.scene_api", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.hydra.scene_delegate", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.hydra.ui", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.hydra.usdrt_delegate", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.index", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.index.compute", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.index.libs", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.index.settings.core", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.index.usd", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.inspect", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.iray.libs", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.iray.settings.core", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.actions.core", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.actions.window", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.app_snippets", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.audio.test.usd", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.audiodeviceenum", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.autocapture", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.capture", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.capture.viewport", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.clipboard", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.collaboration.channel_manager", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.collaboration.presence_layer", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.collaboration.selection_outline", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.collaboration.stage_columns", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.collaboration.telemetry", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.collaboration.viewport.camera", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.commands", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.compatibility_checker", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.context_menu", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.core.tests", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.debug.python", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.debug.vscode", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.documentation.builder", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.documentation.ui.style", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.example.toolbar_button", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.exec.core", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.exec.debug", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.exec.example-carb", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.exec.example-omni", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.extpath.git", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.filebrowser_column.acl", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.filebrowser_column.tags", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.gfn", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.helper.file_utils", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.hotkeys.core", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.hotkeys.window", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.hydra_texture", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.loop-default", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.mainwindow", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.manipulator.camera", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.manipulator.prim", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.manipulator.prim2.core", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.manipulator.selection", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.manipulator.selector", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.manipulator.tool.snap", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.manipulator.transform", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.manipulator.viewport", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.material.library", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.menu.aov", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.menu.common", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.menu.create", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.menu.edit", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.menu.file", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.menu.utils", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.multinode", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.notification_manager", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.numpy.common", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.pip_archive", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.pip_archive/pip_prebundle", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.pipapi", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.primitive.mesh", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.profile_python", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.property.audio", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.property.bundle", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.property.camera", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.property.file", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.property.geometry", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.property.layer", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.property.light", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.property.material", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.property.render", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.property.skel", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.property.tagging", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.property.transform", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.property.usd", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.property.usd_clipboard_test", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.quicklayout", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.raycast.query", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.renderer.capture", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.renderer.core", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.renderer.cuda_interop", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.renderer.imgui", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.renderer.init", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.scene_view.opengl", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.scene_view.usd", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.search_core", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.search_example", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.selection", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.stage.copypaste", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.stage.mdl_converter", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.stage_templates", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.tagging", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.telemetry", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.test", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.test_app_compat", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.test_app_full_nonrtx", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.test_async_rendering", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.test_helpers_gfx", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.test_suite.browser", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.test_suite.helpers", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.test_suite.layer_window", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.test_suite.layout", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.test_suite.menu", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.test_suite.stage_window", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.test_suite.viewport", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.tool.collect", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.ui_test", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.uiapp", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.usd.collect", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.usd.layers", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.usd_undo", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.usda_edit", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.usdz_export", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.viewport.actions", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.viewport.bundle", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.viewport.docs", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.viewport.legacy_gizmos", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.viewport.manipulator.transform", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.viewport.menubar.camera", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.viewport.menubar.core", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.viewport.menubar.display", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.viewport.menubar.render", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.viewport.menubar.settings", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.viewport.pxr", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.viewport.ready", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.viewport.registry", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.viewport.rtx", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.viewport.scene_camera_model", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.viewport.utility", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.viewport.window", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.viewport_widgets_manager", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.welcome.about", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.welcome.extensions", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.welcome.learn", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.welcome.open", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.welcome.whats_new", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.welcome.window", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.widget.browser_bar", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.widget.cache_indicator", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.widget.fast_search", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.widget.filebrowser", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.widget.filter", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.widget.graph", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.widget.highlight_label", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.widget.imageview", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.widget.inspector", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.widget.layers", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.widget.live", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.widget.live_session_management", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.widget.nucleus_connector", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.widget.nucleus_info", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.widget.opengl", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.widget.options_menu", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.widget.path_field", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.widget.prompt", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.widget.search_delegate", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.widget.searchable_combobox", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.widget.searchfield", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.widget.settings", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.widget.spinner", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.widget.stage", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.widget.stage_icons", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.widget.text_editor", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.widget.toolbar", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.widget.versioning", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.widget.viewport", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.window.about", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.window.audio.oscilloscope", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.window.audioplayer", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.window.audiorecorder", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.window.commands", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.window.console", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.window.content_browser", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.window.content_browser_registry", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.window.cursor", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.window.drop_support", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.window.extensions", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.window.file", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.window.file_exporter", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.window.file_importer", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.window.filepicker", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.window.images", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.window.imageviewer", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.window.imguidebug", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.window.inspector", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.window.material_swap", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.window.popup_dialog", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.window.preferences", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.window.privacy", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.window.property", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.window.provide_feedback", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.window.reshade_editor", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.window.script_editor", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.window.splash", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.window.splash_close_example", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.window.stage", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.window.stageviewer", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.window.stats", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.window.status_bar", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.window.tests", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.window.title", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.window.toolbar", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.window.usd_paths", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.window.viewport", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.kit.window.welcome", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.mdl", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.mdl.distill_and_bake", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.mdl.neuraylib", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.mdl.usd_converter", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.mtlx", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.population", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.resourcemonitor", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.rtx.index_composite", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.rtx.ovtextureconverter", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.rtx.settings.core", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.rtx.shadercache.vulkan", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.rtx.tests", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.rtx.ujitsoprocessors", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.rtx.window.settings", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.stats", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.syntheticdata", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.taskagent", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.timeline", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.timeline.live_session", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.ui", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.ui.scene", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.ui_query", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.uiaudio", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.ujitso", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.ujitso.python", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.usd", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.usd.config", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.usd.core", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.usd.libs", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.usd.schema.anim", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.usd.schema.audio", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.usd.schema.geospatial", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.usd.schema.omnigraph", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.usd.schema.omniscripting", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.usd.schema.physics", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.usd.schema.semantics", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.usd_resolver", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.videoencoding", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/omni.volume", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/usdrt.gf", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/exts/usdrt.scenegraph", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/extsPhysics/omni.blockworld-105.1.8-5.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/extsPhysics/omni.convexdecomposition-105.1.8-5.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/extsPhysics/omni.kit.property.physx", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/extsPhysics/omni.kvdb", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/extsPhysics/omni.localcache", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/extsPhysics/omni.physics.tensors-105.1.8-5.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/extsPhysics/omni.physics.tensors.tests-105.1.8-5.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/extsPhysics/omni.physx-105.1.8-5.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/extsPhysics/omni.physx.bundle-105.1.8-5.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/extsPhysics/omni.physx.camera-105.1.8-5.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/extsPhysics/omni.physx.camera.tests-105.1.8-5.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/extsPhysics/omni.physx.cct-105.1.8-5.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/extsPhysics/omni.physx.commands-105.1.8-5.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/extsPhysics/omni.physx.cooking-105.1.8-5.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/extsPhysics/omni.physx.demos-105.1.8-5.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/extsPhysics/omni.physx.fabric-105.1.8-5.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/extsPhysics/omni.physx.forcefields-105.1.8-5.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/extsPhysics/omni.physx.foundation-105.1.8-5.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/extsPhysics/omni.physx.graph-105.1.8-5.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/extsPhysics/omni.physx.internal-105.1.8-5.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/extsPhysics/omni.physx.pvd-105.1.8-5.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/extsPhysics/omni.physx.supportui-105.1.8-5.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/extsPhysics/omni.physx.tensors-105.1.8-5.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/extsPhysics/omni.physx.tests-105.1.8-5.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/extsPhysics/omni.physx.tests.mini-105.1.8-5.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/extsPhysics/omni.physx.tests.visual-105.1.8-5.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/extsPhysics/omni.physx.ui-105.1.8-5.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/extsPhysics/omni.physx.vehicle-105.1.8-5.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/extsPhysics/omni.physx.vehicle.tests-105.1.8-5.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/extsPhysics/omni.physx.zerogravity-105.1.8-5.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/extsPhysics/omni.physx.zerogravity.tests-105.1.8-5.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/extsPhysics/omni.usd.schema.forcefield", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/extsPhysics/omni.usd.schema.physx", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/extsPhysics/omni.usdphysics-105.1.8-5.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/extsPhysics/omni.usdphysics.tests-105.1.8-5.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/extsPhysics/omni.usdphysics.ui-105.1.8-5.1", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/extscore/omni.assets.plugins", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/extscore/omni.client", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/extscore/omni.kit.async_engine", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/extscore/omni.kit.registry.nucleus", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/kernel/py", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2023.1.0/kit/plugins/bindings-python", + ] +} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..df9166c --- /dev/null +++ b/Dockerfile @@ -0,0 +1,29 @@ +# Ref: https://catalog.ngc.nvidia.com/orgs/nvidia/containers/isaac-sim +FROM nvcr.io/nvidia/isaac-sim:2023.1.0-hotfix.1 + +ENV ISAAC_SIM=/isaac-sim +WORKDIR /root +# Install common tools +RUN apt-get update && apt-get install -y git wget vim \ + && rm -rf /var/lib/apt/lists/* +# Download and Install Anaconda +# Ref: https://www.anaconda.com/products/distribution#Downloads +RUN wget -q https://repo.anaconda.com/archive/Anaconda3-2022.10-Linux-x86_64.sh \ + && bash Anaconda3-2022.10-Linux-x86_64.sh -b -p $HOME/anaconda3 +# Patch Isaac Sim 2023.1.0 +# Ref: https://github.com/j3soon/isaac-extended +RUN git clone https://github.com/j3soon/isaac-extended.git \ + && cp $ISAAC_SIM/setup_python_env.sh $ISAAC_SIM/setup_python_env.sh.bak \ + && cp ~/isaac-extended/isaac_sim-2023.1.0-patch/linux/setup_python_env.sh $ISAAC_SIM/setup_python_env.sh +# Set up conda environment for Isaac Sim +# Ref: https://docs.omniverse.nvidia.com/isaacsim/latest/installation/install_python.html#advanced-running-with-anaconda +RUN . ~/anaconda3/etc/profile.d/conda.sh \ + # conda remove --name isaac-sim --all + && cd $ISAAC_SIM \ + && conda env create -f environment.yml +# Activation commands for the conda environment +RUN echo ". ~/anaconda3/etc/profile.d/conda.sh" >> ~/.bashrc \ + && echo "conda activate isaac-sim" >> ~/.bashrc \ + && echo ". ${ISAAC_SIM}/setup_conda_env.sh" >> ~/.bashrc + +WORKDIR /isaac-sim diff --git a/LICENSE.txt b/LICENSE.txt index e5e823e..f5a2892 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -3,6 +3,7 @@ Omniverse Isaac Gym Reinforcement Learning Environments for Isaac Sim BSD 3-Clause License Copyright (c) 2018-2022, NVIDIA Corporation +Copyright (c) 2022-2023, Johnson Sun All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/README.md b/README.md index 32049b8..5c60a16 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,261 @@ +# Hiwin Reacher Reinforcement Learning Sim2Real Environment for Omniverse Isaac Gym/Sim + +This repository adds a HiwinReacher environment based on [OmniIsaacGymEnvs](https://github.com/NVIDIA-Omniverse/OmniIsaacGymEnvs) (commit [cc1aab0](https://github.com/NVIDIA-Omniverse/OmniIsaacGymEnvs/tree/cc1aab0f904ade860fc0761d62edb6e706ab89ec)), and plan to include Sim2Real code to control a real-world [Hiwin](https://www.hiwin.tw/products/mar/multi_axis_robot_list.aspx) with the policy learned by reinforcement learning in Omniverse Isaac Gym/Sim. + +The RL code in this branch is only tested on Linux using Isaac Sim 2023.1.0. The Sim2Real code isn't implemented yet. + +This repo is compatible with the following repositories: +- [OmniIsaacGymEnvs-DofbotReacher](https://github.com/j3soon/OmniIsaacGymEnvs-DofbotReacher) +- [OmniIsaacGymEnvs-UR10Reacher](https://github.com/j3soon/OmniIsaacGymEnvs-UR10Reacher) +- [OmniIsaacGymEnvs-KukaReacher](https://github.com/j3soon/OmniIsaacGymEnvs-KukaReacher) +- [OmniIsaacGymEnvs-HiwinReacher](https://github.com/j3soon/OmniIsaacGymEnvs-HiwinReacher) + +## Preview + +![](docs/media/HiwinRA6201621Reacher-Vectorized.gif) +(HiwinRA620-1621) + +## Installation + +Prerequisites: +- Before starting, please make sure your hardware and software meet the [system requirements](https://docs.omniverse.nvidia.com/isaacsim/latest/installation/requirements.html#system-requirements). +- [Install Omniverse Isaac Sim 2023.1.0](https://docs.omniverse.nvidia.com/isaacsim/latest/installation/install_workstation.html) (Must setup Cache and Nucleus) + - You may try out newer versions of Isaac Sim along with [their corresponding patch](https://github.com/j3soon/isaac-extended#conda-issue-on-linux), but it is not guaranteed to work. +- Double check that Nucleus is correctly installed by [following these steps](https://github.com/j3soon/isaac-extended#nucleus). +- Your computer & GPU should be able to run the Cartpole example in [OmniIsaacGymEnvs](https://github.com/NVIDIA-Omniverse/OmniIsaacGymEnvs) +- (Optional) [Set up a Hiwin](https://www.hiwin.tw/products/mar/multi_axis_robot_list.aspx) in the real world + +Make sure to install Isaac Sim in the default directory and clone this repository to the home directory. Otherwise, you will encounter issues if you didn't modify the commands below accordingly. + +We will use Anaconda to manage our virtual environment: + +1. Clone this repository and the patches repo: + - Linux + ```sh + cd ~ + git clone https://github.com/j3soon/OmniIsaacGymEnvs-HiwinReacher.git + git clone https://github.com/j3soon/isaac-extended.git + ``` + - Windows + ```sh + cd %USERPROFILE% + git clone https://github.com/j3soon/OmniIsaacGymEnvs-HiwinReacher.git + git clone https://github.com/j3soon/isaac-extended.git + ``` +2. Generate [instanceable](https://docs.omniverse.nvidia.com/isaacsim/latest/isaac_gym_tutorials/tutorial_gym_instanceable_assets.html) Hiwin assets for training: + + [Launch the Script Editor](https://docs.omniverse.nvidia.com/app_isaacsim/app_isaacsim/tutorial_gui_interactive_scripting.html#script-editor) in Isaac Sim. Copy the content in `omniisaacgymenvs/utils/usd_utils/create_instanceable_${ROBOT_NAME_LOWER}_from_urdf.py` and execute it inside the Script Editor window. Wait until you see the text `Done!`. + + The `${ROBOT_NAME_LOWER}` should be replaced with one of the following: + - `hiwinra6201621` + + The URDF files in `/thirdparty/*` are provided by [HIWINCorporation](https://github.com/HIWINCorporation/hiwin_ros). The details on how to download & generate this file can be found in the commit message of [a683bc9](https://github.com/j3soon/OmniIsaacGymEnvs-HiwinReacher/commit/a683bc94f76a58bfce843fa08f33c760bc544dfc) and [613aa93](https://github.com/j3soon/OmniIsaacGymEnvs-HiwinReacher/commit/613aa93576dc18b6396bf355dfcb3f07756d2e2f). + +3. [Download and Install Anaconda](https://www.anaconda.com/products/distribution#Downloads). + ```sh + # For 64-bit Linux (x86_64/x64/amd64/intel64) + wget https://repo.anaconda.com/archive/Anaconda3-2022.10-Linux-x86_64.sh + bash Anaconda3-2022.10-Linux-x86_64.sh + ``` + For Windows users, make sure to use `Anaconda Prompt` instead of `Anaconda Powershell Prompt`, `Command Prompt`, or `Powershell` for the following commands. +4. Patch Isaac Sim 2023.1.0 + - Linux + ```sh + export ISAAC_SIM="$HOME/.local/share/ov/pkg/isaac_sim-2023.1.0" + cp $ISAAC_SIM/setup_python_env.sh $ISAAC_SIM/setup_python_env.sh.bak + cp ~/isaac-extended/isaac_sim-2023.1.0-patch/linux/setup_python_env.sh $ISAAC_SIM/setup_python_env.sh + ``` + - Windows + > (To be updated) +5. [Set up conda environment for Isaac Sim](https://docs.omniverse.nvidia.com/isaacsim/latest/installation/install_python.html#advanced-running-with-anaconda) + - Linux + ```sh + # conda remove --name isaac-sim --all + export ISAAC_SIM="$HOME/.local/share/ov/pkg/isaac_sim-2023.1.0" + cd $ISAAC_SIM + conda env create -f environment.yml + conda activate isaac-sim + cd ~/OmniIsaacGymEnvs-HiwinReacher + pip install -e . + ``` + - Windows + > (To be updated) +6. Activate conda environment + - Linux + ```sh + export ROBOT_NAME="HiwinRA6201621" + export ROBOT_NAME_LOWER="hiwinra6201621" + export ISAAC_SIM="$HOME/.local/share/ov/pkg/isaac_sim-2023.1.0" + cd $ISAAC_SIM + conda activate isaac-sim + source setup_conda_env.sh + ``` + - Windows + ```sh + set ROBOT_NAME="HiwinRA6201621" + set ROBOT_NAME_LOWER="hiwinra6201621" + set ISAAC_SIM="%LOCALAPPDATA%\ov\pkg\isaac_sim-2023.1.0" + cd %ISAAC_SIM% + conda activate isaac-sim + call setup_conda_env.bat + ``` + +Please note that you should execute the commands in Step 6 for every new shell. + +For Windows users, replace `~` to `%USERPROFILE%` for all the following commands. + +## Dummy Policy + +This is a sample to make sure you have setup the environment correctly. You should see a single Hiwin in Isaac Sim. + +```sh +cd ~/OmniIsaacGymEnvs-HiwinReacher +python omniisaacgymenvs/scripts/dummy_${ROBOT_NAME_LOWER}_policy.py task=${ROBOT_NAME}Reacher test=True num_envs=1 +``` + +Alternatively, you can replace the dummy policy with a random policy with `omniisaacgymenvs/scripts/random_policy.py`. + +## Training + +You can launch the training in `headless` mode as follows: + +```sh +cd ~/OmniIsaacGymEnvs-HiwinReacher +python omniisaacgymenvs/scripts/rlgames_train.py task=${ROBOT_NAME}Reacher headless=True +``` + +The number of environments is set to 2048 by default. If your GPU has small memory, you can decrease the number of environments by changing the arguments `num_envs` as below: + +```sh +cd ~/OmniIsaacGymEnvs-HiwinReacher +python omniisaacgymenvs/scripts/rlgames_train.py task=${ROBOT_NAME}Reacher headless=True num_envs=2048 +``` + +You can also skip training by downloading the pre-trained model checkpoint by: + +```sh +cd ~/OmniIsaacGymEnvs-HiwinReacher +wget https://github.com/j3soon/OmniIsaacGymEnvs-HiwinReacher/releases/download/v1.0.0/runs.zip +unzip runs.zip +``` + +The learning curve of the pre-trained model: + +![](docs/media/HiwinRA6201621Reacher-Learning-Curve.png) +(HiwinRA620-1621) + +## Testing + +Make sure you have stored the model checkpoints at `~/OmniIsaacGymEnvs-HiwinReacher/runs`, you can check it with the following command: + +```sh +ls ~/OmniIsaacGymEnvs-HiwinReacher/runs/${ROBOT_NAME}Reacher/nn/ +``` + +In order to achieve the highest rewards, you may not want to use the latest checkpoint `./runs/${ROBOT_NAME}Reacher/nn/${ROBOT_NAME}Reacher.pth`. Instead, use the checkpoint with highest rewards such as `./runs/${ROBOT_NAME}Reacher/nn/last_${ROBOT_NAME}Reacher_ep_1000_rew_XXX.pth`. You can replace `${ROBOT_NAME}Reacher.pth` with the latest checkpoint before following the steps below, or simply modify the commands below to use the latest checkpoint. + +You can visualize the learned policy by the following command: + +```sh +cd ~/OmniIsaacGymEnvs-HiwinReacher +python omniisaacgymenvs/scripts/rlgames_train.py task=${ROBOT_NAME}Reacher test=True num_envs=512 checkpoint=./runs/${ROBOT_NAME}Reacher/nn/${ROBOT_NAME}Reacher.pth +``` + +Likewise, you can decrease the number of environments by modifying the parameter `num_envs=512`. + +## Sim2Real + +> (To be updated) + +## Demo + +We provide an interactable demo based on the `${ROBOT_NAME}Reacher` RL example. In this demo, you can click on any of +the Hiwin in the scene to manually control the robot with your keyboard as follows: + +- `Q`/`A`: Control Joint 0. +- `W`/`S`: Control Joint 1. +- `E`/`D`: Control Joint 2. +- `R`/`F`: Control Joint 3. +- `T`/`G`: Control Joint 4. +- `Y`/`H`: Control Joint 5. +- `ESC`: Unselect a selected Hiwin and yields manual control + +Launch this demo with the following command. Note that this demo limits the maximum number of Hiwin in the scene to 128. + +```sh +cd ~/OmniIsaacGymEnvs-HiwinReacher +python omniisaacgymenvs/scripts/rlgames_demo.py task=${ROBOT_NAME}Reacher num_envs=64 +``` + +## Running in Docker + +If you have a [NVIDIA Enterprise subscription](https://docs.omniverse.nvidia.com/prod_nucleus/prod_nucleus/enterprise/installation/planning.html), you can run all services with Docker Compose. + +For users without a subscription, you can pull the [Isaac Docker image](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/isaac-sim), but should still install Omniverse Nucleus beforehand. (only Isaac itself is dockerized) + +Follow [this tutorial](https://docs.omniverse.nvidia.com/isaacsim/latest/installation/install_container.html#isaac-sim-setup-remote-headless-container) to generate your NGC API Key. + +Please note that you should clone this repositories in your home directory and generate instanceable assets beforehand as mentioned in the [Installation](#installation) section. + +We will now set up the docker environment. + +1. Build the docker image + ```sh + docker pull nvcr.io/nvidia/isaac-sim:2023.1.0-hotfix.1 + docker build . -t j3soon/isaac-sim + ``` +2. Launch an Isaac Container in Headless mode: + ```sh + scripts/run_docker_headless.sh + ./runheadless.native.sh + ``` + Alternatively, launch an Isaac Container with GUI (The host machine should include a desktop environment): + ```sh + scripts/run_docker.sh + ./runapp.sh + ``` +3. Install this repository + ```sh + cd ~/OmniIsaacGymEnvs-HiwinReacher + pip install -e . + ``` +4. Run any command in the docker container + + > Make sure to add `headless=True` if the container is launched in headless mode. + + For an example, running the training script: + + ```sh + cd ~/OmniIsaacGymEnvs-HiwinReacher + python omniisaacgymenvs/scripts/rlgames_train.py task=${ROBOT_NAME}Reacher headless=True num_envs=2048 + ``` + + You can watch the training progress with: + + ```sh + docker exec -it isaac-sim /bin/bash + cd ~/OmniIsaacGymEnvs-HiwinReacher + tensorboard --logdir=./runs + ``` + +## Acknowledgement + +This project has been made possible through the support of [ElsaLab][elsalab], [Raccoon][rccn], and [NVIDIA AI Technology Center (NVAITC)][nvaitc]. + +For a complete list of contributors to the code of this repository, please visit the [contributor list](https://github.com/j3soon/OmniIsaacGymEnvs-HiwinReacher/graphs/contributors). + +[![](docs/media/logos/elsalab.png)][elsalab] +[![](docs/media/logos/rccn.png)][rccn] +[![](docs/media/logos/nvaitc.png)][nvaitc] + +[elsalab]: https://github.com/elsa-lab +[rccn]: http://rccn.dev/ +[nvaitc]: https://github.com/NVAITC + +Disclaimer: this is not an official NVIDIA product. + +> **Note**: below are the original README of [OmniIsaacGymEnvs](https://github.com/NVIDIA-Omniverse/OmniIsaacGymEnvs). + # Omniverse Isaac Gym Reinforcement Learning Environments for Isaac Sim ## About this repository @@ -97,7 +355,7 @@ For more details on the extension workflow, please refer to the [documentation]( ### Loading trained models // Checkpoints -Checkpoints are saved in the folder `runs/EXPERIMENT_NAME/nn` where `EXPERIMENT_NAME` +Checkpoints are saved in the folder `runs/EXPERIMENT_NAME/nn` where `EXPERIMENT_NAME` defaults to the task name, but can also be overridden via the `experiment` argument. To load a trained checkpoint and continue training, use the `checkpoint` argument: @@ -106,15 +364,15 @@ To load a trained checkpoint and continue training, use the `checkpoint` argumen PYTHON_PATH scripts/rlgames_train.py task=Ant checkpoint=runs/Ant/nn/Ant.pth ``` -To load a trained checkpoint and only perform inference (no training), pass `test=True` -as an argument, along with the checkpoint name. To avoid rendering overhead, you may +To load a trained checkpoint and only perform inference (no training), pass `test=True` +as an argument, along with the checkpoint name. To avoid rendering overhead, you may also want to run with fewer environments using `num_envs=64`: ```bash PYTHON_PATH scripts/rlgames_train.py task=Ant checkpoint=runs/Ant/nn/Ant.pth test=True num_envs=64 ``` -Note that if there are special characters such as `[` or `=` in the checkpoint names, +Note that if there are special characters such as `[` or `=` in the checkpoint names, you will need to escape them and put quotes around the string. For example, `checkpoint="runs/Ant/nn/last_Antep\=501rew\[5981.31\].pth"` @@ -215,7 +473,7 @@ This script creates an instance of the PPO runner in `rl_games` and automaticall ### Configuration and command line arguments We use [Hydra](https://hydra.cc/docs/intro/) to manage the config. - + Common arguments for the training scripts are: * `task=TASK` - Selects which task to use. Any of `AllegroHand`, `Ant`, `Anymal`, `AnymalTerrain`, `BallBalance`, `Cartpole`, `CartpoleCamera`, `Crazyflie`, `FactoryTaskNutBoltPick`, `FactoryTaskNutBoltPlace`, `FactoryTaskNutBoltScrew`, `FrankaCabinet`, `FrankaDeformable`, `Humanoid`, `Ingenuity`, `Quadcopter`, `ShadowHand`, `ShadowHandOpenAI_FF`, `ShadowHandOpenAI_LSTM` (these correspond to the config for each environment in the folder `omniisaacgymenvs/cfg/task`) @@ -242,9 +500,9 @@ Hydra also allows setting variables inside config files directly as command line Default values for each of these are found in the `omniisaacgymenvs/cfg/config.yaml` file. -The way that the `task` and `train` portions of the config works are through the use of config groups. +The way that the `task` and `train` portions of the config works are through the use of config groups. You can learn more about how these work [here](https://hydra.cc/docs/tutorials/structured_config/config_groups/) -The actual configs for `task` are in `omniisaacgymenvs/cfg/task/.yaml` and for `train` in `omniisaacgymenvs/cfg/train/PPO.yaml`. +The actual configs for `task` are in `omniisaacgymenvs/cfg/task/.yaml` and for `train` in `omniisaacgymenvs/cfg/train/PPO.yaml`. In some places in the config you will find other variables referenced (for example, `num_actors: ${....task.env.numEnvs}`). Each `.` represents going one level up in the config hierarchy. @@ -288,7 +546,7 @@ For more details on multi-node training with PyTorch, please visit [here](https: ## Tasks -Source code for tasks can be found in `omniisaacgymenvs/tasks`. +Source code for tasks can be found in `omniisaacgymenvs/tasks`. Each task follows the frameworks provided in `omni.isaac.core` and `omni.isaac.gym` in Isaac Sim. @@ -299,7 +557,7 @@ Full details on each of the tasks available can be found in the [RL examples doc ## Demo -We provide an interactable demo based on the `AnymalTerrain` RL example. In this demo, you can click on any of +We provide an interactable demo based on the `AnymalTerrain` RL example. In this demo, you can click on any of the ANYmals in the scene to go into third-person mode and manually control the robot with your keyboard as follows: - `Up Arrow`: Forward linear velocity command diff --git a/docs/media/HiwinRA6201621Reacher-Learning-Curve.png b/docs/media/HiwinRA6201621Reacher-Learning-Curve.png new file mode 100644 index 0000000..2bbe95e Binary files /dev/null and b/docs/media/HiwinRA6201621Reacher-Learning-Curve.png differ diff --git a/docs/media/HiwinRA6201621Reacher-Vectorized.gif b/docs/media/HiwinRA6201621Reacher-Vectorized.gif new file mode 100644 index 0000000..601fff1 Binary files /dev/null and b/docs/media/HiwinRA6201621Reacher-Vectorized.gif differ diff --git a/docs/media/logos/elsalab.png b/docs/media/logos/elsalab.png new file mode 100644 index 0000000..6aa74c5 Binary files /dev/null and b/docs/media/logos/elsalab.png differ diff --git a/docs/media/logos/nvaitc.png b/docs/media/logos/nvaitc.png new file mode 100644 index 0000000..3bb031d Binary files /dev/null and b/docs/media/logos/nvaitc.png differ diff --git a/docs/media/logos/rccn.png b/docs/media/logos/rccn.png new file mode 100644 index 0000000..4ee1ae1 Binary files /dev/null and b/docs/media/logos/rccn.png differ diff --git a/docs/media/social-preview.gif b/docs/media/social-preview.gif new file mode 100644 index 0000000..457ada9 Binary files /dev/null and b/docs/media/social-preview.gif differ diff --git a/omniisaacgymenvs/cfg/config.yaml b/omniisaacgymenvs/cfg/config.yaml index 82f6042..6583792 100644 --- a/omniisaacgymenvs/cfg/config.yaml +++ b/omniisaacgymenvs/cfg/config.yaml @@ -72,3 +72,4 @@ hydra: run: dir: . +use_urdf: False diff --git a/omniisaacgymenvs/cfg/task/HiwinRA6201621Reacher.yaml b/omniisaacgymenvs/cfg/task/HiwinRA6201621Reacher.yaml new file mode 100644 index 0000000..cd5f10a --- /dev/null +++ b/omniisaacgymenvs/cfg/task/HiwinRA6201621Reacher.yaml @@ -0,0 +1,126 @@ +# Ref: /omniisaacgymenvs/cfg/task/ShadowHand.yaml +# used to create the object +name: HiwinRA6201621Reacher + +physics_engine: ${..physics_engine} + +# if given, will override the device setting in gym. +env: + numEnvs: ${resolve_default:2048,${...num_envs}} + envSpacing: 4 + episodeLength: 600 + + clipObservations: 5.0 + clipActions: 1.0 + + useRelativeControl: False + dofSpeedScale: 20.0 + actionsMovingAverage: 1.0 + controlFrequencyInv: 2 # 60 Hz + + startPositionNoise: 0.01 + startRotationNoise: 0.0 + + resetPositionNoise: 0.01 + resetRotationNoise: 0.0 + resetDofPosRandomInterval: 0.2 + resetDofVelRandomInterval: 0.0 + + # Random forces applied to the object + forceScale: 0.0 + forceProbRange: [0.001, 0.1] + forceDecay: 0.99 + forceDecayInterval: 0.08 + + # reward -> dictionary + distRewardScale: -2.0 + rotRewardScale: 1.0 + rotEps: 0.1 + actionPenaltyScale: -0.0002 + reachGoalBonus: 250 + velObsScale: 0.2 + + observationType: "full" # can only be "full" + successTolerance: 0.1 + printNumSuccesses: False + maxConsecutiveSuccesses: 0 + + useURDF: ${resolve_default:True,${...use_urdf}} + +sim: + dt: 0.0083 # 1/120 s + add_ground_plane: True + add_distant_light: False + use_gpu_pipeline: ${eq:${...pipeline},"gpu"} + use_fabric: True + enable_scene_query_support: False + disable_contact_processing: False + + # set to True if you use camera sensors in the environment + enable_cameras: False + + default_material: + static_friction: 1.0 + dynamic_friction: 1.0 + restitution: 0.0 + + physx: + # per-scene + use_gpu: ${eq:${....sim_device},"gpu"} # set to False to run on CPU + worker_thread_count: ${....num_threads} + solver_type: ${....solver_type} # 0: PGS, 1: TGS + bounce_threshold_velocity: 0.2 + friction_offset_threshold: 0.04 + friction_correlation_distance: 0.025 + enable_sleeping: True + enable_stabilization: True + # GPU buffers + gpu_max_rigid_contact_count: 1048576 + gpu_max_rigid_patch_count: 33554432 + gpu_found_lost_pairs_capacity: 20971520 + gpu_found_lost_aggregate_pairs_capacity: 20971520 + gpu_total_aggregate_pairs_capacity: 20971520 + gpu_max_soft_body_contacts: 1048576 + gpu_max_particle_contacts: 1048576 + gpu_heap_capacity: 33554432 + gpu_temp_buffer_capacity: 16777216 + gpu_max_num_partitions: 8 + + hiwin: + # -1 to use default values + override_usd_defaults: False + enable_self_collisions: False + object: + # -1 to use default values + override_usd_defaults: False + make_kinematic: True + enable_self_collisions: False + enable_gyroscopic_forces: True + # also in stage params + # per-actor + solver_position_iteration_count: 8 + solver_velocity_iteration_count: 0 + sleep_threshold: 0.000 + stabilization_threshold: 0.0025 + # per-body + density: -1 + max_depenetration_velocity: 1000.0 + goal_object: + # -1 to use default values + override_usd_defaults: False + make_kinematic: True + enable_self_collisions: False + enable_gyroscopic_forces: True + # also in stage params + # per-actor + solver_position_iteration_count: 8 + solver_velocity_iteration_count: 0 + sleep_threshold: 0.000 + stabilization_threshold: 0.0025 + # per-body + density: -1 + max_depenetration_velocity: 1000.0 +sim2real: + enabled: False + fail_quietely: False + verbose: False diff --git a/omniisaacgymenvs/cfg/train/HiwinRA6201621ReacherPPO.yaml b/omniisaacgymenvs/cfg/train/HiwinRA6201621ReacherPPO.yaml new file mode 100644 index 0000000..a8c5b23 --- /dev/null +++ b/omniisaacgymenvs/cfg/train/HiwinRA6201621ReacherPPO.yaml @@ -0,0 +1,79 @@ +# Ref: /omniisaacgymenvs/cfg/train/ShadowHandPPO.yaml +params: + seed: ${...seed} + algo: + name: a2c_continuous + + model: + name: continuous_a2c_logstd + + network: + name: actor_critic + separate: False + + space: + continuous: + mu_activation: None + sigma_activation: None + mu_init: + name: default + sigma_init: + name: const_initializer + val: 0 + fixed_sigma: True + mlp: + units: [256, 128, 64] + activation: elu + d2rl: False + + initializer: + name: default + regularizer: + name: None + + load_checkpoint: ${if:${...checkpoint},True,False} + load_path: ${...checkpoint} + + config: + name: ${resolve_default:HiwinRA6201621Reacher,${....experiment}} + full_experiment_name: ${.name} + device: ${....rl_device} + device_name: ${....rl_device} + env_name: rlgpu + multi_gpu: ${....multi_gpu} + ppo: True + mixed_precision: False + normalize_input: True + normalize_value: True + value_bootstrap: True + num_actors: ${....task.env.numEnvs} + reward_shaper: + scale_value: 0.01 + normalize_advantage: True + gamma: 0.99 + tau: 0.95 + learning_rate: 5e-3 + lr_schedule: adaptive + schedule_type: standard + kl_threshold: 0.02 + score_to_win: 100000 + max_epochs: ${resolve_default:5000,${....max_iterations}} + save_best_after: 100 + save_frequency: 200 + print_stats: True + grad_norm: 1.0 + entropy_coef: 0.0 + truncate_grads: True + e_clip: 0.2 + horizon_length: 64 + minibatch_size: 32768 + mini_epochs: 5 + critic_coef: 4 + clip_value: True + seq_length: 4 + bounds_loss_coef: 0.0001 + + player: + deterministic: True + games_num: 100000 + print_stats: True diff --git a/omniisaacgymenvs/demos/hiwinra6201621_reacher.py b/omniisaacgymenvs/demos/hiwinra6201621_reacher.py new file mode 100644 index 0000000..f0b33b3 --- /dev/null +++ b/omniisaacgymenvs/demos/hiwinra6201621_reacher.py @@ -0,0 +1,183 @@ +# Copyright (c) 2018-2022, NVIDIA Corporation +# Copyright (c) 2022-2023, Johnson Sun +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# Ref: /omniisaacgymenvs/demos/anymal_terrain.py + +from omniisaacgymenvs.tasks.hiwinra6201621_reacher import HiwinRA6201621ReacherTask + +from omni.isaac.core.utils.torch.rotations import * + +import torch + +import omni +import carb + +from omni.kit.viewport.utility.camera_state import ViewportCameraState +from omni.kit.viewport.utility import get_viewport_from_window_name +from pxr import Sdf + +class HiwinRA6201621ReacherDemo(HiwinRA6201621ReacherTask): + def __init__( + self, + name, + sim_config, + env, + offset=None + ) -> None: + max_num_envs = 128 + if sim_config.task_config["env"]["numEnvs"] >= max_num_envs: + print(f"num_envs reduced to {max_num_envs} for this demo.") + sim_config.task_config["env"]["numEnvs"] = max_num_envs + HiwinRA6201621ReacherTask.__init__(self, name, sim_config, env) + self.add_noise = False + + self.create_camera() + self._current_command = [0.0] * 6 + self.set_up_keyboard() + self._prim_selection = omni.usd.get_context().get_selection() + self._selected_id = None + self._previous_selected_id = None + return + + def create_camera(self): + stage = omni.usd.get_context().get_stage() + self.view_port = get_viewport_from_window_name("Viewport") + # Create camera + self.camera_path = "/World/Camera" + self.perspective_path = "/OmniverseKit_Persp" + camera_prim = stage.DefinePrim(self.camera_path, "Camera") + camera_prim.GetAttribute("focalLength").Set(8.5) + coi_prop = camera_prim.GetProperty("omni:kit:centerOfInterest") + if not coi_prop or not coi_prop.IsValid(): + camera_prim.CreateAttribute( + "omni:kit:centerOfInterest", Sdf.ValueTypeNames.Vector3d, True, Sdf.VariabilityUniform + ).Set(Gf.Vec3d(0, 0, -10)) + self.view_port.set_active_camera(self.perspective_path) + + def set_up_keyboard(self): + self._input = carb.input.acquire_input_interface() + self._keyboard = omni.appwindow.get_default_app_window().get_keyboard() + self._sub_keyboard = self._input.subscribe_to_keyboard_events(self._keyboard, self._on_keyboard_event) + self._key_to_control = { + # Joint 0 + "Q": [-1.0, 0.0, 0.0, 0.0, 0.0, 0.0], + "A": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0], + # Joint 1 + "W": [0.0, -1.0, 0.0, 0.0, 0.0, 0.0], + "S": [0.0, 1.0, 0.0, 0.0, 0.0, 0.0], + # Joint 2 + "E": [0.0, 0.0, -1.0, 0.0, 0.0, 0.0], + "D": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0], + # Joint 3 + "R": [0.0, 0.0, 0.0, -1.0, 0.0, 0.0], + "F": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0], + # Joint 4 + "T": [0.0, 0.0, 0.0, 0.0, -1.0, 0.0], + "G": [0.0, 0.0, 0.0, 0.0, 1.0, 0.0], + # Joint 5 + "Y": [0.0, 0.0, 0.0, 0.0, 0.0, -1.0], + "H": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0], + } + + def _on_keyboard_event(self, event, *args, **kwargs): + if event.type == carb.input.KeyboardEventType.KEY_PRESS: + if event.input.name in self._key_to_control: + self._current_command = self._key_to_control[event.input.name] + elif event.input.name == "ESCAPE": + self._prim_selection.clear_selected_prim_paths() + elif event.input.name == "C": + if self._selected_id is not None: + if self.view_port.get_active_camera() == self.camera_path: + self.view_port.set_active_camera(self.perspective_path) + else: + self.view_port.set_active_camera(self.camera_path) + elif event.type == carb.input.KeyboardEventType.KEY_RELEASE: + self._current_command = [0.0] * 6 + + def update_selected_object(self): + self._previous_selected_id = self._selected_id + selected_prim_paths = self._prim_selection.get_selected_prim_paths() + if len(selected_prim_paths) == 0: + self._selected_id = None + self.view_port.set_active_camera(self.perspective_path) + elif len(selected_prim_paths) > 1: + print("Multiple prims are selected. Please only select one!") + else: + prim_splitted_path = selected_prim_paths[0].split("/") + if len(prim_splitted_path) >= 4 and prim_splitted_path[3][0:4] == "env_": + self._selected_id = int(prim_splitted_path[3][4:]) + else: + print("The selected prim was not a Hiwin") + + def _update_camera(self): + base_pos = self.base_pos[self._selected_id, :].clone() + base_quat = self.base_quat[self._selected_id, :].clone() + + camera_local_transform = torch.tensor([-1.8, 0.0, 0.6], device=self.device) + camera_pos = quat_apply(base_quat, camera_local_transform) + base_pos + + camera_state = ViewportCameraState(self.camera_path, self.view_port) + eye = Gf.Vec3d(camera_pos[0].item(), camera_pos[1].item(), camera_pos[2].item()) + target = Gf.Vec3d(base_pos[0].item(), base_pos[1].item(), base_pos[2].item()+0.6) + camera_state.set_position_world(eye, True) + camera_state.set_target_world(target, True) + + def pre_physics_step(self, actions): + if self._selected_id is not None: + actions[self._selected_id, :] = torch.tensor(self._current_command, device=self.device) + result = super().pre_physics_step(actions) + if self._selected_id is not None: + print('selected hiwin id:', self._selected_id) + print('self.rew_buf[idx]:', self.rew_buf[self._selected_id]) + print('self.object_pos[idx]:', self.object_pos[self._selected_id]) + print('self.goal_pos[idx]:', self.goal_pos[self._selected_id]) + return result + + def post_physics_step(self): + self.progress_buf[:] += 1 + + self.update_selected_object() + + if self._selected_id is not None: + self.reset_buf[self._selected_id] = 0 + + self.get_states() + + env_ids = self.reset_buf.nonzero(as_tuple=False).flatten() + if len(env_ids) > 0: + self.reset_idx(env_ids) + + self.get_observations() + if self.add_noise: + self.obs_buf += (2 * torch.rand_like(self.obs_buf) - 1) * self.noise_scale_vec + + # Calculate rewards + self.calculate_metrics() + + return self.obs_buf, self.rew_buf, self.reset_buf, self.extras diff --git a/omniisaacgymenvs/robots/articulations/hiwinra6201621.py b/omniisaacgymenvs/robots/articulations/hiwinra6201621.py new file mode 100644 index 0000000..d187bd5 --- /dev/null +++ b/omniisaacgymenvs/robots/articulations/hiwinra6201621.py @@ -0,0 +1,72 @@ +# Copyright (c) 2018-2022, NVIDIA Corporation +# Copyright (c) 2022-2023, Johnson Sun +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# Ref: /omniisaacgymenvs/robots/articulations/shadow_hand.py + + +from typing import Optional + +import carb +import numpy as np +import torch +from omni.isaac.core.robots.robot import Robot +from omni.isaac.core.utils.nucleus import get_assets_root_path +from omni.isaac.core.utils.stage import add_reference_to_stage + + +class HiwinRA6201621(Robot): + def __init__( + self, + prim_path: str, + name: Optional[str] = "HiwinRA6201621", + usd_path: Optional[str] = None, + translation: Optional[torch.tensor] = None, + orientation: Optional[torch.tensor] = None, + ) -> None: + + self._usd_path = usd_path + self._name = name + + if self._usd_path is None: + assets_root_path = get_assets_root_path() + if assets_root_path is None: + carb.log_error("Could not find Isaac Sim assets folder") + + self._position = torch.tensor([0.0, 0.0, 0.0]) if translation is None else translation + self._orientation = torch.tensor([1.0, 0.0, 0.0, 0.0]) if orientation is None else orientation + + add_reference_to_stage(self._usd_path, prim_path) + + super().__init__( + prim_path=prim_path, + name=name, + translation=self._position, + orientation=self._orientation, + articulation_controller=None, + ) diff --git a/omniisaacgymenvs/robots/articulations/views/hiwinra6201621_view.py b/omniisaacgymenvs/robots/articulations/views/hiwinra6201621_view.py new file mode 100644 index 0000000..fe9f478 --- /dev/null +++ b/omniisaacgymenvs/robots/articulations/views/hiwinra6201621_view.py @@ -0,0 +1,57 @@ +# Copyright (c) 2018-2022, NVIDIA Corporation +# Copyright (c) 2022-2023, Johnson Sun +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# Ref: /omniisaacgymenvs/robots/articulations/views/shadow_hand_view.py + + +from typing import Optional + +import torch +from omni.isaac.core.articulations import ArticulationView +from omni.isaac.core.prims import RigidPrimView + +class HiwinRA6201621View(ArticulationView): + def __init__( + self, + prim_paths_expr: str, + end_effector_prim_paths_expr: str, + name: Optional[str] = "HiwinRA6201621View", + ) -> None: + + super().__init__(prim_paths_expr=prim_paths_expr, name=name, reset_xform_properties=False) + + # Use RigidPrimView instead of XFormPrimView, since the XForm is not updated when running + self._end_effectors = RigidPrimView( + prim_paths_expr=end_effector_prim_paths_expr, + name="end_effector_view", + reset_xform_properties=False + ) + + def initialize(self, physics_sim_view): + super().initialize(physics_sim_view) diff --git a/omniisaacgymenvs/scripts/dummy_hiwinra6201621_policy.py b/omniisaacgymenvs/scripts/dummy_hiwinra6201621_policy.py new file mode 100644 index 0000000..3d75ebd --- /dev/null +++ b/omniisaacgymenvs/scripts/dummy_hiwinra6201621_policy.py @@ -0,0 +1,95 @@ +# Copyright (c) 2018-2022, NVIDIA Corporation +# Copyright (c) 2022-2023, Johnson Sun +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# Ref: /omniisaacgymenvs/scripts/random_policy.py + + +import hydra +import numpy as np +import torch +from omegaconf import DictConfig +from omniisaacgymenvs.envs.vec_env_rlgames import VecEnvRLGames +from omniisaacgymenvs.utils.config_utils.path_utils import get_experience +from omniisaacgymenvs.utils.hydra_cfg.hydra_utils import * +from omniisaacgymenvs.utils.hydra_cfg.reformat import omegaconf_to_dict, print_dict +from omniisaacgymenvs.utils.task_util import initialize_task + + +@hydra.main(version_base=None, config_name="config", config_path="../cfg") +def parse_hydra_configs(cfg: DictConfig): + + cfg_dict = omegaconf_to_dict(cfg) + print_dict(cfg_dict) + + headless = cfg.headless + render = not headless + enable_viewport = "enable_cameras" in cfg.task.sim and cfg.task.sim.enable_cameras + + # select kit app file + experience = get_experience(headless, cfg.enable_livestream, enable_viewport, cfg.kit_app) + + env = VecEnvRLGames( + headless=headless, + sim_device=cfg.device_id, + enable_livestream=cfg.enable_livestream, + enable_viewport=enable_viewport, + experience=experience + ) + # sets seed. if seed is -1 will pick a random one + from omni.isaac.core.utils.torch.maths import set_seed + + cfg.seed = set_seed(cfg.seed, torch_deterministic=cfg.torch_deterministic) + cfg_dict["seed"] = cfg.seed + task = initialize_task(cfg_dict, env) + + while env._simulation_app.is_running(): + if env._world.is_playing(): + if env._world.current_time_step_index == 0: + env._world.reset(soft=True) + actions = torch.tensor( + np.array([env.action_space.sample() for _ in range(env.num_envs)]), device=task.rl_device + ) + actions[:, 0] = 0.0 + actions[:, 1] = 0.0 + actions[:, 2] = 0.0 + actions[:, 3] = 0.0 + actions[:, 4] = 0.0 + actions[:, 5] = 0.0 + env._task.pre_physics_step(actions) + env._world.step(render=render) + env.sim_frame_count += 1 + env._task.post_physics_step() + else: + env._world.step(render=render) + + env._simulation_app.close() + + +if __name__ == "__main__": + parse_hydra_configs() diff --git a/omniisaacgymenvs/tasks/hiwinra6201621_reacher.py b/omniisaacgymenvs/tasks/hiwinra6201621_reacher.py new file mode 100644 index 0000000..3997f8d --- /dev/null +++ b/omniisaacgymenvs/tasks/hiwinra6201621_reacher.py @@ -0,0 +1,177 @@ +# Copyright (c) 2018-2022, NVIDIA Corporation +# Copyright (c) 2022-2023, Johnson Sun +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# Ref: /omniisaacgymenvs/tasks/shadow_hand.py + + +import math + +import numpy as np +import torch +# from omniisaacgymenvs.sim2real.hiwinra6201621 import RealWorldHiwinRA6201621 +from omniisaacgymenvs.utils.config_utils.sim_config import SimConfig +from omniisaacgymenvs.robots.articulations.views.hiwinra6201621_view import HiwinRA6201621View +from omniisaacgymenvs.robots.articulations.hiwinra6201621 import HiwinRA6201621 +from omniisaacgymenvs.tasks.shared.reacher import ReacherTask + +from omni.isaac.core.utils.prims import get_prim_at_path +from omni.isaac.core.utils.torch import * +from omni.isaac.gym.vec_env import VecEnvBase + + +class HiwinRA6201621ReacherTask(ReacherTask): + def __init__( + self, + name: str, + sim_config: SimConfig, + env: VecEnvBase, + offset=None + ) -> None: + self.update_config(sim_config) + ReacherTask.__init__(self, name=name, env=env) + return + + def update_config(self, sim_config): + self._sim_config = sim_config + self._cfg = sim_config.config + self._task_cfg = sim_config.task_config + + self.obs_type = self._task_cfg["env"]["observationType"] + if not (self.obs_type in ["full"]): + raise Exception( + "Unknown type of observations!\nobservationType should be one of: [full]") + print("Obs type:", self.obs_type) + self.num_obs_dict = { + "full": 29, + # 6: Hiwin joints position (action space) + # 6: Hiwin joints velocity + # 3: goal position + # 4: goal rotation + # 4: goal relative rotation + # 6: previous action + } + + self.object_scale = torch.tensor([1.0] * 3) + self.goal_scale = torch.tensor([2.0] * 3) + + self._num_observations = self.num_obs_dict[self.obs_type] + self._num_actions = 6 + self._num_states = 0 + + pi = math.pi + # For actions + # The dof limits follow those defined in: + # thirdparty/hiwin_ra620_1621_support/urdf/ra620_1621.urdf + self._dof_limits = torch.tensor([[ + [np.deg2rad(-90), np.deg2rad(90)], + [np.deg2rad(-135), np.deg2rad(100)], + [np.deg2rad(-80), np.deg2rad(190)], + [np.deg2rad(-200), np.deg2rad(200)], + [np.deg2rad(-130), np.deg2rad(130)], + [np.deg2rad(-180), np.deg2rad(180)], + ]], dtype=torch.float32, device=self._cfg["sim_device"]) + self.useURDF = self._task_cfg["env"]["useURDF"] + + # Setup Sim2Real + sim2real_config = self._task_cfg['sim2real'] + if sim2real_config['enabled'] and self.test and self.num_envs == 1: + raise NotImplementedError("Sim2Real is not implemented for Hiwin RA620-1621 yet!") + ReacherTask.update_config(self) + + def get_num_dof(self): + return self._arms.num_dof + + def get_arm(self): + if not self.useURDF: + usd_path = "omniverse://localhost/Projects/J3soon/Isaac/2023.1.0/Isaac/Robots/Hiwin/RA620_1621/ra620_1621_urdf_instanceable.usd" + else: + raise NotImplementedError("Only URDF is supported for Hiwin RA620-1621 now!") + hiwin = HiwinRA6201621( + prim_path=self.default_zero_env_path + "/Hiwin", + name="Hiwin", + usd_path=usd_path + ) + self._sim_config.apply_articulation_settings( + "hiwin", + get_prim_at_path(hiwin.prim_path), + self._sim_config.parse_actor_config("hiwin"), + ) + + def get_arm_view(self, scene): + end_effector_prim_paths_expr = "/World/envs/.*/Hiwin/tool0" + arm_view = HiwinRA6201621View( + prim_paths_expr="/World/envs/.*/Hiwin", + end_effector_prim_paths_expr=end_effector_prim_paths_expr, + name="hiwin_view" + ) + scene.add(arm_view._end_effectors) + return arm_view + + def get_object_displacement_tensor(self): + return torch.tensor([0.05, 0.0, 0.0], device=self.device).repeat((self.num_envs, 1)) + + def get_observations(self): + self.arm_dof_pos = self._arms.get_joint_positions() + self.arm_dof_vel = self._arms.get_joint_velocities() + + if self.obs_type == "full_no_vel": + self.compute_full_observations(True) + elif self.obs_type == "full": + self.compute_full_observations() + else: + print("Unkown observations type!") + + observations = {self._arms.name: {"obs_buf": self.obs_buf}} + return observations + + def get_reset_target_new_pos(self, n_reset_envs): + # Randomly generate goal positions, although the resulting goal may still not be reachable. + new_pos = torch_rand_float(-1, 1, (n_reset_envs, 3), device=self.device) + new_pos[:, 0] = new_pos[:, 0] * 0.6 + 0.5 * torch.sign(new_pos[:, 0]) + new_pos[:, 1] = new_pos[:, 1] * 0.6 + 0.5 * torch.sign(new_pos[:, 1]) + new_pos[:, 2] = torch.abs(new_pos[:, 2] * 0.9) + 0.2 + return new_pos + + def compute_full_observations(self, no_vel=False): + if no_vel: + raise NotImplementedError() + else: + # There are many redundant information for the simple Reacher task, but we'll keep them for now. + self.obs_buf[:, 0:self.num_arm_dofs] = unscale(self.arm_dof_pos[:, :self.num_arm_dofs], + self.arm_dof_lower_limits, self.arm_dof_upper_limits) + self.obs_buf[:, self.num_arm_dofs:2*self.num_arm_dofs] = self.vel_obs_scale * self.arm_dof_vel[:, :self.num_arm_dofs] + base = 2 * self.num_arm_dofs + self.obs_buf[:, base+0:base+3] = self.goal_pos + self.obs_buf[:, base+3:base+7] = self.goal_rot + self.obs_buf[:, base+7:base+11] = quat_mul(self.object_rot, quat_conjugate(self.goal_rot)) + self.obs_buf[:, base+11:base+17] = self.actions + + def send_joint_pos(self, joint_pos): + # self.real_world_hiwinra6201621.send_joint_pos(joint_pos) + pass diff --git a/omniisaacgymenvs/tasks/shared/reacher.py b/omniisaacgymenvs/tasks/shared/reacher.py new file mode 100644 index 0000000..2886e3c --- /dev/null +++ b/omniisaacgymenvs/tasks/shared/reacher.py @@ -0,0 +1,508 @@ +# Copyright (c) 2018-2022, NVIDIA Corporation +# Copyright (c) 2022-2023, Johnson Sun +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# Ref: /omniisaacgymenvs/tasks/shared/reacher.py + + +import math +from abc import abstractmethod + +import numpy as np +import torch +from omni.isaac.core.prims import RigidPrimView, XFormPrim +from omni.isaac.core.scenes.scene import Scene +from omni.isaac.core.utils.prims import get_prim_at_path +from omni.isaac.core.utils.stage import add_reference_to_stage, get_current_stage +from omni.isaac.core.utils.torch import * +from omniisaacgymenvs.tasks.base.rl_task import RLTask +# `scale` maps [-1, 1] to [L, U]; `unscale` maps [L, U] to [-1, 1] +from omni.isaac.core.utils.torch import scale, unscale +from omni.isaac.gym.vec_env import VecEnvBase + + +class ReacherTask(RLTask): + def __init__( + self, + name: str, + env: VecEnvBase, + offset=None + ) -> None: + + ReacherTask.update_config(self) + + RLTask.__init__(self, name, env) + + self.x_unit_tensor = torch.tensor([1, 0, 0], dtype=torch.float, device=self.device).repeat((self.num_envs, 1)) + self.y_unit_tensor = torch.tensor([0, 1, 0], dtype=torch.float, device=self.device).repeat((self.num_envs, 1)) + self.z_unit_tensor = torch.tensor([0, 0, 1], dtype=torch.float, device=self.device).repeat((self.num_envs, 1)) + + self.reset_goal_buf = self.reset_buf.clone() + self.successes = torch.zeros(self.num_envs, dtype=torch.float, device=self.device) + self.consecutive_successes = torch.zeros(1, dtype=torch.float, device=self.device) + + self.av_factor = torch.tensor(self.av_factor, dtype=torch.float, device=self.device) + self.total_successes = 0 + self.total_resets = 0 + + def update_config(self): + self._num_envs = self._task_cfg["env"]["numEnvs"] + self._env_spacing = self._task_cfg["env"]["envSpacing"] + + self.dist_reward_scale = self._task_cfg["env"]["distRewardScale"] + self.rot_reward_scale = self._task_cfg["env"]["rotRewardScale"] + self.action_penalty_scale = self._task_cfg["env"]["actionPenaltyScale"] + self.success_tolerance = self._task_cfg["env"]["successTolerance"] + self.reach_goal_bonus = self._task_cfg["env"]["reachGoalBonus"] + self.rot_eps = self._task_cfg["env"]["rotEps"] + self.vel_obs_scale = self._task_cfg["env"]["velObsScale"] + + self.reset_position_noise = self._task_cfg["env"]["resetPositionNoise"] + self.reset_rotation_noise = self._task_cfg["env"]["resetRotationNoise"] + self.reset_dof_pos_noise = self._task_cfg["env"]["resetDofPosRandomInterval"] + self.reset_dof_vel_noise = self._task_cfg["env"]["resetDofVelRandomInterval"] + + self.arm_dof_speed_scale = self._task_cfg["env"]["dofSpeedScale"] + self.use_relative_control = self._task_cfg["env"]["useRelativeControl"] + self.act_moving_average = self._task_cfg["env"]["actionsMovingAverage"] + + self.max_episode_length = self._task_cfg["env"]["episodeLength"] + self.reset_time = self._task_cfg["env"].get("resetTime", -1.0) + self.print_success_stat = self._task_cfg["env"]["printNumSuccesses"] + self.max_consecutive_successes = self._task_cfg["env"]["maxConsecutiveSuccesses"] + self.av_factor = self._task_cfg["env"].get("averFactor", 0.1) + + self.dt = 1.0 / 60 + control_freq_inv = self._task_cfg["env"].get("controlFrequencyInv", 1) + if self.reset_time > 0.0: + self.max_episode_length = int(round(self.reset_time / (control_freq_inv * self.dt))) + print("Reset time: ", self.reset_time) + print("New episode length: ", self.max_episode_length) + + def set_up_scene(self, scene: Scene) -> None: + self._stage = get_current_stage() + self._assets_root_path = 'omniverse://localhost/Projects/J3soon/Isaac/2023.1.0' + + self.get_arm() + + self.object_start_translation = torch.tensor([0.0, 0.0, 0.0], device=self.device) + self.object_start_orientation = torch.tensor([1.0, 0.0, 0.0, 0.0], device=self.device) + + self.goal_displacement_tensor = torch.tensor([0.0, 0.0, 0.0], device=self.device) + self.goal_start_translation = torch.tensor([0.0, 0.0, 0.0], device=self.device) + self.goal_displacement_tensor + self.goal_start_orientation = torch.tensor([1.0, 0.0, 0.0, 0.0], device=self.device) + + self.get_object() + self.get_goal() + + super().set_up_scene(scene) + + self._arms = self.get_arm_view(scene) + scene.add(self._arms) + self._objects = RigidPrimView( + prim_paths_expr="/World/envs/env_.*/object/object", + name="object_view", + reset_xform_properties=False, + ) + self._objects._non_root_link = True # hack to ignore kinematics + scene.add(self._objects) + self._goals = RigidPrimView( + prim_paths_expr="/World/envs/env_.*/goal/object", name="goal_view", reset_xform_properties=False + ) + self._goals._non_root_link = True # hack to ignore kinematics + scene.add(self._goals) + + def initialize_views(self, scene): + RLTask.initialize_views(self, scene) + + if scene.object_exists("dofbot_view"): + scene.remove_object("dofbot_view", registry_only=True) + if scene.object_exists("ur10_view"): + scene.remove_object("ur10_view", registry_only=True) + if scene.object_exists("kuka_view"): + scene.remove_object("kuka_view", registry_only=True) + if scene.object_exists("hiwin_view"): + scene.remove_object("hiwin_view", registry_only=True) + if scene.object_exists("goal_view"): + scene.remove_object("goal_view", registry_only=True) + if scene.object_exists("object_view"): + scene.remove_object("object_view", registry_only=True) + + self.object_start_translation = torch.tensor([0.0, 0.0, 0.0], device=self.device) + self.object_start_orientation = torch.tensor([1.0, 0.0, 0.0, 0.0], device=self.device) + + self.goal_displacement_tensor = torch.tensor([0.0, 0.0, 0.0], device=self.device) + self.goal_start_translation = torch.tensor([0.0, 0.0, 0.0], device=self.device) + self.goal_displacement_tensor + self.goal_start_orientation = torch.tensor([1.0, 0.0, 0.0, 0.0], device=self.device) + + self._arms = self.get_arm_view(scene) + scene.add(self._arms) + self._objects = RigidPrimView( + prim_paths_expr="/World/envs/env_.*/object/object", + name="object_view", + reset_xform_properties=False, + ) + self._objects._non_root_link = True # hack to ignore kinematics + scene.add(self._objects) + self._goals = RigidPrimView( + prim_paths_expr="/World/envs/env_.*/goal/object", name="goal_view", reset_xform_properties=False + ) + self._goals._non_root_link = True # hack to ignore kinematics + scene.add(self._goals) + + @abstractmethod + def get_num_dof(self): + pass + + @abstractmethod + def get_arm(self): + pass + + @abstractmethod + def get_arm_view(self): + pass + + @abstractmethod + def get_observations(self): + pass + + @abstractmethod + def get_reset_target_new_pos(self, n_reset_envs): + pass + + @abstractmethod + def send_joint_pos(self, joint_pos): + pass + + def get_object(self): + self.object_usd_path = f"{self._assets_root_path}/Isaac/Props/Blocks/block_instanceable.usd" + add_reference_to_stage(self.object_usd_path, self.default_zero_env_path + "/object") + obj = XFormPrim( + prim_path=self.default_zero_env_path + "/object/object", + name="object", + translation=self.object_start_translation, + orientation=self.object_start_orientation, + scale=self.object_scale, + ) + self._sim_config.apply_articulation_settings( + "object", get_prim_at_path(obj.prim_path), self._sim_config.parse_actor_config("object") + ) + + def get_goal(self): + self.goal_usd_path = f"{self._assets_root_path}/Isaac/Props/Blocks/block_instanceable.usd" + add_reference_to_stage(self.goal_usd_path, self.default_zero_env_path + "/goal") + goal = XFormPrim( + prim_path=self.default_zero_env_path + "/goal/object", + name="goal", + translation=self.goal_start_translation, + orientation=self.goal_start_orientation, + scale=self.goal_scale + ) + self._sim_config.apply_articulation_settings("goal", get_prim_at_path(goal.prim_path), self._sim_config.parse_actor_config("goal_object")) + + def post_reset(self): + self.num_arm_dofs = self.get_num_dof() + self.actuated_dof_indices = torch.arange(self.num_arm_dofs, dtype=torch.long, device=self.device) + + self.arm_dof_targets = torch.zeros((self.num_envs, self._arms.num_dof), dtype=torch.float, device=self.device) + + self.prev_targets = torch.zeros((self.num_envs, self.num_arm_dofs), dtype=torch.float, device=self.device) + self.cur_targets = torch.zeros((self.num_envs, self.num_arm_dofs), dtype=torch.float, device=self.device) + + dof_limits = self._dof_limits[:, :self.num_arm_dofs] + self.arm_dof_lower_limits, self.arm_dof_upper_limits = torch.t(dof_limits[0].to(self.device)) + + self.arm_dof_default_pos = torch.zeros(self.num_arm_dofs, dtype=torch.float, device=self.device) + self.arm_dof_default_vel = torch.zeros(self.num_arm_dofs, dtype=torch.float, device=self.device) + + self.end_effectors_init_pos, self.end_effectors_init_rot = self._arms._end_effectors.get_world_poses() + + self.goal_pos, self.goal_rot = self._goals.get_world_poses() + self.goal_pos -= self._env_pos + + # randomize all envs + indices = torch.arange(self._num_envs, dtype=torch.int64, device=self._device) + self.reset_idx(indices) + + def calculate_metrics(self): + self.fall_dist = 0 + self.fall_penalty = 0 + ( + self.rew_buf[:], + self.reset_buf[:], + self.reset_goal_buf[:], + self.progress_buf[:], + self.successes[:], + self.consecutive_successes[:], + ) = compute_arm_reward( + self.rew_buf, + self.reset_buf, + self.reset_goal_buf, + self.progress_buf, + self.successes, + self.consecutive_successes, + self.max_episode_length, + self.object_pos, + self.object_rot, + self.goal_pos, + self.goal_rot, + self.dist_reward_scale, + self.rot_reward_scale, + self.rot_eps, + self.actions, + self.action_penalty_scale, + self.success_tolerance, + self.reach_goal_bonus, + self.fall_dist, + self.fall_penalty, + self.max_consecutive_successes, + self.av_factor, + ) + + self.extras["consecutive_successes"] = self.consecutive_successes.mean() + + if self.print_success_stat: + self.total_resets = self.total_resets + self.reset_buf.sum() + direct_average_successes = self.total_successes + self.successes.sum() + self.total_successes = self.total_successes + (self.successes * self.reset_buf).sum() + # The direct average shows the overall result more quickly, but slightly undershoots long term policy performance. + print( + "Direct average consecutive successes = {:.1f}".format( + direct_average_successes / (self.total_resets + self.num_envs) + ) + ) + if self.total_resets > 0: + print( + "Post-Reset average consecutive successes = {:.1f}".format(self.total_successes / self.total_resets) + ) + + def pre_physics_step(self, actions): + if not self._env._world.is_playing(): + return + + env_ids = self.reset_buf.nonzero(as_tuple=False).squeeze(-1) + goal_env_ids = self.reset_goal_buf.nonzero(as_tuple=False).squeeze(-1) + + end_effectors_pos, end_effectors_rot = self._arms._end_effectors.get_world_poses() + # Reverse the default rotation and rotate the displacement tensor according to the current rotation + self.object_pos = end_effectors_pos + quat_rotate(end_effectors_rot, quat_rotate_inverse(self.end_effectors_init_rot, self.get_object_displacement_tensor())) + self.object_pos -= self._env_pos # subtract world env pos + self.object_rot = end_effectors_rot + object_pos = self.object_pos + self._env_pos + object_rot = self.object_rot + self._objects.set_world_poses(object_pos, object_rot) + + # if only goals need reset, then call set API + if len(goal_env_ids) > 0 and len(env_ids) == 0: + self.reset_target_pose(goal_env_ids) + elif len(goal_env_ids) > 0: + self.reset_target_pose(goal_env_ids) + if len(env_ids) > 0: + self.reset_idx(env_ids) + + self.actions = actions.clone().to(self.device) + # Reacher tasks don't require gripper actions, disable it. + self.actions[:, 5] = 0.0 + + if self.use_relative_control: + targets = ( + self.prev_targets[:, self.actuated_dof_indices] + self.arm_dof_speed_scale * self.dt * self.actions + ) + self.cur_targets[:, self.actuated_dof_indices] = tensor_clamp( + targets, + self.arm_dof_lower_limits[self.actuated_dof_indices], + self.arm_dof_upper_limits[self.actuated_dof_indices], + ) + else: + self.cur_targets[:, self.actuated_dof_indices] = scale( + self.actions[:, :self.num_arm_dofs], + self.arm_dof_lower_limits[self.actuated_dof_indices], + self.arm_dof_upper_limits[self.actuated_dof_indices], + ) + self.cur_targets[:, self.actuated_dof_indices] = ( + self.act_moving_average * self.cur_targets[:, self.actuated_dof_indices] + + (1.0 - self.act_moving_average) * self.prev_targets[:, self.actuated_dof_indices] + ) + self.cur_targets[:, self.actuated_dof_indices] = tensor_clamp( + self.cur_targets[:, self.actuated_dof_indices], + self.arm_dof_lower_limits[self.actuated_dof_indices], + self.arm_dof_upper_limits[self.actuated_dof_indices], + ) + + self.prev_targets[:, self.actuated_dof_indices] = self.cur_targets[:, self.actuated_dof_indices] + + self._arms.set_joint_position_targets( + self.cur_targets[:, self.actuated_dof_indices], indices=None, joint_indices=self.actuated_dof_indices + ) + if self._task_cfg['sim2real']['enabled'] and self.test and self.num_envs == 1: + # Only retrieve the 0-th joint position even when multiple envs are used + cur_joint_pos = self._arms.get_joint_positions(indices=[0], joint_indices=self.actuated_dof_indices) + # Send the current joint positions to the real robot + joint_pos = cur_joint_pos[0] + if torch.any(joint_pos < self.arm_dof_lower_limits) or torch.any(joint_pos > self.arm_dof_upper_limits): + print("get_joint_positions out of bound, send_joint_pos skipped") + else: + self.send_joint_pos(joint_pos) + + + def is_done(self): + pass + + def reset_target_pose(self, env_ids): + # reset goal + indices = env_ids.to(dtype=torch.int32) + rand_floats = torch_rand_float(-1.0, 1.0, (len(env_ids), 4), device=self.device) + + new_pos = self.get_reset_target_new_pos(len(env_ids)) + new_rot = randomize_rotation( + rand_floats[:, 0], rand_floats[:, 1], self.x_unit_tensor[env_ids], self.y_unit_tensor[env_ids] + ) + + self.goal_pos[env_ids] = new_pos + self.goal_rot[env_ids] = new_rot + + goal_pos, goal_rot = self.goal_pos.clone(), self.goal_rot.clone() + goal_pos[env_ids] = ( + self.goal_pos[env_ids] + self._env_pos[env_ids] + ) # add world env pos + + self._goals.set_world_poses(goal_pos[env_ids], goal_rot[env_ids], indices) + self.reset_goal_buf[env_ids] = 0 + + def reset_idx(self, env_ids): + indices = env_ids.to(dtype=torch.int32) + rand_floats = torch_rand_float(-1.0, 1.0, (len(env_ids), self.num_arm_dofs * 2 + 5), device=self.device) + + self.reset_target_pose(env_ids) + + # reset arm + delta_max = self.arm_dof_upper_limits - self.arm_dof_default_pos + delta_min = self.arm_dof_lower_limits - self.arm_dof_default_pos + rand_delta = delta_min + (delta_max - delta_min) * (rand_floats[:, 5:5+self.num_arm_dofs] + 1.0) * 0.5 + + pos = self.arm_dof_default_pos + self.reset_dof_pos_noise * rand_delta + dof_pos = torch.zeros((self.num_envs, self._arms.num_dof), device=self.device) + dof_pos[env_ids, :self.num_arm_dofs] = pos + + dof_vel = torch.zeros((self.num_envs, self._arms.num_dof), device=self.device) + dof_vel[env_ids, :self.num_arm_dofs] = self.arm_dof_default_vel + \ + self.reset_dof_vel_noise * rand_floats[:, 5+self.num_arm_dofs:5+self.num_arm_dofs*2] + + self.prev_targets[env_ids, :self.num_arm_dofs] = pos + self.cur_targets[env_ids, :self.num_arm_dofs] = pos + self.arm_dof_targets[env_ids, :self.num_arm_dofs] = pos + + self._arms.set_joint_position_targets(self.arm_dof_targets[env_ids], indices) + # set_joint_positions doesn't seem to apply immediately. + self._arms.set_joint_positions(dof_pos[env_ids], indices) + self._arms.set_joint_velocities(dof_vel[env_ids], indices) + + self.progress_buf[env_ids] = 0 + self.reset_buf[env_ids] = 0 + self.successes[env_ids] = 0 + + +##################################################################### +###=========================jit functions=========================### +##################################################################### + +@torch.jit.script +def randomize_rotation(rand0, rand1, x_unit_tensor, y_unit_tensor): + return quat_mul( + quat_from_angle_axis(rand0 * np.pi, x_unit_tensor), quat_from_angle_axis(rand1 * np.pi, y_unit_tensor) + ) + + +@torch.jit.script +def compute_arm_reward( + rew_buf, + reset_buf, + reset_goal_buf, + progress_buf, + successes, + consecutive_successes, + max_episode_length: float, + object_pos, + object_rot, + target_pos, + target_rot, + dist_reward_scale: float, + rot_reward_scale: float, + rot_eps: float, + actions, + action_penalty_scale: float, + success_tolerance: float, + reach_goal_bonus: float, + fall_dist: float, + fall_penalty: float, + max_consecutive_successes: int, + av_factor: float, +): + + goal_dist = torch.norm(object_pos - target_pos, p=2, dim=-1) + + # Orientation alignment for the cube in hand and goal cube + quat_diff = quat_mul(object_rot, quat_conjugate(target_rot)) + rot_dist = 2.0 * torch.asin( + torch.clamp(torch.norm(quat_diff[:, 1:4], p=2, dim=-1), max=1.0) + ) # changed quat convention + + dist_rew = goal_dist * dist_reward_scale + rot_rew = 1.0 / (torch.abs(rot_dist) + rot_eps) * rot_reward_scale + + action_penalty = torch.sum(actions**2, dim=-1) + + # Total reward is: position distance + orientation alignment + action regularization + success bonus + fall penalty + reward = dist_rew + action_penalty * action_penalty_scale + + # Find out which envs hit the goal and update successes count + goal_resets = torch.where(torch.abs(goal_dist) <= success_tolerance, torch.ones_like(reset_goal_buf), reset_goal_buf) + successes = successes + goal_resets + + # Success bonus: orientation is within `success_tolerance` of goal orientation + reward = torch.where(goal_resets == 1, reward + reach_goal_bonus, reward) + + resets = reset_buf + if max_consecutive_successes > 0: + # Reset progress buffer on goal envs if max_consecutive_successes > 0 + progress_buf = torch.where( + torch.abs(rot_dist) <= success_tolerance, torch.zeros_like(progress_buf), progress_buf + ) + resets = torch.where(successes >= max_consecutive_successes, torch.ones_like(resets), resets) + resets = torch.where(progress_buf >= max_episode_length - 1, torch.ones_like(resets), resets) + + num_resets = torch.sum(resets) + finished_cons_successes = torch.sum(successes * resets.float()) + + cons_successes = torch.where( + num_resets > 0, + av_factor * finished_cons_successes / num_resets + (1.0 - av_factor) * consecutive_successes, + consecutive_successes, + ) + + return reward, resets, goal_resets, progress_buf, successes, cons_successes diff --git a/omniisaacgymenvs/utils/demo_util.py b/omniisaacgymenvs/utils/demo_util.py index 55cf0d8..ce20128 100644 --- a/omniisaacgymenvs/utils/demo_util.py +++ b/omniisaacgymenvs/utils/demo_util.py @@ -1,4 +1,5 @@ # Copyright (c) 2018-2022, NVIDIA Corporation +# Copyright (c) 2022-2023, Johnson Sun # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -29,10 +30,12 @@ def initialize_demo(config, env, init_sim=True): from omniisaacgymenvs.demos.anymal_terrain import AnymalTerrainDemo + from omniisaacgymenvs.demos.hiwinra6201621_reacher import HiwinRA6201621ReacherDemo # Mappings from strings to environments task_map = { "AnymalTerrain": AnymalTerrainDemo, + "HiwinRA6201621Reacher": HiwinRA6201621ReacherDemo, } from omniisaacgymenvs.utils.config_utils.sim_config import SimConfig diff --git a/omniisaacgymenvs/utils/task_util.py b/omniisaacgymenvs/utils/task_util.py index 3b154e8..e89ab19 100644 --- a/omniisaacgymenvs/utils/task_util.py +++ b/omniisaacgymenvs/utils/task_util.py @@ -1,4 +1,5 @@ # Copyright (c) 2018-2022, NVIDIA Corporation +# Copyright (c) 2022-2023, Johnson Sun # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -45,6 +46,7 @@ def import_tasks(): from omniisaacgymenvs.tasks.ingenuity import IngenuityTask from omniisaacgymenvs.tasks.quadcopter import QuadcopterTask from omniisaacgymenvs.tasks.shadow_hand import ShadowHandTask + from omniisaacgymenvs.tasks.hiwinra6201621_reacher import HiwinRA6201621ReacherTask from omniisaacgymenvs.tasks.warp.ant import AntLocomotionTask as AntLocomotionTaskWarp from omniisaacgymenvs.tasks.warp.cartpole import CartpoleTask as CartpoleTaskWarp @@ -71,6 +73,7 @@ def import_tasks(): "ShadowHand": ShadowHandTask, "ShadowHandOpenAI_FF": ShadowHandTask, "ShadowHandOpenAI_LSTM": ShadowHandTask, + "HiwinRA6201621Reacher": HiwinRA6201621ReacherTask, } task_map_warp = { diff --git a/omniisaacgymenvs/utils/usd_utils/create_instanceable_hiwinra6201621_from_urdf.py b/omniisaacgymenvs/utils/usd_utils/create_instanceable_hiwinra6201621_from_urdf.py new file mode 100644 index 0000000..ce75e8c --- /dev/null +++ b/omniisaacgymenvs/utils/usd_utils/create_instanceable_hiwinra6201621_from_urdf.py @@ -0,0 +1,92 @@ +# Copyright (c) 2018-2022, NVIDIA Corporation +# Copyright (c) 2022-2023, Johnson Sun +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# Ref: https://docs.omniverse.nvidia.com/isaacsim/latest/advanced_tutorials/tutorial_advanced_import_urdf.html#importing-urdf-using-python + +import os + +import omni.kit.commands +import omni.usd +from omni.importer.urdf import _urdf +from omni.isaac.core.utils.extensions import get_extension_path_from_name +from pxr import Sdf, UsdGeom + + +def create_hiwin_from_urdf(urdf_path, usd_path, mesh_usd_path, instanceable_usd_path): + # Set the settings in the import config + import_config = _urdf.ImportConfig() + import_config.merge_fixed_joints = False + import_config.convex_decomp = False + import_config.import_inertia_tensor = False + import_config.fix_base = True + import_config.make_default_prim = True + import_config.self_collision = False + import_config.create_physics_scene = True + # The two values below follows the suggestion from Step 2 in + # `5.1.3. Using the URDF Importer Extension Window`. + # Ref: https://docs.omniverse.nvidia.com/isaacsim/latest/advanced_tutorials/tutorial_advanced_import_urdf.html#using-the-urdf-importer-extension-window + # However, we found that the drive strength is too large, so we reduced it to the same value as drive damping. + import_config.default_drive_strength = 100000.0 # 10000000.0 + import_config.default_position_drive_damping = 100000.0 + import_config.default_drive_type = _urdf.UrdfJointTargetType.JOINT_DRIVE_POSITION + import_config.distance_scale = 1 + import_config.density = 0.0 + # Finally import the robot & save it as USD + result, prim_path = omni.kit.commands.execute( + "URDFParseAndImportFile", urdf_path=urdf_path, + import_config=import_config, dest_path=usd_path, + ) + import_config.make_instanceable=True + import_config.instanceable_usd_path=mesh_usd_path + # Finally import the robot & save it as instanceable USD + result, prim_path = omni.kit.commands.execute( + "URDFParseAndImportFile", urdf_path=urdf_path, + import_config=import_config, dest_path=instanceable_usd_path, + ) + +def create_block_indicator(): + for suffix in ['', '_instanceable']: + asset_usd_path = f'omniverse://localhost/NVIDIA/Assets/Isaac/2023.1.0/Isaac/Props/Blocks/block{suffix}.usd' + block_usd_path = f'omniverse://localhost/Projects/J3soon/Isaac/2023.1.0/Isaac/Props/Blocks/block{suffix}.usd' + omni.client.copy(asset_usd_path, block_usd_path) + omni.usd.get_context().open_stage(block_usd_path) + stage = omni.usd.get_context().get_stage() + edits = Sdf.BatchNamespaceEdit() + edits.Add(Sdf.NamespaceEdit.Remove('/object/object/collisions')) + stage.GetRootLayer().Apply(edits) + omni.usd.get_context().save_stage() + +if __name__ == '__main__': + hiwin_urdf_path = f'{os.path.expanduser("~")}/OmniIsaacGymEnvs-HiwinReacher/thirdparty/hiwin_ra620_1621_support/urdf/ra620_1621.urdf' + hiwin_usd_path = 'omniverse://localhost/Projects/J3soon/Isaac/2023.1.0/Isaac/Robots/Hiwin/RA620_1621/ra620_1621_urdf.usd' + hiwin_mesh_usd_path = 'omniverse://localhost/Projects/J3soon/Isaac/2023.1.0/Isaac/Robots/Hiwin/RA620_1621/ra620_1621_urdf_instanceable_meshes.usd' + hiwin_instanceable_usd_path = 'omniverse://localhost/Projects/J3soon/Isaac/2023.1.0/Isaac/Robots/Hiwin/RA620_1621/ra620_1621_urdf_instanceable.usd' + create_hiwin_from_urdf(hiwin_urdf_path, hiwin_usd_path, hiwin_mesh_usd_path, hiwin_instanceable_usd_path) + create_block_indicator() + print("Done!") diff --git a/scripts/run_docker.sh b/scripts/run_docker.sh new file mode 100755 index 0000000..b25a91b --- /dev/null +++ b/scripts/run_docker.sh @@ -0,0 +1,21 @@ +#!/bin/bash -e + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" + +# Ref: https://docs.omniverse.nvidia.com/isaacsim/latest/installation/install_container.html#isaac-sim-setup-remote-headless-container +# Ref: https://github.com/j3soon/isaac-extended#docker-container-with-display +xhost +local:docker +docker run --name isaac-sim --entrypoint bash -it --gpus all -e "ACCEPT_EULA=Y" --rm --network=host \ + -e "PRIVACY_CONSENT=Y" \ + -v ~/docker/isaac-sim/cache/kit:/isaac-sim/kit/cache:rw \ + -v ~/docker/isaac-sim/cache/ov:/root/.cache/ov:rw \ + -v ~/docker/isaac-sim/cache/pip:/root/.cache/pip:rw \ + -v ~/docker/isaac-sim/cache/glcache:/root/.cache/nvidia/GLCache:rw \ + -v ~/docker/isaac-sim/cache/computecache:/root/.nv/ComputeCache:rw \ + -v ~/docker/isaac-sim/logs:/root/.nvidia-omniverse/logs:rw \ + -v ~/docker/isaac-sim/data:/root/.local/share/ov/data:rw \ + -v ~/docker/isaac-sim/documents:/root/Documents:rw \ + -v "$DIR/..:/root/OmniIsaacGymEnvs-HiwinReacher:rw" \ + -v /tmp/.X11-unix:/tmp/.X11-unix \ + -e DISPLAY=$DISPLAY \ + j3soon/isaac-sim diff --git a/scripts/run_docker_headless.sh b/scripts/run_docker_headless.sh new file mode 100755 index 0000000..dab464c --- /dev/null +++ b/scripts/run_docker_headless.sh @@ -0,0 +1,17 @@ +#!/bin/bash -e + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" + +# Ref: https://docs.omniverse.nvidia.com/isaacsim/latest/installation/install_container.html#isaac-sim-setup-remote-headless-container +docker run --name isaac-sim --entrypoint bash -it --gpus all -e "ACCEPT_EULA=Y" --rm --network=host \ + -e "PRIVACY_CONSENT=Y" \ + -v ~/docker/isaac-sim/cache/kit:/isaac-sim/kit/cache:rw \ + -v ~/docker/isaac-sim/cache/ov:/root/.cache/ov:rw \ + -v ~/docker/isaac-sim/cache/pip:/root/.cache/pip:rw \ + -v ~/docker/isaac-sim/cache/glcache:/root/.cache/nvidia/GLCache:rw \ + -v ~/docker/isaac-sim/cache/computecache:/root/.nv/ComputeCache:rw \ + -v ~/docker/isaac-sim/logs:/root/.nvidia-omniverse/logs:rw \ + -v ~/docker/isaac-sim/data:/root/.local/share/ov/data:rw \ + -v ~/docker/isaac-sim/documents:/root/Documents:rw \ + -v "$DIR/..:/root/OmniIsaacGymEnvs-HiwinReacher:rw" \ + j3soon/isaac-sim