diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..3a00441 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,280 @@ +{ + "python.analysis.extraPaths": [ + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.motion_generation", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.motion_planning", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.core_archive", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.dynamic_control", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.core", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.statistics_logging", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.assets_check", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.ros2_bridge", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.universal_robots", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.internal_tools", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.cortex", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.usd.schema.isaac", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.dofbot", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.replicator.isaac", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.ros_bridge", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.articulation_inspector", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.asset_browser", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.manipulators", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.mjcf", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.benchmark_environments", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.isaac_sensor", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.gain_tuner", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.physics_utilities", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.repl", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.franka", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.lula", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.synthetic_utils", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.ml_archive", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.cloner", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.unit_converter", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.demos", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.window.about", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.range_sensor", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.shapenet", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.kit.property.isaac", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.app.setup", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.wheeled_robots", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.examples", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.proximity_sensor", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.splash", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.urdf", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.occupancy_map", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.synthetic_recorder", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.ui_template", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.app.selector", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.core_nodes", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.onshape", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.tests", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.quadruped", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.kit.loop-isaac", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.drivesim.sensors.nv.lidar", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.version", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.surface_gripper", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.diff_usd", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.ui", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.kit", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.gym", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.partition", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.robot_benchmark", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.physics_inspector", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.conveyor", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.merge_mesh", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.utils", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.debug_draw", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.filebrowser_column.tags", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.window.file", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.procedural.mesh", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.primitive.mesh", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.property.audio", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.thumbnails.usd", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.gfn", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.filebrowser_column.acl", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.window.console", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.widget.inspector", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.widget.versioning", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.tool.collect", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.flowusd", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.ansel", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.property.geometry", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.window.audio.oscilloscope", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.property.render", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.mdl.usd_converter", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.window.material_swap", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.window.usd_paths", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.graph", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.quicklayout", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.property.usd", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.rtx.window.settings", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.menu.edit", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.graph.tools", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.window.images", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.graph.bundle.action", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.property.transform", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.window.provide_feedback", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.window.title", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.window.popup_dialog", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.iray.settings.core", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.property.layer", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.graph.instancing", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.viewport_widgets_manager", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.widget.imageview", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.livestream.native", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.window.audioplayer", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.widget.filebrowser", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.window.tests", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.graph.core", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.window.preferences", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.numpy.common", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.audio.test.usd", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.graph.test", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.menu.aov", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.window.file_importer", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.rtx.multinode.dev", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.menu.common", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.resourcemonitor", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.graph.ui", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.compatibility_checker", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.selection", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.window.property", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.viewport.utility", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.hydra.pxr.settings", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.window.filepicker", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.widget.browser_bar", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.telemetry", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.widget.stage", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.debug.python", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.graph.action", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.window.inspector", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.graph.examples.cpp", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.example.ui", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.window.drop_support", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.property.light", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.documentation.builder", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.stage.mdl_converter", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.widget.live", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.collaboration.channel_manager", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.graph.tutorials", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.graph.io", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.audiodeviceenum", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.window.stage", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.viewport.legacy_gizmos", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.collaboration.viewport.camera", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.rtx.settings.core", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.widget.settings", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.livestream.webrtc", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.widget.fast_search", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.widget.stage_icons", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.search_core", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.window.imageviewer", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.stage_templates", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.window.toolbar", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.volume", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.graph.scriptnode", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.search_example", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.uiaudio", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.command.usd", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.window.stageviewer", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.rtx.tests", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.widget.graph", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.window.commands", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.viewport.ready", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.hydra_texture", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.usda_edit", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.stage.copypaste", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.property.skel", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.graph.expression", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.window.content_browser", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.window.script_editor", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.window.splash_close_example", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.videoencoding", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.window.extensions", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.property.tagging", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.debug.vscode", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.widget.layers", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.widget.path_field", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.audiorecorder", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.window.file_exporter", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.threadtime-tracker.dev", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.window.status_bar", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.search.service", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.audioplayer", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.window.stream_viewport", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.window.about", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.property.bundle", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.tagging", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.menu.file", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.graph.examples.python", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.property.camera", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.inspect", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.example.toolbar_button", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.widget.prompt", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.window.cursor", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.window.stats", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.graph.nodes", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.debugdraw", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.property.material", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.notification_manager", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.window.audiorecorder", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.agent.watcher", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.property.file", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.multinode", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.embedded_script", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/exts/omni.kit.capture", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.stats", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.kit.pipapi", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.timeline", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.kit.agent", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.hydra.ui", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.appwindow", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.usd.schema.physics", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.usd.libs", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.kit.test_app_compat", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.kit.registry.nucleus", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.ui_query", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.hydra.rtx", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.usd.schema.omnigraph", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.kit.loop-default", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.kit.uiapp", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.kit.autocapture", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.assets.plugins", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.kit.test", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.hydra.iray", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.usd", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.kit.core.tests", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.usd.schema.semantics", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.kit.profile_python", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.kit.ui_test", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.kit.menu.utils", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.client", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.mdl.neuraylib", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.kit.test_async_rendering", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.gpu_foundation", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.kit.extpath.git", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.hydra.engine.stats", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.kit.renderer.init", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.kit.test_helpers_gfx", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.ui", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.kit.livestream.core", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.kit.renderer.core", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.syntheticdata", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.usd.schema.audio", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.kit.app_snippets", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.hydra.pxr", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.hydra.scene_delegate", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.kit.splash", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.hydra.scene_api", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/carb.windowing.plugins", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.kit.window.splash", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.kit.commands", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.kit.material.library", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.kit.streamsdk.plugins", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.kit.usd_undo", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.kit.window.privacy", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.kit.pip_archive", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.kit.menu.create", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.assets", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.kit.mainwindow", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.kit.console", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.usd.config", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.usd.schema.anim", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.kit.context_menu", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/carb.audio", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.renderer-rtx", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.kit.window.viewport", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.kit.async_engine", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.kit.renderer.capture", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.ui.scene", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.mdl", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.kit.test_suite.helpers", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extensions/extensions-bundled", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/plugins/bindings-python", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/kit/extscore/omni.kit.pip_archive/pip_prebundle", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.core_archive/pip_prebundle", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.isaac.ml_archive/pip_prebundle", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.kit.pip_torch-1_11_0-0.1.3+103.1.wx64.cp37/torch-1-11-0", + "${env:HOME}/.local/share/ov/pkg/isaac_sim-2022.1.1/exts/omni.kit.pip_torch-1_11_0-0.1.3+103.1.lx64.cp37/torch-1-11-0", + ] +} \ No newline at end of file diff --git a/LICENSE.txt b/LICENSE.txt index e5e823e..b59d494 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 Johnson All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/README.md b/README.md index cea9e91..dabaeb2 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,189 @@ +# UR10 Reacher Reinforcement Learning Sim2Real Environment for Omniverse Isaac Gym/Sim + +This repository adds a UR10Reacher environment based on [OmniIsaacGymEnvs](https://github.com/NVIDIA-Omniverse/OmniIsaacGymEnvs) (commit [d0eaf2e](https://github.com/NVIDIA-Omniverse/OmniIsaacGymEnvs/tree/d0eaf2e7f1e1e901d62e780392ca77843c08eb2c)), and includes Sim2Real code to control a real-world [UR10](https://www.universal-robots.com/products/ur10-robot/) with the policy learned by reinforcement learning in Omniverse Isaac Gym/Sim. + +We target Isaac Sim 2022.1.1 and test the RL code on Windows 10 and Ubuntu 18.04. The Sim2Real code is tested on Linux and a real UR5 CB3 (since we don't have access to a real UR10). + +This repo is compatible with [OmniIsaacGymEnvs-DofbotReacher](https://github.com/j3soon/OmniIsaacGymEnvs-DofbotReacher). + +## Preview + +![](docs/media/UR10Reacher-Vectorized.gif) + +![](docs/media/UR10Reacher-Sim2Real.gif) + +## Installation + +Prerequisites: +- [Install Omniverse Isaac Sim 2022.1.1](https://docs.omniverse.nvidia.com/app_isaacsim/app_isaacsim/install_basic.html) (Must setup Cache and Nucleus) +- Your computer & GPU should be able to run the Cartpole example in [OmniIsaacGymEnvs](https://github.com/NVIDIA-Omniverse/OmniIsaacGymEnvs) +- (Optional) [Set up a UR3/UR5/UR10](https://www.universal-robots.com/products/) in the real world + +We will use Anaconda to manage our virtual environment: + +1. Clone this repository: + ```sh + cd ~ + git clone https://github.com/j3soon/OmniIsaacGymEnvs-UR10Reacher.git + ``` +2. Generate [instanceable](https://docs.omniverse.nvidia.com/app_isaacsim/app_isaacsim/tutorial_gym_instanceable_assets.html) UR10 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_ur10.py` and execute it inside the Script Editor window. Wait until you see the text `Done!`. +3. (Optional) [Install ROS Melodic for Ubuntu](https://wiki.ros.org/melodic/Installation/Ubuntu) and [Set up a catkin workspace for UR10](https://github.com/UniversalRobots/Universal_Robots_ROS_Driver/blob/master/README.md). + + Please change all `catkin_ws` in the commands to `ur_ws`, and make sure you can control the robot with `rqt-joint-trajectory-controller`. +4. [Download and Install Anaconda](https://www.anaconda.com/products/distribution#Downloads). + ```sh + # For 64-bit (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 + ``` +5. Patch Isaac Sim 2022.1.1 + ```sh + export ISAAC_SIM="$HOME/.local/share/ov/pkg/isaac_sim-2022.1.1" + cp ~/OmniIsaacGymEnvs-UR10Reacher/isaac_sim-2022.1.1-patch/setup_python_env.sh $ISAAC_SIM/setup_python_env.sh + ``` + > The patch for Isaac on Windows is slightly more complicated. Please open an issue for the patch details if you are using Windows. +6. [Set up conda environment for Isaac Sim](https://docs.omniverse.nvidia.com/app_isaacsim/app_isaacsim/install_python.html#advanced-running-with-anaconda) + ```sh + # conda remove --name isaac-sim --all + export ISAAC_SIM="$HOME/.local/share/ov/pkg/isaac_sim-2022.1.1" + cd $ISAAC_SIM + conda env create -f environment.yml + conda activate isaac-sim + cd ~/OmniIsaacGymEnvs-UR10Reacher + pip install -e . + # Below is optional + pip install pyyaml rospkg + ``` +7. Activate conda & ROS environment + ```sh + export ISAAC_SIM="$HOME/.local/share/ov/pkg/isaac_sim-2022.1.1" + cd $ISAAC_SIM + conda activate isaac-sim + source setup_conda_env.sh + # Below are optional + cd ~/ur_ws + source devel/setup.bash # or setup.zsh if you're using zsh + ``` + +Please note that you should execute the commands in Step 7 for every new shell. + +## Dummy Policy + +This is a sample to make sure you have setup the environment correctly. You should see a single UR10 in Isaac Sim. + +```sh +cd ~/OmniIsaacGymEnvs-UR10Reacher +python omniisaacgymenvs/scripts/dummy_ur10_policy.py task=UR10Reacher test=True num_envs=1 +``` + +## Demo + +We provide an interactable demo based on the `UR10Reacher` RL example. In this demo, you can click on any of +the UR10 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 UR10 and yields manual control + +Launch this demo with the following command. Note that this demo limits the maximum number of UR10 in the scene to 128. + +```sh +cd ~/OmniIsaacGymEnvs-UR10Reacher +python omniisaacgymenvs/scripts/rlgames_play.py task=UR10Reacher num_envs=64 +``` + +## Training + +You can launch the training in `headless` mode as follows: + +```sh +cd ~/OmniIsaacGymEnvs-UR10Reacher +python omniisaacgymenvs/scripts/rlgames_train.py task=UR10Reacher headless=True +``` + +The number of environments is set to 512 by default. If your GPU has small memory, you can decrease the number of environments by changing the arguments `num_envs` and `horizon_length` as below: + +```sh +cd ~/OmniIsaacGymEnvs-UR10Reacher +python omniisaacgymenvs/scripts/rlgames_train.py task=UR10Reacher headless=True num_envs=512 horizon_length=64 +``` + +You can also skip training by downloading the pre-trained model checkpoint by: + +```sh +cd ~/OmniIsaacGymEnvs-UR10Reacher +wget https://github.com/j3soon/OmniIsaacGymEnvs-UR10Reacher/releases/download/v1.0.0/runs.zip +unzip runs.zip +# For Sim2Real +wget https://github.com/j3soon/OmniIsaacGymEnvs-UR10Reacher/releases/download/v1.0.0/runs_safety.zip +unzip runs_safety.zip +``` + +## Testing + +Make sure you have model checkpoints at `~/OmniIsaacGymEnvs-UR10Reacher/runs`, you can check it with the following command: + +```sh +ls ~/OmniIsaacGymEnvs-UR10Reacher/runs/UR10Reacher/nn/ +``` + +You can visualize the learned policy by the following command: + +```sh +cd ~/OmniIsaacGymEnvs-UR10Reacher +python omniisaacgymenvs/scripts/rlgames_train.py task=UR10Reacher test=True num_envs=512 checkpoint=./runs/UR10Reacher/nn/UR10Reacher.pth +``` + +Likewise, you can decrease the number of environments by modifying the parameter `num_envs=512`. + +## Sim2Real + +It is important to make sure that you know how to safely control your robot by reading the manual. For additional safety, please add the following configurations: +1. Set `General Limits` to `Very restricted` + ![](docs/media/UR5-Safety-Very-Restricted.jpeg) +2. Set `Joint Limits` according to your robot mounting point and the environment. + ![](docs/media/UR5-Safety-Joint-Limits.jpeg) +3. Set `Boundaries` according to the robot's environment. + ![](docs/media/UR5-Safety-Boundaries.jpeg) + +Play with the robot and make sure it won't hit anything under the current configuration. If anything goes wrong, press the red `EMERGENCY-STOP` button. + +In the following, we'll assume you have the same mounting direction and workspace as the preview GIF. If you have a different setup, you need to modify the code. Please [open an issue](https://github.com/j3soon/OmniIsaacGymEnvs-UR10Reacher/issues) if you need more information on where to modify. + +We'll use ROS to control the real-world robot. Run the following command in a Terminal: (Replace `192.168.50.50` to your robot's IP address) + +```sh +roslaunch ur_robot_driver ur5_bringup.launch robot_ip:=192.168.50.50 headless_mode:=true +``` + +Edit `omniisaacgymenvs/cfg/task/UR10Reacher.yaml`. Set `sim2real.enabled` and `safety.enabled` to `True`: + +```yaml +sim2real: + enabled: True + fail_quietely: False + verbose: False +safety: # Reduce joint limits during both training & testing + enabled: True +``` + +Now you can control the real-world UR10 in real-time by the following command: + +```sh +cd ~/OmniIsaacGymEnvs-UR10Reacher +python omniisaacgymenvs/scripts/rlgames_train.py task=UR10Reacher test=True num_envs=1 checkpoint=./runs/UR10Reacher/nn/UR10Reacher.pth +# or if you want to use the pre-trained checkpoint +python omniisaacgymenvs/scripts/rlgames_train.py task=UR10Reacher test=True num_envs=1 checkpoint=./runs_safety/UR10Reacher/nn/UR10Reacher.pth +``` + +> **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 @@ -18,7 +204,7 @@ This repository contains Reinforcement Learning examples that can be run with th ### Installation -Follow the Isaac Sim [documentation](https://docs.omniverse.nvidia.com/app_isaacsim/app_isaacsim/install_basic.html) to install the latest Isaac Sim release. +Follow the Isaac Sim [documentation](https://docs.omniverse.nvidia.com/app_isaacsim/app_isaacsim/install_basic.html) to install the latest Isaac Sim release. *Examples in this repository rely on features from the most recent Isaac Sim release. Please make sure to update any existing Isaac Sim build to the latest release version, 2022.1.1, to ensure examples work as expected.* @@ -81,7 +267,7 @@ be optimized in future releases. ### 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: @@ -90,15 +276,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"` @@ -153,7 +339,7 @@ This script uses the same RL Games PPO policy as the above, but runs the RL loop ### 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`, `Crazyflie`, `FrankaCabinet`, `Humanoid`, `Ingenuity`, `Quadcopter`, `ShadowHand`, `ShadowHandOpenAI_FF`, `ShadowHandOpenAI_LSTM` (these correspond to the config for each environment in the folder `omniisaacgymenvs/cfg/task`) @@ -176,9 +362,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. @@ -198,7 +384,7 @@ You can run (WandB)[https://wandb.ai/] with OmniIsaacGymEnvs by setting `wandb_a ## 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. @@ -209,7 +395,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 @@ -224,7 +410,7 @@ the ANYmals in the scene to go into third-person mode and manually control the r Launch this demo with the following command. Note that this demo limits the maximum number of ANYmals in the scene to 128. ``` -PYTHON_PATH scripts/rlgames_play.py task=AnymalTerrain num_envs=64 checkpoint=omniverse://localhost/NVIDIA/Assets/Isaac/2022.1/Isaac/Samples/OmniIsaacGymEnvs/Checkpoints/anymal_terrain.pth +PYTHON_PATH scripts/rlgames_play.py task=AnymalTerrain num_envs=64 checkpoint=omniverse://localhost/NVIDIA/Assets/Isaac/2022.1/Isaac/Samples/OmniIsaacGymEnvs/Checkpoints/anymal_terrain.pth ``` diff --git a/docs/media/UR10Reacher-Sim2Real.gif b/docs/media/UR10Reacher-Sim2Real.gif new file mode 100644 index 0000000..c2f84e4 Binary files /dev/null and b/docs/media/UR10Reacher-Sim2Real.gif differ diff --git a/docs/media/UR10Reacher-Vectorized.gif b/docs/media/UR10Reacher-Vectorized.gif new file mode 100644 index 0000000..92eed33 Binary files /dev/null and b/docs/media/UR10Reacher-Vectorized.gif differ diff --git a/docs/media/UR5-Safety-Boundaries.jpeg b/docs/media/UR5-Safety-Boundaries.jpeg new file mode 100644 index 0000000..2f1e1cc Binary files /dev/null and b/docs/media/UR5-Safety-Boundaries.jpeg differ diff --git a/docs/media/UR5-Safety-Joint-Limits.jpeg b/docs/media/UR5-Safety-Joint-Limits.jpeg new file mode 100644 index 0000000..eb04588 Binary files /dev/null and b/docs/media/UR5-Safety-Joint-Limits.jpeg differ diff --git a/docs/media/UR5-Safety-Very-Restricted.jpeg b/docs/media/UR5-Safety-Very-Restricted.jpeg new file mode 100644 index 0000000..8359f69 Binary files /dev/null and b/docs/media/UR5-Safety-Very-Restricted.jpeg differ diff --git a/isaac_sim-2022.1.1-patch/setup_python_env.sh b/isaac_sim-2022.1.1-patch/setup_python_env.sh new file mode 100755 index 0000000..3bf9838 --- /dev/null +++ b/isaac_sim-2022.1.1-patch/setup_python_env.sh @@ -0,0 +1,5 @@ +#!/bin/bash +# SCRIPT_DIR="$(dirname "${BASH_SOURCE}")" +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$SCRIPT_DIR/../../../$LD_LIBRARY_PATH:$SCRIPT_DIR/.:$SCRIPT_DIR/exts/omni.usd.schema.isaac/bin:$SCRIPT_DIR/exts/omni.isaac.motion_planning/bin:$SCRIPT_DIR/kit:$SCRIPT_DIR/kit/exts/omni.kit.filebrowser_column.tags/bin:$SCRIPT_DIR/kit/exts/omni.kit.window.file/bin:$SCRIPT_DIR/kit/exts/omni.kit.procedural.mesh/bin:$SCRIPT_DIR/kit/exts/omni.kit.primitive.mesh/bin:$SCRIPT_DIR/kit/exts/omni.kit.property.audio/bin:$SCRIPT_DIR/kit/exts/omni.kit.thumbnails.usd/bin:$SCRIPT_DIR/kit/exts/omni.kit.gfn/bin:$SCRIPT_DIR/kit/exts/omni.kit.filebrowser_column.acl/bin:$SCRIPT_DIR/kit/exts/omni.kit.window.console/bin:$SCRIPT_DIR/kit/exts/omni.kit.widget.inspector/bin:$SCRIPT_DIR/kit/exts/omni.kit.widget.versioning/bin:$SCRIPT_DIR/kit/exts/omni.kit.tool.collect/bin:$SCRIPT_DIR/kit/exts/omni.flowusd/bin:$SCRIPT_DIR/kit/exts/omni.ansel/bin:$SCRIPT_DIR/kit/exts/omni.kit.property.geometry/bin:$SCRIPT_DIR/kit/exts/omni.kit.window.audio.oscilloscope/bin:$SCRIPT_DIR/kit/exts/omni.kit.property.render/bin:$SCRIPT_DIR/kit/exts/omni.mdl.usd_converter/bin:$SCRIPT_DIR/kit/exts/omni.kit.window.material_swap/bin:$SCRIPT_DIR/kit/exts/omni.kit.window.usd_paths/bin:$SCRIPT_DIR/kit/exts/omni.graph/bin:$SCRIPT_DIR/kit/exts/omni.kit.quicklayout/bin:$SCRIPT_DIR/kit/exts/omni.kit.property.usd/bin:$SCRIPT_DIR/kit/exts/omni.rtx.window.settings/bin:$SCRIPT_DIR/kit/exts/omni.kit.menu.edit/bin:$SCRIPT_DIR/kit/exts/omni.graph.tools/bin:$SCRIPT_DIR/kit/exts/omni.kit.window.images/bin:$SCRIPT_DIR/kit/exts/omni.graph.bundle.action/bin:$SCRIPT_DIR/kit/exts/omni.kit.property.transform/bin:$SCRIPT_DIR/kit/exts/omni.kit.window.provide_feedback/bin:$SCRIPT_DIR/kit/exts/omni.kit.window.title/bin:$SCRIPT_DIR/kit/exts/omni.kit.window.popup_dialog/bin:$SCRIPT_DIR/kit/exts/omni.iray.settings.core/bin:$SCRIPT_DIR/kit/exts/omni.kit.property.layer/bin:$SCRIPT_DIR/kit/exts/omni.graph.instancing/bin:$SCRIPT_DIR/kit/exts/omni.kit.viewport_widgets_manager/bin:$SCRIPT_DIR/kit/exts/omni.kit.widget.imageview/bin:$SCRIPT_DIR/kit/exts/omni.kit.livestream.native/bin:$SCRIPT_DIR/kit/exts/omni.kit.window.audioplayer/bin:$SCRIPT_DIR/kit/exts/omni.kit.widget.filebrowser/bin:$SCRIPT_DIR/kit/exts/omni.kit.window.tests/bin:$SCRIPT_DIR/kit/exts/omni.graph.core/bin:$SCRIPT_DIR/kit/exts/omni.kit.window.preferences/bin:$SCRIPT_DIR/kit/exts/omni.kit.numpy.common/bin:$SCRIPT_DIR/kit/exts/omni.kit.audio.test.usd/bin:$SCRIPT_DIR/kit/exts/omni.graph.test/bin:$SCRIPT_DIR/kit/exts/omni.kit.menu.aov/bin:$SCRIPT_DIR/kit/exts/omni.kit.window.file_importer/bin:$SCRIPT_DIR/kit/exts/omni.rtx.multinode.dev/bin:$SCRIPT_DIR/kit/exts/omni.kit.menu.common/bin:$SCRIPT_DIR/kit/exts/omni.resourcemonitor/bin:$SCRIPT_DIR/kit/exts/omni.graph.ui/bin:$SCRIPT_DIR/kit/exts/omni.kit.compatibility_checker/bin:$SCRIPT_DIR/kit/exts/omni.kit.selection/bin:$SCRIPT_DIR/kit/exts/omni.kit.window.property/bin:$SCRIPT_DIR/kit/exts/omni.kit.viewport.utility/bin:$SCRIPT_DIR/kit/exts/omni.hydra.pxr.settings/bin:$SCRIPT_DIR/kit/exts/omni.kit.window.filepicker/bin:$SCRIPT_DIR/kit/exts/omni.kit.widget.browser_bar/bin:$SCRIPT_DIR/kit/exts/omni.kit.telemetry/bin:$SCRIPT_DIR/kit/exts/omni.kit.widget.stage/bin:$SCRIPT_DIR/kit/exts/omni.kit.debug.python/bin:$SCRIPT_DIR/kit/exts/omni.graph.action/bin:$SCRIPT_DIR/kit/exts/omni.kit.window.inspector/bin:$SCRIPT_DIR/kit/exts/omni.graph.examples.cpp/bin:$SCRIPT_DIR/kit/exts/omni.example.ui/bin:$SCRIPT_DIR/kit/exts/omni.kit.window.drop_support/bin:$SCRIPT_DIR/kit/exts/omni.kit.property.light/bin:$SCRIPT_DIR/kit/exts/omni.kit.documentation.builder/bin:$SCRIPT_DIR/kit/exts/omni.kit.stage.mdl_converter/bin:$SCRIPT_DIR/kit/exts/omni.kit.widget.live/bin:$SCRIPT_DIR/kit/exts/omni.kit.collaboration.channel_manager/bin:$SCRIPT_DIR/kit/exts/omni.graph.tutorials/bin:$SCRIPT_DIR/kit/exts/omni.graph.io/bin:$SCRIPT_DIR/kit/exts/omni.kit.audiodeviceenum/bin:$SCRIPT_DIR/kit/exts/omni.kit.window.stage/bin:$SCRIPT_DIR/kit/exts/omni.kit.viewport.legacy_gizmos/bin:$SCRIPT_DIR/kit/exts/omni.kit.collaboration.viewport.camera/bin:$SCRIPT_DIR/kit/exts/omni.rtx.settings.core/bin:$SCRIPT_DIR/kit/exts/omni.kit.widget.settings/bin:$SCRIPT_DIR/kit/exts/omni.kit.livestream.webrtc/bin:$SCRIPT_DIR/kit/exts/omni.kit.widget.fast_search/bin:$SCRIPT_DIR/kit/exts/omni.kit.widget.stage_icons/bin:$SCRIPT_DIR/kit/exts/omni.kit.search_core/bin:$SCRIPT_DIR/kit/exts/omni.kit.window.imageviewer/bin:$SCRIPT_DIR/kit/exts/omni.kit.stage_templates/bin:$SCRIPT_DIR/kit/exts/omni.kit.window.toolbar/bin:$SCRIPT_DIR/kit/exts/omni.volume/bin:$SCRIPT_DIR/kit/exts/omni.graph.scriptnode/bin:$SCRIPT_DIR/kit/exts/omni.kit.search_example/bin:$SCRIPT_DIR/kit/exts/omni.uiaudio/bin:$SCRIPT_DIR/kit/exts/omni.command.usd/bin:$SCRIPT_DIR/kit/exts/omni.kit.window.stageviewer/bin:$SCRIPT_DIR/kit/exts/omni.rtx.tests/bin:$SCRIPT_DIR/kit/exts/omni.kit.widget.graph/bin:$SCRIPT_DIR/kit/exts/omni.kit.window.commands/bin:$SCRIPT_DIR/kit/exts/omni.kit.viewport.ready/bin:$SCRIPT_DIR/kit/exts/omni.kit.hydra_texture/bin:$SCRIPT_DIR/kit/exts/omni.kit.usda_edit/bin:$SCRIPT_DIR/kit/exts/omni.kit.stage.copypaste/bin:$SCRIPT_DIR/kit/exts/omni.kit.property.skel/bin:$SCRIPT_DIR/kit/exts/omni.graph.expression/bin:$SCRIPT_DIR/kit/exts/omni.kit.window.content_browser/bin:$SCRIPT_DIR/kit/exts/omni.kit.window.script_editor/bin:$SCRIPT_DIR/kit/exts/omni.kit.window.splash_close_example/bin:$SCRIPT_DIR/kit/exts/omni.videoencoding/bin:$SCRIPT_DIR/kit/exts/omni.kit.window.extensions/bin:$SCRIPT_DIR/kit/exts/omni.kit.property.tagging/bin:$SCRIPT_DIR/kit/exts/omni.kit.debug.vscode/bin:$SCRIPT_DIR/kit/exts/omni.kit.widget.layers/bin:$SCRIPT_DIR/kit/exts/omni.kit.widget.path_field/bin:$SCRIPT_DIR/kit/exts/omni.audiorecorder/bin:$SCRIPT_DIR/kit/exts/omni.kit.window.file_exporter/bin:$SCRIPT_DIR/kit/exts/omni.threadtime-tracker.dev/bin:$SCRIPT_DIR/kit/exts/omni.kit.window.status_bar/bin:$SCRIPT_DIR/kit/exts/omni.kit.search.service/bin:$SCRIPT_DIR/kit/exts/omni.audioplayer/bin:$SCRIPT_DIR/kit/exts/omni.kit.window.stream_viewport/bin:$SCRIPT_DIR/kit/exts/omni.kit.window.about/bin:$SCRIPT_DIR/kit/exts/omni.kit.property.bundle/bin:$SCRIPT_DIR/kit/exts/omni.kit.tagging/bin:$SCRIPT_DIR/kit/exts/omni.kit.menu.file/bin:$SCRIPT_DIR/kit/exts/omni.graph.examples.python/bin:$SCRIPT_DIR/kit/exts/omni.kit.property.camera/bin:$SCRIPT_DIR/kit/exts/omni.inspect/bin:$SCRIPT_DIR/kit/exts/omni.kit.example.toolbar_button/bin:$SCRIPT_DIR/kit/exts/omni.kit.widget.prompt/bin:$SCRIPT_DIR/kit/exts/omni.kit.window.cursor/bin:$SCRIPT_DIR/kit/exts/omni.kit.window.stats/bin:$SCRIPT_DIR/kit/exts/omni.graph.nodes/bin:$SCRIPT_DIR/kit/exts/omni.debugdraw/bin:$SCRIPT_DIR/kit/exts/omni.kit.property.material/bin:$SCRIPT_DIR/kit/exts/omni.kit.notification_manager/bin:$SCRIPT_DIR/kit/exts/omni.kit.window.audiorecorder/bin:$SCRIPT_DIR/kit/exts/omni.kit.agent.watcher/bin:$SCRIPT_DIR/kit/exts/omni.kit.property.file/bin:$SCRIPT_DIR/kit/exts/omni.kit.multinode/bin:$SCRIPT_DIR/kit/exts/omni.kit.embedded_script/bin:$SCRIPT_DIR/kit/exts/omni.kit.capture/bin:$SCRIPT_DIR/kit/extscore/omni.stats/bin:$SCRIPT_DIR/kit/extscore/omni.kit.pipapi/bin:$SCRIPT_DIR/kit/extscore/omni.timeline/bin:$SCRIPT_DIR/kit/extscore/omni.kit.agent/bin:$SCRIPT_DIR/kit/extscore/omni.hydra.ui/bin:$SCRIPT_DIR/kit/extscore/omni.appwindow/bin:$SCRIPT_DIR/kit/extscore/omni.usd.schema.physics/bin:$SCRIPT_DIR/kit/extscore/omni.usd.libs/bin:$SCRIPT_DIR/kit/extscore/omni.kit.test_app_compat/bin:$SCRIPT_DIR/kit/extscore/omni.kit.registry.nucleus/bin:$SCRIPT_DIR/kit/extscore/omni.ui_query/bin:$SCRIPT_DIR/kit/extscore/omni.hydra.rtx/bin:$SCRIPT_DIR/kit/extscore/omni.usd.schema.omnigraph/bin:$SCRIPT_DIR/kit/extscore/omni.kit.loop-default/bin:$SCRIPT_DIR/kit/extscore/omni.kit.uiapp/bin:$SCRIPT_DIR/kit/extscore/omni.kit.autocapture/bin:$SCRIPT_DIR/kit/extscore/omni.assets.plugins/bin:$SCRIPT_DIR/kit/extscore/omni.kit.test/bin:$SCRIPT_DIR/kit/extscore/omni.hydra.iray/bin:$SCRIPT_DIR/kit/extscore/omni.usd/bin:$SCRIPT_DIR/kit/extscore/omni.kit.core.tests/bin:$SCRIPT_DIR/kit/extscore/omni.usd.schema.semantics/bin:$SCRIPT_DIR/kit/extscore/omni.kit.profile_python/bin:$SCRIPT_DIR/kit/extscore/omni.kit.ui_test/bin:$SCRIPT_DIR/kit/extscore/omni.kit.menu.utils/bin:$SCRIPT_DIR/kit/extscore/omni.client/bin:$SCRIPT_DIR/kit/extscore/omni.mdl.neuraylib/bin:$SCRIPT_DIR/kit/extscore/omni.kit.test_async_rendering/bin:$SCRIPT_DIR/kit/extscore/omni.gpu_foundation/bin:$SCRIPT_DIR/kit/extscore/omni.kit.extpath.git/bin:$SCRIPT_DIR/kit/extscore/omni.hydra.engine.stats/bin:$SCRIPT_DIR/kit/extscore/omni.kit.renderer.init/bin:$SCRIPT_DIR/kit/extscore/omni.kit.test_helpers_gfx/bin:$SCRIPT_DIR/kit/extscore/omni.ui/bin:$SCRIPT_DIR/kit/extscore/omni.kit.livestream.core/bin:$SCRIPT_DIR/kit/extscore/omni.kit.renderer.core/bin:$SCRIPT_DIR/kit/extscore/omni.syntheticdata/bin:$SCRIPT_DIR/kit/extscore/omni.usd.schema.audio/bin:$SCRIPT_DIR/kit/extscore/omni.kit.app_snippets/bin:$SCRIPT_DIR/kit/extscore/omni.hydra.pxr/bin:$SCRIPT_DIR/kit/extscore/omni.hydra.scene_delegate/bin:$SCRIPT_DIR/kit/extscore/omni.kit.splash/bin:$SCRIPT_DIR/kit/extscore/omni.hydra.scene_api/bin:$SCRIPT_DIR/kit/extscore/carb.windowing.plugins/bin:$SCRIPT_DIR/kit/extscore/omni.kit.window.splash/bin:$SCRIPT_DIR/kit/extscore/omni.kit.commands/bin:$SCRIPT_DIR/kit/extscore/omni.kit.material.library/bin:$SCRIPT_DIR/kit/extscore/omni.kit.streamsdk.plugins/bin:$SCRIPT_DIR/kit/extscore/omni.kit.usd_undo/bin:$SCRIPT_DIR/kit/extscore/omni.kit.window.privacy/bin:$SCRIPT_DIR/kit/extscore/omni.kit.pip_archive/bin:$SCRIPT_DIR/kit/extscore/omni.kit.menu.create/bin:$SCRIPT_DIR/kit/extscore/omni.assets/bin:$SCRIPT_DIR/kit/extscore/omni.kit.mainwindow/bin:$SCRIPT_DIR/kit/extscore/omni.kit.console/bin:$SCRIPT_DIR/kit/extscore/omni.usd.config/bin:$SCRIPT_DIR/kit/extscore/omni.usd.schema.anim/bin:$SCRIPT_DIR/kit/extscore/omni.kit.context_menu/bin:$SCRIPT_DIR/kit/extscore/carb.audio/bin:$SCRIPT_DIR/kit/extscore/omni.renderer-rtx/bin:$SCRIPT_DIR/kit/extscore/omni.kit.window.viewport/bin:$SCRIPT_DIR/kit/extscore/omni.kit.async_engine/bin:$SCRIPT_DIR/kit/extscore/omni.kit.renderer.capture/bin:$SCRIPT_DIR/kit/extscore/omni.ui.scene/bin:$SCRIPT_DIR/kit/extscore/omni.mdl/bin:$SCRIPT_DIR/kit/extscore/omni.kit.test_suite.helpers/bin:$SCRIPT_DIR/kit/extsPhysics/omni.physx.cct-1.4.15-5.1/bin:$SCRIPT_DIR/kit/extsPhysics/omni.usd.schema.physx/bin:$SCRIPT_DIR/kit/extsPhysics/omni.localcache/bin:$SCRIPT_DIR/kit/extsPhysics/omni.physx.camera.tests-1.4.15-5.1/bin:$SCRIPT_DIR/kit/extsPhysics/omni.usd.schema.physics/bin:$SCRIPT_DIR/kit/extsPhysics/omni.physx.preview-1.4.15-5.1/bin:$SCRIPT_DIR/kit/extsPhysics/omni.blockworld-1.4.15-5.1/bin:$SCRIPT_DIR/kit/extsPhysics/omni.kvdb/bin:$SCRIPT_DIR/kit/extsPhysics/omni.physx.ui-1.4.15-5.1/bin:$SCRIPT_DIR/kit/extsPhysics/omni.physx.bundle-1.4.15-5.1/bin:$SCRIPT_DIR/kit/extsPhysics/omni.physx.tests.visual-1.4.15-5.1/bin:$SCRIPT_DIR/kit/extsPhysics/omni.physx-1.4.15-5.1/bin:$SCRIPT_DIR/kit/extsPhysics/omni.kit.property.physx/bin:$SCRIPT_DIR/kit/extsPhysics/omni.physx.vehicle-1.4.15-5.1/bin:$SCRIPT_DIR/kit/extsPhysics/omni.physx.zerogravity.tests-1.4.15-5.1/bin:$SCRIPT_DIR/kit/extsPhysics/omni.physx.forcefields-1.4.15-5.1/bin:$SCRIPT_DIR/kit/extsPhysics/omni.physx.camera-1.4.15-5.1/bin:$SCRIPT_DIR/kit/extsPhysics/omni.physx.tests-1.4.15-5.1/bin:$SCRIPT_DIR/kit/extsPhysics/omni.usd.schema.forcefield/bin:$SCRIPT_DIR/kit/extsPhysics/omni.physx.tensors-1.4.15-5.1/bin:$SCRIPT_DIR/kit/extsPhysics/omni.usdphysics.tests-1.4.15/bin:$SCRIPT_DIR/kit/extsPhysics/omni.physx.demos-1.4.15-5.1/bin:$SCRIPT_DIR/kit/extsPhysics/omni.physx.vehicle.tests-1.4.15-5.1/bin:$SCRIPT_DIR/kit/extsPhysics/omni.physx.pvd-1.4.15-5.1/bin:$SCRIPT_DIR/kit/extsPhysics/omni.physx.flatcache-1.4.15-5.1/bin:$SCRIPT_DIR/kit/extsPhysics/omni.physx.zerogravity-1.4.15-5.1/bin:$SCRIPT_DIR/kit/extsPhysics/omni.convexdecomposition-1.4.15/bin:$SCRIPT_DIR/kit/extsPhysics/omni.usdphysics-1.4.15/bin:$SCRIPT_DIR/kit/extsPhysics/omni.physx.commands-1.4.15-5.1/bin:$SCRIPT_DIR/kit/extsPhysics/omni.physics.tensors-1.4.15-5.1/bin:$SCRIPT_DIR/kit/libs/iray:$SCRIPT_DIR/kit/plugins:$SCRIPT_DIR/kit/plugins/bindings-python:$SCRIPT_DIR/kit/plugins/carb_gfx:$SCRIPT_DIR/kit/plugins/rtx:$SCRIPT_DIR/kit/extensions/extensions-bundled/bin +export PYTHONPATH=$PYTHONPATH:$SCRIPT_DIR/../../../$PYTHONPATH:$SCRIPT_DIR/exts/omni.isaac.motion_generation:$SCRIPT_DIR/exts/omni.isaac.motion_planning:$SCRIPT_DIR/exts/omni.isaac.core_archive:$SCRIPT_DIR/exts/omni.isaac.dynamic_control:$SCRIPT_DIR/exts/omni.isaac.core:$SCRIPT_DIR/exts/omni.isaac.statistics_logging:$SCRIPT_DIR/exts/omni.isaac.assets_check:$SCRIPT_DIR/exts/omni.isaac.ros2_bridge:$SCRIPT_DIR/exts/omni.isaac.universal_robots:$SCRIPT_DIR/exts/omni.isaac.internal_tools:$SCRIPT_DIR/exts/omni.isaac.cortex:$SCRIPT_DIR/exts/omni.usd.schema.isaac:$SCRIPT_DIR/exts/omni.isaac.dofbot:$SCRIPT_DIR/exts/omni.replicator.isaac:$SCRIPT_DIR/exts/omni.isaac.ros_bridge:$SCRIPT_DIR/exts/omni.isaac.articulation_inspector:$SCRIPT_DIR/exts/omni.isaac.asset_browser:$SCRIPT_DIR/exts/omni.isaac.manipulators:$SCRIPT_DIR/exts/omni.isaac.mjcf:$SCRIPT_DIR/exts/omni.isaac.benchmark_environments:$SCRIPT_DIR/exts/omni.isaac.isaac_sensor:$SCRIPT_DIR/exts/omni.isaac.gain_tuner:$SCRIPT_DIR/exts/omni.isaac.physics_utilities:$SCRIPT_DIR/exts/omni.isaac.repl:$SCRIPT_DIR/exts/omni.isaac.franka:$SCRIPT_DIR/exts/omni.isaac.lula:$SCRIPT_DIR/exts/omni.isaac.synthetic_utils:$SCRIPT_DIR/exts/omni.isaac.ml_archive:$SCRIPT_DIR/exts/omni.isaac.cloner:$SCRIPT_DIR/exts/omni.isaac.unit_converter:$SCRIPT_DIR/exts/omni.isaac.demos:$SCRIPT_DIR/exts/omni.isaac.window.about:$SCRIPT_DIR/exts/omni.isaac.range_sensor:$SCRIPT_DIR/exts/omni.isaac.shapenet:$SCRIPT_DIR/exts/omni.kit.property.isaac:$SCRIPT_DIR/exts/omni.isaac.app.setup:$SCRIPT_DIR/exts/omni.isaac.wheeled_robots:$SCRIPT_DIR/exts/omni.isaac.examples:$SCRIPT_DIR/exts/omni.isaac.proximity_sensor:$SCRIPT_DIR/exts/omni.isaac.splash:$SCRIPT_DIR/exts/omni.isaac.urdf:$SCRIPT_DIR/exts/omni.isaac.occupancy_map:$SCRIPT_DIR/exts/omni.isaac.synthetic_recorder:$SCRIPT_DIR/exts/omni.isaac.ui_template:$SCRIPT_DIR/exts/omni.isaac.app.selector:$SCRIPT_DIR/exts/omni.isaac.core_nodes:$SCRIPT_DIR/exts/omni.isaac.onshape:$SCRIPT_DIR/exts/omni.isaac.tests:$SCRIPT_DIR/exts/omni.isaac.quadruped:$SCRIPT_DIR/exts/omni.kit.loop-isaac:$SCRIPT_DIR/exts/omni.drivesim.sensors.nv.lidar:$SCRIPT_DIR/exts/omni.isaac.version:$SCRIPT_DIR/exts/omni.isaac.surface_gripper:$SCRIPT_DIR/exts/omni.isaac.diff_usd:$SCRIPT_DIR/exts/omni.isaac.ui:$SCRIPT_DIR/exts/omni.isaac.kit:$SCRIPT_DIR/exts/omni.isaac.gym:$SCRIPT_DIR/exts/omni.isaac.partition:$SCRIPT_DIR/exts/omni.isaac.robot_benchmark:$SCRIPT_DIR/exts/omni.isaac.physics_inspector:$SCRIPT_DIR/exts/omni.isaac.conveyor:$SCRIPT_DIR/exts/omni.isaac.merge_mesh:$SCRIPT_DIR/exts/omni.isaac.utils:$SCRIPT_DIR/exts/omni.isaac.debug_draw:$SCRIPT_DIR/kit/exts/omni.kit.filebrowser_column.tags:$SCRIPT_DIR/kit/exts/omni.kit.window.file:$SCRIPT_DIR/kit/exts/omni.kit.procedural.mesh:$SCRIPT_DIR/kit/exts/omni.kit.primitive.mesh:$SCRIPT_DIR/kit/exts/omni.kit.property.audio:$SCRIPT_DIR/kit/exts/omni.kit.thumbnails.usd:$SCRIPT_DIR/kit/exts/omni.kit.gfn:$SCRIPT_DIR/kit/exts/omni.kit.filebrowser_column.acl:$SCRIPT_DIR/kit/exts/omni.kit.window.console:$SCRIPT_DIR/kit/exts/omni.kit.widget.inspector:$SCRIPT_DIR/kit/exts/omni.kit.widget.versioning:$SCRIPT_DIR/kit/exts/omni.kit.tool.collect:$SCRIPT_DIR/kit/exts/omni.flowusd:$SCRIPT_DIR/kit/exts/omni.ansel:$SCRIPT_DIR/kit/exts/omni.kit.property.geometry:$SCRIPT_DIR/kit/exts/omni.kit.window.audio.oscilloscope:$SCRIPT_DIR/kit/exts/omni.kit.property.render:$SCRIPT_DIR/kit/exts/omni.mdl.usd_converter:$SCRIPT_DIR/kit/exts/omni.kit.window.material_swap:$SCRIPT_DIR/kit/exts/omni.kit.window.usd_paths:$SCRIPT_DIR/kit/exts/omni.graph:$SCRIPT_DIR/kit/exts/omni.kit.quicklayout:$SCRIPT_DIR/kit/exts/omni.kit.property.usd:$SCRIPT_DIR/kit/exts/omni.rtx.window.settings:$SCRIPT_DIR/kit/exts/omni.kit.menu.edit:$SCRIPT_DIR/kit/exts/omni.graph.tools:$SCRIPT_DIR/kit/exts/omni.kit.window.images:$SCRIPT_DIR/kit/exts/omni.graph.bundle.action:$SCRIPT_DIR/kit/exts/omni.kit.property.transform:$SCRIPT_DIR/kit/exts/omni.kit.window.provide_feedback:$SCRIPT_DIR/kit/exts/omni.kit.window.title:$SCRIPT_DIR/kit/exts/omni.kit.window.popup_dialog:$SCRIPT_DIR/kit/exts/omni.iray.settings.core:$SCRIPT_DIR/kit/exts/omni.kit.property.layer:$SCRIPT_DIR/kit/exts/omni.graph.instancing:$SCRIPT_DIR/kit/exts/omni.kit.viewport_widgets_manager:$SCRIPT_DIR/kit/exts/omni.kit.widget.imageview:$SCRIPT_DIR/kit/exts/omni.kit.livestream.native:$SCRIPT_DIR/kit/exts/omni.kit.window.audioplayer:$SCRIPT_DIR/kit/exts/omni.kit.widget.filebrowser:$SCRIPT_DIR/kit/exts/omni.kit.window.tests:$SCRIPT_DIR/kit/exts/omni.graph.core:$SCRIPT_DIR/kit/exts/omni.kit.window.preferences:$SCRIPT_DIR/kit/exts/omni.kit.numpy.common:$SCRIPT_DIR/kit/exts/omni.kit.audio.test.usd:$SCRIPT_DIR/kit/exts/omni.graph.test:$SCRIPT_DIR/kit/exts/omni.kit.menu.aov:$SCRIPT_DIR/kit/exts/omni.kit.window.file_importer:$SCRIPT_DIR/kit/exts/omni.rtx.multinode.dev:$SCRIPT_DIR/kit/exts/omni.kit.menu.common:$SCRIPT_DIR/kit/exts/omni.resourcemonitor:$SCRIPT_DIR/kit/exts/omni.graph.ui:$SCRIPT_DIR/kit/exts/omni.kit.compatibility_checker:$SCRIPT_DIR/kit/exts/omni.kit.selection:$SCRIPT_DIR/kit/exts/omni.kit.window.property:$SCRIPT_DIR/kit/exts/omni.kit.viewport.utility:$SCRIPT_DIR/kit/exts/omni.hydra.pxr.settings:$SCRIPT_DIR/kit/exts/omni.kit.window.filepicker:$SCRIPT_DIR/kit/exts/omni.kit.widget.browser_bar:$SCRIPT_DIR/kit/exts/omni.kit.telemetry:$SCRIPT_DIR/kit/exts/omni.kit.widget.stage:$SCRIPT_DIR/kit/exts/omni.kit.debug.python:$SCRIPT_DIR/kit/exts/omni.graph.action:$SCRIPT_DIR/kit/exts/omni.kit.window.inspector:$SCRIPT_DIR/kit/exts/omni.graph.examples.cpp:$SCRIPT_DIR/kit/exts/omni.example.ui:$SCRIPT_DIR/kit/exts/omni.kit.window.drop_support:$SCRIPT_DIR/kit/exts/omni.kit.property.light:$SCRIPT_DIR/kit/exts/omni.kit.documentation.builder:$SCRIPT_DIR/kit/exts/omni.kit.stage.mdl_converter:$SCRIPT_DIR/kit/exts/omni.kit.widget.live:$SCRIPT_DIR/kit/exts/omni.kit.collaboration.channel_manager:$SCRIPT_DIR/kit/exts/omni.graph.tutorials:$SCRIPT_DIR/kit/exts/omni.graph.io:$SCRIPT_DIR/kit/exts/omni.kit.audiodeviceenum:$SCRIPT_DIR/kit/exts/omni.kit.window.stage:$SCRIPT_DIR/kit/exts/omni.kit.viewport.legacy_gizmos:$SCRIPT_DIR/kit/exts/omni.kit.collaboration.viewport.camera:$SCRIPT_DIR/kit/exts/omni.rtx.settings.core:$SCRIPT_DIR/kit/exts/omni.kit.widget.settings:$SCRIPT_DIR/kit/exts/omni.kit.livestream.webrtc:$SCRIPT_DIR/kit/exts/omni.kit.widget.fast_search:$SCRIPT_DIR/kit/exts/omni.kit.widget.stage_icons:$SCRIPT_DIR/kit/exts/omni.kit.search_core:$SCRIPT_DIR/kit/exts/omni.kit.window.imageviewer:$SCRIPT_DIR/kit/exts/omni.kit.stage_templates:$SCRIPT_DIR/kit/exts/omni.kit.window.toolbar:$SCRIPT_DIR/kit/exts/omni.volume:$SCRIPT_DIR/kit/exts/omni.graph.scriptnode:$SCRIPT_DIR/kit/exts/omni.kit.search_example:$SCRIPT_DIR/kit/exts/omni.uiaudio:$SCRIPT_DIR/kit/exts/omni.command.usd:$SCRIPT_DIR/kit/exts/omni.kit.window.stageviewer:$SCRIPT_DIR/kit/exts/omni.rtx.tests:$SCRIPT_DIR/kit/exts/omni.kit.widget.graph:$SCRIPT_DIR/kit/exts/omni.kit.window.commands:$SCRIPT_DIR/kit/exts/omni.kit.viewport.ready:$SCRIPT_DIR/kit/exts/omni.kit.hydra_texture:$SCRIPT_DIR/kit/exts/omni.kit.usda_edit:$SCRIPT_DIR/kit/exts/omni.kit.stage.copypaste:$SCRIPT_DIR/kit/exts/omni.kit.property.skel:$SCRIPT_DIR/kit/exts/omni.graph.expression:$SCRIPT_DIR/kit/exts/omni.kit.window.content_browser:$SCRIPT_DIR/kit/exts/omni.kit.window.script_editor:$SCRIPT_DIR/kit/exts/omni.kit.window.splash_close_example:$SCRIPT_DIR/kit/exts/omni.videoencoding:$SCRIPT_DIR/kit/exts/omni.kit.window.extensions:$SCRIPT_DIR/kit/exts/omni.kit.property.tagging:$SCRIPT_DIR/kit/exts/omni.kit.debug.vscode:$SCRIPT_DIR/kit/exts/omni.kit.widget.layers:$SCRIPT_DIR/kit/exts/omni.kit.widget.path_field:$SCRIPT_DIR/kit/exts/omni.audiorecorder:$SCRIPT_DIR/kit/exts/omni.kit.window.file_exporter:$SCRIPT_DIR/kit/exts/omni.threadtime-tracker.dev:$SCRIPT_DIR/kit/exts/omni.kit.window.status_bar:$SCRIPT_DIR/kit/exts/omni.kit.search.service:$SCRIPT_DIR/kit/exts/omni.audioplayer:$SCRIPT_DIR/kit/exts/omni.kit.window.stream_viewport:$SCRIPT_DIR/kit/exts/omni.kit.window.about:$SCRIPT_DIR/kit/exts/omni.kit.property.bundle:$SCRIPT_DIR/kit/exts/omni.kit.tagging:$SCRIPT_DIR/kit/exts/omni.kit.menu.file:$SCRIPT_DIR/kit/exts/omni.graph.examples.python:$SCRIPT_DIR/kit/exts/omni.kit.property.camera:$SCRIPT_DIR/kit/exts/omni.inspect:$SCRIPT_DIR/kit/exts/omni.kit.example.toolbar_button:$SCRIPT_DIR/kit/exts/omni.kit.widget.prompt:$SCRIPT_DIR/kit/exts/omni.kit.window.cursor:$SCRIPT_DIR/kit/exts/omni.kit.window.stats:$SCRIPT_DIR/kit/exts/omni.graph.nodes:$SCRIPT_DIR/kit/exts/omni.debugdraw:$SCRIPT_DIR/kit/exts/omni.kit.property.material:$SCRIPT_DIR/kit/exts/omni.kit.notification_manager:$SCRIPT_DIR/kit/exts/omni.kit.window.audiorecorder:$SCRIPT_DIR/kit/exts/omni.kit.agent.watcher:$SCRIPT_DIR/kit/exts/omni.kit.property.file:$SCRIPT_DIR/kit/exts/omni.kit.multinode:$SCRIPT_DIR/kit/exts/omni.kit.embedded_script:$SCRIPT_DIR/kit/exts/omni.kit.capture:$SCRIPT_DIR/kit/extscore/omni.stats:$SCRIPT_DIR/kit/extscore/omni.kit.pipapi:$SCRIPT_DIR/kit/extscore/omni.timeline:$SCRIPT_DIR/kit/extscore/omni.kit.agent:$SCRIPT_DIR/kit/extscore/omni.hydra.ui:$SCRIPT_DIR/kit/extscore/omni.appwindow:$SCRIPT_DIR/kit/extscore/omni.usd.schema.physics:$SCRIPT_DIR/kit/extscore/omni.usd.libs:$SCRIPT_DIR/kit/extscore/omni.kit.test_app_compat:$SCRIPT_DIR/kit/extscore/omni.kit.registry.nucleus:$SCRIPT_DIR/kit/extscore/omni.ui_query:$SCRIPT_DIR/kit/extscore/omni.hydra.rtx:$SCRIPT_DIR/kit/extscore/omni.usd.schema.omnigraph:$SCRIPT_DIR/kit/extscore/omni.kit.loop-default:$SCRIPT_DIR/kit/extscore/omni.kit.uiapp:$SCRIPT_DIR/kit/extscore/omni.kit.autocapture:$SCRIPT_DIR/kit/extscore/omni.assets.plugins:$SCRIPT_DIR/kit/extscore/omni.kit.test:$SCRIPT_DIR/kit/extscore/omni.hydra.iray:$SCRIPT_DIR/kit/extscore/omni.usd:$SCRIPT_DIR/kit/extscore/omni.kit.core.tests:$SCRIPT_DIR/kit/extscore/omni.usd.schema.semantics:$SCRIPT_DIR/kit/extscore/omni.kit.profile_python:$SCRIPT_DIR/kit/extscore/omni.kit.ui_test:$SCRIPT_DIR/kit/extscore/omni.kit.menu.utils:$SCRIPT_DIR/kit/extscore/omni.client:$SCRIPT_DIR/kit/extscore/omni.mdl.neuraylib:$SCRIPT_DIR/kit/extscore/omni.kit.test_async_rendering:$SCRIPT_DIR/kit/extscore/omni.gpu_foundation:$SCRIPT_DIR/kit/extscore/omni.kit.extpath.git:$SCRIPT_DIR/kit/extscore/omni.hydra.engine.stats:$SCRIPT_DIR/kit/extscore/omni.kit.renderer.init:$SCRIPT_DIR/kit/extscore/omni.kit.test_helpers_gfx:$SCRIPT_DIR/kit/extscore/omni.ui:$SCRIPT_DIR/kit/extscore/omni.kit.livestream.core:$SCRIPT_DIR/kit/extscore/omni.kit.renderer.core:$SCRIPT_DIR/kit/extscore/omni.syntheticdata:$SCRIPT_DIR/kit/extscore/omni.usd.schema.audio:$SCRIPT_DIR/kit/extscore/omni.kit.app_snippets:$SCRIPT_DIR/kit/extscore/omni.hydra.pxr:$SCRIPT_DIR/kit/extscore/omni.hydra.scene_delegate:$SCRIPT_DIR/kit/extscore/omni.kit.splash:$SCRIPT_DIR/kit/extscore/omni.hydra.scene_api:$SCRIPT_DIR/kit/extscore/carb.windowing.plugins:$SCRIPT_DIR/kit/extscore/omni.kit.window.splash:$SCRIPT_DIR/kit/extscore/omni.kit.commands:$SCRIPT_DIR/kit/extscore/omni.kit.material.library:$SCRIPT_DIR/kit/extscore/omni.kit.streamsdk.plugins:$SCRIPT_DIR/kit/extscore/omni.kit.usd_undo:$SCRIPT_DIR/kit/extscore/omni.kit.window.privacy:$SCRIPT_DIR/kit/extscore/omni.kit.pip_archive:$SCRIPT_DIR/kit/extscore/omni.kit.menu.create:$SCRIPT_DIR/kit/extscore/omni.assets:$SCRIPT_DIR/kit/extscore/omni.kit.mainwindow:$SCRIPT_DIR/kit/extscore/omni.kit.console:$SCRIPT_DIR/kit/extscore/omni.usd.config:$SCRIPT_DIR/kit/extscore/omni.usd.schema.anim:$SCRIPT_DIR/kit/extscore/omni.kit.context_menu:$SCRIPT_DIR/kit/extscore/carb.audio:$SCRIPT_DIR/kit/extscore/omni.renderer-rtx:$SCRIPT_DIR/kit/extscore/omni.kit.window.viewport:$SCRIPT_DIR/kit/extscore/omni.kit.async_engine:$SCRIPT_DIR/kit/extscore/omni.kit.renderer.capture:$SCRIPT_DIR/kit/extscore/omni.ui.scene:$SCRIPT_DIR/kit/extscore/omni.mdl:$SCRIPT_DIR/kit/extscore/omni.kit.test_suite.helpers:$SCRIPT_DIR/kit/extensions/extensions-bundled:$SCRIPT_DIR/kit/plugins/bindings-python:$SCRIPT_DIR/kit/extscore/omni.kit.pip_archive/pip_prebundle:$SCRIPT_DIR/exts/omni.isaac.core_archive/pip_prebundle:$SCRIPT_DIR/exts/omni.isaac.ml_archive/pip_prebundle:$SCRIPT_DIR/exts/omni.kit.pip_torch-1_11_0-0.1.3+103.1.wx64.cp37/torch-1-11-0:$SCRIPT_DIR/exts/omni.kit.pip_torch-1_11_0-0.1.3+103.1.lx64.cp37/torch-1-11-0 diff --git a/omniisaacgymenvs/cfg/task/UR10Reacher.yaml b/omniisaacgymenvs/cfg/task/UR10Reacher.yaml new file mode 100644 index 0000000..4536187 --- /dev/null +++ b/omniisaacgymenvs/cfg/task/UR10Reacher.yaml @@ -0,0 +1,125 @@ +# used to create the object +name: UR10Reacher + +physics_engine: ${..physics_engine} + +# if given, will override the device setting in gym. +env: + numEnvs: ${resolve_default:512,${...num_envs}} + envSpacing: 3 + episodeLength: 600 + + clipObservations: 5.0 + clipActions: 1.0 + + useRelativeControl: False + dofSpeedScale: 20.0 + actionsMovingAverage: 0.1 + 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 + +sim: + dt: 0.0083 # 1/120 s + add_ground_plane: True + add_distant_light: True + use_gpu_pipeline: ${eq:${...pipeline},"gpu"} + use_flatcache: True + enable_scene_query_support: 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: 524288 + gpu_max_rigid_patch_count: 33554432 + gpu_found_lost_pairs_capacity: 19771 + gpu_found_lost_aggregate_pairs_capacity: 524288 + gpu_total_aggregate_pairs_capacity: 1048576 + 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 + + ur10: + # -1 to use default values + override_usd_defaults: False + fixed_base: False + enable_self_collisions: False + object: + # -1 to use default values + override_usd_defaults: False + fixed_base: 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 + fixed_base: 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 +safety: # Reduce joint limits during both training & testing + enabled: False diff --git a/omniisaacgymenvs/cfg/train/UR10ReacherPPO.yaml b/omniisaacgymenvs/cfg/train/UR10ReacherPPO.yaml new file mode 100644 index 0000000..0dc66a3 --- /dev/null +++ b/omniisaacgymenvs/cfg/train/UR10ReacherPPO.yaml @@ -0,0 +1,78 @@ +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:UR10Reacher,${....experiment}} + full_experiment_name: ${.name} + device: ${....rl_device} + device_name: ${....rl_device} + env_name: rlgpu + multi_gpu: False + 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.008 + 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_len: 4 + bounds_loss_coef: 0.0001 + + player: + deterministic: True + games_num: 100000 + print_stats: True diff --git a/omniisaacgymenvs/demos/ur10_reacher.py b/omniisaacgymenvs/demos/ur10_reacher.py new file mode 100644 index 0000000..a6327c9 --- /dev/null +++ b/omniisaacgymenvs/demos/ur10_reacher.py @@ -0,0 +1,170 @@ +# Copyright (c) 2018-2022, NVIDIA Corporation +# 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. + +from omniisaacgymenvs.tasks.ur10_reacher import UR10ReacherTask + +from omni.isaac.core.utils.torch.rotations import * + +import torch + +import omni +import carb + + +class UR10ReacherDemo(UR10ReacherTask): + 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 + UR10ReacherTask.__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 = omni.kit.viewport_legacy.get_default_viewport_window() + # Create camera + self.camera_path = "/World/Camera" + self.perspective_path = "/OmniverseKit_Persp" + camera_prim = stage.DefinePrim(self.camera_path, "Camera") + self.view_port.set_active_camera(self.camera_path) + camera_prim.GetAttribute("focalLength").Set(8.5) + 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) + else: + 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 UR10") + + 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 + + self.view_port.set_camera_position(self.camera_path, camera_pos[0], camera_pos[1], camera_pos[2], True) + self.view_port.set_camera_target(self.camera_path, base_pos[0], base_pos[1], base_pos[2]+0.6, 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 ur10 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/ur10.py b/omniisaacgymenvs/robots/articulations/ur10.py new file mode 100644 index 0000000..14e8946 --- /dev/null +++ b/omniisaacgymenvs/robots/articulations/ur10.py @@ -0,0 +1,69 @@ +# Copyright (c) 2018-2022, NVIDIA Corporation +# 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. + + +from typing import Optional +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 + +import carb + +class UR10(Robot): + def __init__( + self, + prim_path: str, + name: Optional[str] = "UR10", + 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._usd_path = "omniverse://localhost/Projects/J3soon/Isaac/2022.1/Isaac/Robots/UR10/ur10_instanceable.usd" + + # Depends on your real robot setup + 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/ur10_view.py b/omniisaacgymenvs/robots/articulations/views/ur10_view.py new file mode 100644 index 0000000..9fb53a4 --- /dev/null +++ b/omniisaacgymenvs/robots/articulations/views/ur10_view.py @@ -0,0 +1,54 @@ +# Copyright (c) 2018-2022, NVIDIA Corporation +# 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. + + +from typing import Optional + +from omni.isaac.core.articulations import ArticulationView +from omni.isaac.core.prims import RigidPrimView + +import torch + +class UR10View(ArticulationView): + def __init__( + self, + prim_paths_expr: str, + name: Optional[str] = "UR10View", + ) -> 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="/World/envs/.*/ur10/ee_link", 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_ur10_policy.py b/omniisaacgymenvs/scripts/dummy_ur10_policy.py new file mode 100644 index 0000000..ea37d9a --- /dev/null +++ b/omniisaacgymenvs/scripts/dummy_ur10_policy.py @@ -0,0 +1,74 @@ +# Copyright (c) 2018-2022, NVIDIA Corporation +# 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. + + +import numpy as np +import torch +import hydra +from omegaconf import DictConfig + +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 +from omniisaacgymenvs.envs.vec_env_rlgames import VecEnvRLGames + +@hydra.main(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 + + env = VecEnvRLGames(headless=headless) + 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/sim2real/ur10.py b/omniisaacgymenvs/sim2real/ur10.py new file mode 100644 index 0000000..0597aa6 --- /dev/null +++ b/omniisaacgymenvs/sim2real/ur10.py @@ -0,0 +1,165 @@ +import asyncio +import math + +import numpy as np + +try: + import rospy + # Ref: https://github.com/ros-controls/ros_controllers/blob/melodic-devel/rqt_joint_trajectory_controller/src/rqt_joint_trajectory_controller/joint_trajectory_controller.py + from control_msgs.msg import JointTrajectoryControllerState + from trajectory_msgs.msg import JointTrajectory, JointTrajectoryPoint +except ImportError: + rospy = None + +class RealWorldUR10(): + # Defined in ur10.usd + sim_dof_angle_limits = [ + (-360, 360, False), + (-360, 360, False), + (-360, 360, False), + (-360, 360, False), + (-360, 360, False), + (-360, 360, False), + ] # _sim_dof_limits[:,2] == True indicates inversed joint angle compared to real + + # Ref: https://github.com/ros-industrial/universal_robot/issues/112 + pi = math.pi + servo_angle_limits = [ + (-2*pi, 2*pi), + (-2*pi, 2*pi), + (-2*pi, 2*pi), + (-2*pi, 2*pi), + (-2*pi, 2*pi), + (-2*pi, 2*pi), + ] + # ROS-related strings + state_topic = '/scaled_pos_joint_traj_controller/state' + cmd_topic = '/scaled_pos_joint_traj_controller/command' + joint_names = [ + 'elbow_joint', + 'shoulder_lift_joint', + 'shoulder_pan_joint', + 'wrist_1_joint', + 'wrist_2_joint', + 'wrist_3_joint' + ] + # Joint name mapping to simulation action index + joint_name_to_idx = { + 'elbow_joint': 2, + 'shoulder_lift_joint': 1, + 'shoulder_pan_joint': 0, + 'wrist_1_joint': 3, + 'wrist_2_joint': 4, + 'wrist_3_joint': 5 + } + def __init__(self, fail_quietely=False, verbose=False) -> None: + print("Connecting to real-world UR10") + self.fail_quietely = fail_quietely + self.verbose = verbose + self.pub_freq = 10 # Hz + # Not really sure if current_pos and target_pos require mutex here. + self.current_pos = None + self.target_pos = None + if rospy is None: + if not self.fail_quietely: + raise ValueError("ROS is not installed!") + print("ROS is not installed!") + return + try: + rospy.init_node("custom_controller", anonymous=True, disable_signals=True, log_level=rospy.ERROR) + except rospy.exceptions.ROSException as e: + print("Node has already been initialized, do nothing") + if self.verbose: + print("Receiving real-world UR10 joint angles...") + print("If you didn't see any outputs, you may have set up UR5 or ROS incorrectly.") + self.sub = rospy.Subscriber( + self.state_topic, + JointTrajectoryControllerState, + self.sub_callback, + queue_size=1 + ) + self.pub = rospy.Publisher( + self.cmd_topic, + JointTrajectory, + queue_size=1 + ) + # self.min_traj_dur = 5.0 / self.pub_freq # Minimum trajectory duration + self.min_traj_dur = 0 # Minimum trajectory duration + + # For catching exceptions in asyncio + def custom_exception_handler(loop, context): + print(context) + # Ref: https://docs.python.org/3/library/asyncio-eventloop.html#asyncio.loop.set_exception_handler + asyncio.get_event_loop().set_exception_handler(custom_exception_handler) + # Ref: https://docs.omniverse.nvidia.com/app_isaacsim/app_isaacsim/tutorial_ros_custom_message.html + asyncio.ensure_future(self.pub_task()) + + def sub_callback(self, msg): + # msg has type: JointTrajectoryControllerState + actual_pos = {} + for i in range(len(msg.joint_names)): + joint_name = msg.joint_names[i] + joint_pos = msg.actual.positions[i] + actual_pos[joint_name] = joint_pos + self.current_pos = actual_pos + if self.verbose: + print(f'(sub) {actual_pos}') + + async def pub_task(self): + while not rospy.is_shutdown(): + await asyncio.sleep(1.0 / self.pub_freq) + if self.current_pos is None: + # Not ready (recieved UR state) yet + continue + if self.target_pos is None: + # No command yet + continue + # Construct message + dur = [] # move duration of each joints + traj = JointTrajectory() + traj.joint_names = self.joint_names + point = JointTrajectoryPoint() + moving_average = 1 + for name in traj.joint_names: + pos = self.current_pos[name] + cmd = pos * (1-moving_average) + self.target_pos[self.joint_name_to_idx[name]] * moving_average + max_vel = 3.15 # from ur5.urdf (or ur5.urdf.xacro) + duration = abs(cmd - pos) / max_vel # time = distance / velocity + dur.append(max(duration, self.min_traj_dur)) + point.positions.append(cmd) + point.time_from_start = rospy.Duration(max(dur)) + traj.points.append(point) + self.pub.publish(traj) + print(f'(pub) {point.positions}') + + def send_joint_pos(self, joint_pos): + if len(joint_pos) != 6: + raise Exception("The length of UR10 joint_pos is {}, but should be 6!".format(len(joint_pos))) + + # Convert Sim angles to Real angles + target_pos = [0] * 6 + for i, pos in enumerate(joint_pos): + if i == 5: + # Ignore the gripper joints for Reacher task + continue + # Map [L, U] to [A, B] + L, U, inversed = self.sim_dof_angle_limits[i] + A, B = self.servo_angle_limits[i] + angle = np.rad2deg(float(pos)) + if not L <= angle <= U: + print("The {}-th simulation joint angle ({}) is out of range! Should be in [{}, {}]".format(i, angle, L, U)) + angle = np.clip(angle, L, U) + target_pos[i] = (angle - L) * ((B-A)/(U-L)) + A # Map [L, U] to [A, B] + if inversed: + target_pos[i] = (B-A) - (target_pos[i] - A) + A # Map [A, B] to [B, A] + if not A <= target_pos[i] <= B: + raise Exception("(Should Not Happen) The {}-th real world joint angle ({}) is out of range! hould be in [{}, {}]".format(i, target_pos[i], A, B)) + self.target_pos = target_pos + +if __name__ == "__main__": + print("Make sure you are running `roslaunch ur_robot_driver`.") + print("If the machine running Isaac is not the ROS master node, " + \ + "make sure you have set the environment variables: " + \ + "`ROS_MASTER_URI` and `ROS_HOSTNAME`/`ROS_IP` correctly.") + ur10 = RealWorldUR10(verbose=True) + rospy.spin() diff --git a/omniisaacgymenvs/tasks/shared/reacher.py b/omniisaacgymenvs/tasks/shared/reacher.py new file mode 100644 index 0000000..7a3ad49 --- /dev/null +++ b/omniisaacgymenvs/tasks/shared/reacher.py @@ -0,0 +1,386 @@ +# Copyright (c) 2018-2022, NVIDIA Corporation +# 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. + + +from abc import abstractmethod + +from omniisaacgymenvs.tasks.base.rl_task import RLTask +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 get_current_stage, add_reference_to_stage +from omni.isaac.core.utils.torch import * +# `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 + +import numpy as np +import torch + + +class ReacherTask(RLTask): + def __init__( + self, + name: str, + env: VecEnvBase, + offset=None + ) -> None: + """[summary] + """ + 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) + + 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)) + + # Indicates which environments should be reset + 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 + return + + def set_up_scene(self, scene: Scene) -> None: + self._stage = get_current_stage() + self._assets_root_path = 'omniverse://localhost/Projects/J3soon/Isaac/2022.1' + self.get_arm() + 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, + ) + scene.add(self._objects) + self._goals = RigidPrimView( + prim_paths_expr="/World/envs/env_.*/goal/object", + name="goal_view", + reset_xform_properties=False, + ) + 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_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.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_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.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.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): + 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.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, 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/tasks/ur10_reacher.py b/omniisaacgymenvs/tasks/ur10_reacher.py new file mode 100644 index 0000000..6fe7441 --- /dev/null +++ b/omniisaacgymenvs/tasks/ur10_reacher.py @@ -0,0 +1,185 @@ +# Copyright (c) 2018-2022, NVIDIA Corporation +# 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. + + +from omniisaacgymenvs.sim2real.ur10 import RealWorldUR10 +from omniisaacgymenvs.utils.config_utils.sim_config import SimConfig +from omniisaacgymenvs.tasks.shared.reacher import ReacherTask +from omniisaacgymenvs.robots.articulations.views.ur10_view import UR10View +from omniisaacgymenvs.robots.articulations.ur10 import UR10 + +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 + +import numpy as np +import torch +import math + + +class UR10ReacherTask(ReacherTask): + def __init__( + self, + name: str, + sim_config: SimConfig, + env: VecEnvBase, + offset=None + ) -> None: + 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: UR10 joints position (action space) + # 6: UR10 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 + if self._task_cfg['safety']['enabled']: + # Depends on your real robot setup + self._dof_limits = torch.tensor([[ + [np.deg2rad(-135), np.deg2rad(135)], + [np.deg2rad(-180), np.deg2rad(-60)], + [np.deg2rad(0), np.deg2rad(180)], + [np.deg2rad(-180), np.deg2rad(0)], + [np.deg2rad(-180), np.deg2rad(0)], + [np.deg2rad(-180), np.deg2rad(180)], + ]], dtype=torch.float32, device=self._cfg["sim_device"]) + else: + # For actions + self._dof_limits = torch.tensor([[ + [-2*pi, 2*pi], # [-2*pi, 2*pi], + [-pi + pi/8, 0 - pi/8], # [-2*pi, 2*pi], + [-pi + pi/8, pi - pi/8], # [-2*pi, 2*pi], + [-pi, 0], # [-2*pi, 2*pi], + [-pi, pi], # [-2*pi, 2*pi], + [-2*pi, 2*pi], # [-2*pi, 2*pi], + ]], dtype=torch.float32, device=self._cfg["sim_device"]) + # The last action space cannot be [0, 0] + # It will introduce the following error: + # ValueError: Expected parameter loc (Tensor of shape (2048, 6)) of distribution Normal(loc: torch.Size([2048, 6]), scale: torch.Size([2048, 6])) to satisfy the constraint Real(), but found invalid values + + ReacherTask.__init__(self, name=name, env=env) + + # Setup Sim2Real + sim2real_config = self._task_cfg['sim2real'] + if sim2real_config['enabled'] and self.test and self.num_envs == 1: + self.act_moving_average /= 5 # Reduce moving speed + self.real_world_ur10 = RealWorldUR10( + sim2real_config['fail_quietely'], + sim2real_config['verbose'] + ) + return + + def get_num_dof(self): + return self._arms.num_dof + + def get_arm(self): + ur10 = UR10(prim_path=self.default_zero_env_path + "/ur10", name="UR10") + self._sim_config.apply_articulation_settings( + "ur10", + get_prim_at_path(ur10.prim_path), + self._sim_config.parse_actor_config("ur10"), + ) + + def get_arm_view(self, scene): + arm_view = UR10View(prim_paths_expr="/World/envs/.*/ur10", name="ur10_view") + scene.add(arm_view._end_effectors) + return arm_view + + def get_object_displacement_tensor(self): + return torch.tensor([0.0, 0.05, 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) + if self._task_cfg['sim2real']['enabled'] and self.test and self.num_envs == 1: + # Depends on your real robot setup + new_pos[:, 0] = torch.abs(new_pos[:, 0] * 0.1) + 0.35 + new_pos[:, 1] = torch.abs(new_pos[:, 1] * 0.1) + 0.35 + new_pos[:, 2] = torch.abs(new_pos[:, 2] * 0.5) + 0.3 + else: + new_pos[:, 0] = new_pos[:, 0] * 0.4 + 0.5 * torch.sign(new_pos[:, 0]) + new_pos[:, 1] = new_pos[:, 1] * 0.4 + 0.5 * torch.sign(new_pos[:, 1]) + new_pos[:, 2] = torch.abs(new_pos[:, 2] * 0.8) + 0.1 + if self._task_cfg['safety']['enabled']: + new_pos[:, 0] = torch.abs(new_pos[:, 0]) / 1.25 + new_pos[:, 1] = torch.abs(new_pos[:, 1]) / 1.25 + 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_ur10.send_joint_pos(joint_pos) diff --git a/omniisaacgymenvs/utils/demo_util.py b/omniisaacgymenvs/utils/demo_util.py index 55cf0d8..f0a5549 100644 --- a/omniisaacgymenvs/utils/demo_util.py +++ b/omniisaacgymenvs/utils/demo_util.py @@ -29,10 +29,12 @@ def initialize_demo(config, env, init_sim=True): from omniisaacgymenvs.demos.anymal_terrain import AnymalTerrainDemo - + from omniisaacgymenvs.demos.ur10_reacher import UR10ReacherDemo + # Mappings from strings to environments task_map = { "AnymalTerrain": AnymalTerrainDemo, + "UR10Reacher": UR10ReacherDemo, } from omniisaacgymenvs.utils.config_utils.sim_config import SimConfig diff --git a/omniisaacgymenvs/utils/task_util.py b/omniisaacgymenvs/utils/task_util.py index 5d18bf0..bea5acd 100644 --- a/omniisaacgymenvs/utils/task_util.py +++ b/omniisaacgymenvs/utils/task_util.py @@ -40,7 +40,8 @@ def initialize_task(config, env, init_sim=True): from omniisaacgymenvs.tasks.quadcopter import QuadcopterTask from omniisaacgymenvs.tasks.shadow_hand import ShadowHandTask from omniisaacgymenvs.tasks.crazyflie import CrazyflieTask - + from omniisaacgymenvs.tasks.ur10_reacher import UR10ReacherTask + # Mappings from strings to environments task_map = { "AllegroHand": AllegroHandTask, @@ -57,6 +58,7 @@ def initialize_task(config, env, init_sim=True): "ShadowHand": ShadowHandTask, "ShadowHandOpenAI_FF": ShadowHandTask, "ShadowHandOpenAI_LSTM": ShadowHandTask, + "UR10Reacher": UR10ReacherTask, } from .config_utils.sim_config import SimConfig diff --git a/omniisaacgymenvs/utils/usd_utils/create_instanceable_ur10.py b/omniisaacgymenvs/utils/usd_utils/create_instanceable_ur10.py new file mode 100644 index 0000000..badfe2c --- /dev/null +++ b/omniisaacgymenvs/utils/usd_utils/create_instanceable_ur10.py @@ -0,0 +1,138 @@ +# Copyright (c) 2018-2022, NVIDIA Corporation +# 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. + + +import omni.usd +import omni.client + +from pxr import UsdGeom, Sdf, UsdPhysics, UsdShade + + +# Note: this script should be executed in Isaac Sim `Script Editor` window + +def create_ur10(asset_dir_usd_path, ur10_dir_usd_path): + # Duplicate UR10 folder + omni.client.copy(asset_dir_usd_path, ur10_dir_usd_path) + +def create_ur10_mesh(asset_usd_path, ur10_mesh_usd_path): + # Create ur10_mesh.usd file + omni.client.copy(asset_usd_path, ur10_mesh_usd_path) + omni.usd.get_context().open_stage(ur10_mesh_usd_path) + stage = omni.usd.get_context().get_stage() + edits = Sdf.BatchNamespaceEdit() + # Create parent Xforms + reparent_tasks = [ + # base_link + ['/ur10/base_link/cylinder', 'geoms_xform'], + ['/ur10/base_link/ur10_base', 'geoms_xform'], + # shoulder_link + ['/ur10/shoulder_link/cylinder', 'geoms_xform'], + ['/ur10/shoulder_link/cylinder_0', 'geoms_xform'], + ['/ur10/shoulder_link/ur10_shoulder', 'geoms_xform'], + # upper_arm_link + ['/ur10/upper_arm_link/cylinder', 'geoms_xform'], + ['/ur10/upper_arm_link/cylinder_0', 'geoms_xform'], + ['/ur10/upper_arm_link/cylinder_1', 'geoms_xform'], + ['/ur10/upper_arm_link/ur10_upper_arm', 'geoms_xform'], + # forearm_link + ['/ur10/forearm_link/cylinder', 'geoms_xform'], + ['/ur10/forearm_link/cylinder_0', 'geoms_xform'], + ['/ur10/forearm_link/cylinder_1', 'geoms_xform'], + ['/ur10/forearm_link/ur10_forearm', 'geoms_xform'], + # wrist_1_link + ['/ur10/wrist_1_link/cylinder', 'geoms_xform'], + ['/ur10/wrist_1_link/cylinder_0', 'geoms_xform'], + ['/ur10/wrist_1_link/ur10_wrist_1', 'geoms_xform'], + # wrist_2_link + ['/ur10/wrist_2_link/cylinder', 'geoms_xform'], + ['/ur10/wrist_2_link/cylinder_0', 'geoms_xform'], + ['/ur10/wrist_2_link/ur10_wrist_2', 'geoms_xform'], + # wrist_3_link + ['/ur10/wrist_3_link/cylinder', 'geoms_xform'], + ['/ur10/wrist_3_link/ur10_wrist_3', 'geoms_xform'], + ] # [prim_path, parent_xform_name] + for task in reparent_tasks: + prim_path, parent_xform_name = task + old_parent_path = '/'.join(prim_path.split('/')[:-1]) + new_parent_path = f'{old_parent_path}/{parent_xform_name}' + UsdGeom.Xform.Define(stage, new_parent_path) + edits.Add(Sdf.NamespaceEdit.Reparent(prim_path, new_parent_path, -1)) + stage.GetRootLayer().Apply(edits) + # Save to file + omni.usd.get_context().save_stage() + +def create_ur10_instanceable(ur10_mesh_usd_path, ur10_instanceable_usd_path): + omni.client.copy(ur10_mesh_usd_path, ur10_instanceable_usd_path) + omni.usd.get_context().open_stage(ur10_instanceable_usd_path) + stage = omni.usd.get_context().get_stage() + # Set up references and instanceables + for prim in stage.Traverse(): + if prim.GetTypeName() != 'Xform': + continue + # Add reference to visuals_xform, collisions_xform, geoms_xform, and make them instanceable + path = str(prim.GetPath()) + if path.endswith('visuals_xform') or path.endswith('collisions_xform') or path.endswith('geoms_xform'): + ref = prim.GetReferences() + ref.ClearReferences() + ref.AddReference('./ur10_mesh.usd', path) + prim.SetInstanceable(True) + # Save to file + omni.usd.get_context().save_stage() + +def create_block_indicator(): + asset_usd_path = 'omniverse://localhost/NVIDIA/Assets/Isaac/2022.1/Isaac/Props/Blocks/block.usd' + block_usd_path = 'omniverse://localhost/Projects/J3soon/Isaac/2022.1/Isaac/Props/Blocks/block.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() + + asset_usd_path = 'omniverse://localhost/NVIDIA/Assets/Isaac/2022.1/Isaac/Props/Blocks/block_instanceable.usd' + block_usd_path = 'omniverse://localhost/Projects/J3soon/Isaac/2022.1/Isaac/Props/Blocks/block_instanceable.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__': + asset_dir_usd_path = 'omniverse://localhost/NVIDIA/Assets/Isaac/2022.1/Isaac/Robots/UR10' + ur10_dir_usd_path = 'omniverse://localhost/Projects/J3soon/Isaac/2022.1/Isaac/Robots/UR10' + ur10_usd_path = 'omniverse://localhost/Projects/J3soon/Isaac/2022.1/Isaac/Robots/UR10/ur10.usd' + ur10_mesh_usd_path = 'omniverse://localhost/Projects/J3soon/Isaac/2022.1/Isaac/Robots/UR10/ur10_mesh.usd' + ur10_instanceable_usd_path = 'omniverse://localhost/Projects/J3soon/Isaac/2022.1/Isaac/Robots/UR10/ur10_instanceable.usd' + create_ur10(asset_dir_usd_path, ur10_dir_usd_path) + create_ur10_mesh(ur10_usd_path, ur10_mesh_usd_path) + create_ur10_instanceable(ur10_mesh_usd_path, ur10_instanceable_usd_path) + create_block_indicator() + print("Done!")