Orbit 使用指南06 | 创建基础环境 | Isaac Sim | Omniverse

如是我闻:
环境将模拟的不同方面如场景、观测和行动空间、重置事件等汇集在一起,为各种应用创建一个连贯的接口。在Orbit中,环境是作为envs.BaseEnvenvs.RLTaskEnv类实现的。这两个类非常相似,但envs.RLTaskEnv对强化学习任务很有用,包含奖励、终止条件、课程和命令生成。envs.BaseEnv类对传统的机器人控制很有用,并且不包含奖励和终止条件。

在这个指南中,我们将看看基类envs.BaseEnv及其对应的配置类envs.BaseEnvCfg。我们将使用之前的车杆环境来说明创建一个新的envs.BaseEnv环境的不同组件。

指南06对应于orbit/source/standalone/tutorials/03_envs目录下的create_cartpole_base_env.py 脚本,让我们先搂一眼完整的代码

# Copyright (c) 2022-2024, The ORBIT Project Developers.
# All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause"""
This script demonstrates how to create a simple environment with a cartpole. It combines the concepts of
scene, action, observation and event managers to create an environment.
"""from __future__ import annotations"""Launch Isaac Sim Simulator first."""import argparsefrom omni.isaac.orbit.app import AppLauncher# add argparse arguments
parser = argparse.ArgumentParser(description="Tutorial on creating a cartpole base environment.")
parser.add_argument("--num_envs", type=int, default=16, help="Number of environments to spawn.")# append AppLauncher cli args
AppLauncher.add_app_launcher_args(parser)
# parse the arguments
args_cli = parser.parse_args()# launch omniverse app
app_launcher = AppLauncher(args_cli)
simulation_app = app_launcher.app"""Rest everything follows."""import math
import torchimport omni.isaac.orbit.envs.mdp as mdp
from omni.isaac.orbit.envs import BaseEnv, BaseEnvCfg
from omni.isaac.orbit.managers import EventTermCfg as EventTerm
from omni.isaac.orbit.managers import ObservationGroupCfg as ObsGroup
from omni.isaac.orbit.managers import ObservationTermCfg as ObsTerm
from omni.isaac.orbit.managers import SceneEntityCfg
from omni.isaac.orbit.utils import configclassfrom omni.isaac.orbit_tasks.classic.cartpole.cartpole_env_cfg import CartpoleSceneCfg@configclass
class ActionsCfg:"""Action specifications for the environment."""joint_efforts = mdp.JointEffortActionCfg(asset_name="robot", joint_names=["slider_to_cart"], scale=5.0)@configclass
class ObservationsCfg:"""Observation specifications for the environment."""@configclassclass PolicyCfg(ObsGroup):"""Observations for policy group."""# observation terms (order preserved)joint_pos_rel = ObsTerm(func=mdp.joint_pos_rel)joint_vel_rel = ObsTerm(func=mdp.joint_vel_rel)def __post_init__(self) -> None:self.enable_corruption = Falseself.concatenate_terms = True# observation groupspolicy: PolicyCfg = PolicyCfg()@configclass
class EventCfg:"""Configuration for events."""# on startupadd_pole_mass = EventTerm(func=mdp.add_body_mass,mode="startup",params={"asset_cfg": SceneEntityCfg("robot", body_names=["pole"]),"mass_range": (0.1, 0.5),},)# on resetreset_cart_position = EventTerm(func=mdp.reset_joints_by_offset,mode="reset",params={"asset_cfg": SceneEntityCfg("robot", joint_names=["slider_to_cart"]),"position_range": (-1.0, 1.0),"velocity_range": (-0.1, 0.1),},)reset_pole_position = EventTerm(func=mdp.reset_joints_by_offset,mode="reset",params={"asset_cfg": SceneEntityCfg("robot", joint_names=["cart_to_pole"]),"position_range": (-0.125 * math.pi, 0.125 * math.pi),"velocity_range": (-0.01 * math.pi, 0.01 * math.pi),},)@configclass
class CartpoleEnvCfg(BaseEnvCfg):"""Configuration for the cartpole environment."""# Scene settingsscene = CartpoleSceneCfg(num_envs=1024, env_spacing=2.5)# Basic settingsobservations = ObservationsCfg()actions = ActionsCfg()events = EventCfg()def __post_init__(self):"""Post initialization."""# viewer settingsself.viewer.eye = [4.5, 0.0, 6.0]self.viewer.lookat = [0.0, 0.0, 2.0]# step settingsself.decimation = 4  # env step every 4 sim steps: 200Hz / 4 = 50Hz# simulation settingsself.sim.dt = 0.005  # sim step every 5ms: 200Hzdef main():"""Main function."""# parse the argumentsenv_cfg = CartpoleEnvCfg()env_cfg.scene.num_envs = args_cli.num_envs# setup base environmentenv = BaseEnv(cfg=env_cfg)# simulate physicscount = 0while simulation_app.is_running():with torch.inference_mode():# resetif count % 300 == 0:count = 0env.reset()print("-" * 80)print("[INFO]: Resetting environment...")# sample random actionsjoint_efforts = torch.randn_like(env.action_manager.action)# step the environmentobs, _ = env.step(joint_efforts)# print current orientation of poleprint("[Env 0]: Pole joint: ", obs["policy"][0][1].item())# update countercount += 1# close the environmentenv.close()if __name__ == "__main__":# run the main functionmain()# close sim appsimulation_app.close()

代码解析

基础类envs.BaseEnv围绕模拟交互的许多复杂性提供了一个简单的接口,供用户运行模拟并与之交互。它由以下组件组成:

  • scene.InteractiveScene - 用于模拟的场景。
  • managers.ActionManager - 处理行动的管理器。
  • managers.ObservationManager - 处理观察的管理器。
  • managers.EventManager - 在指定的模拟事件上安排操作(如域随机化)的管理器。例如,在启动时、重置时或周期性间隔时。

通过配置这些组件,用户可以用不费力气的创建相同环境的不同变体。在本指南中,我们将通过envs.BaseEnv类的不同组件以及如何配置它们来创建一个新环境。

设计场景

创建新环境的第一步是配置其场景。对于车杆环境,我们将使用前一个指南中的场景。因此,我们这里省略场景配置。有关如何配置场景的更多详情,请参见Orbit 使用指南 05

定义动作空间

在前一个指南中,我们直接使用assets.Articulation.set_joint_effort_target()方法将动作输入给车杆。在这个指南中,我们将使用managers.ActionManager来处理动作。

动作管理器可以包括多个managers.ActionTerm。每个动作项(action term)负责对环境的特定方面施加控制。例如,对于机器人手臂,我们可以有两个动作项——一个用于控制手臂的关节,另一个用于控制夹持器。这种组合允许用户为环境的不同方面定义不同的控制方案。

在车杆环境中,我们想要控制施加在小车上的力以平衡杆。因此,我们将创建一个控制施加在小车上的力的动作项。

@configclass
class ActionsCfg:"""Action specifications for the environment."""joint_efforts = mdp.JointEffortActionCfg(asset_name="robot", joint_names=["slider_to_cart"], scale=5.0)

定义观察空间

虽然场景定义了环境的状态,但观察定义了代理( agent)可观察到的状态。这些观察被代理用来决定采取什么行动。在Orbit中,观察由managers.ObservationManager类计算。

与动作管理器类似,观察管理器可以包括多个观察项。这些观察项进一步分组成观察组,用于为环境定义不同的观察空间。例如,对于层次控制,我们可能想要定义两个观察组——一个用于低级控制器,另一个用于高级控制器。这里假设了同一组中的所有观察项具有相同的维度。

对于本指南,我们将只定义一个名为"policy"的观察组。虽然不完全是规定性的,这个组是Orbit中各种包装器的必要要求。我们通过继承managers.ObservationGroupCfg类来定义一个组。这个类收集不同的观察项,并帮助为组定义共同属性,如启用噪声污染或将观察合并成一个单一的张量。

单个项通过继承managers.ObservationTermCfg类来定义。这个类接受managers.ObservationTermCfg.func,它指定计算该项观察的函数或可调用类。它包括其他参数用于定义噪声模型、剪裁、缩放等。然而,对于这个指南,我们将这些参数保留为默认值。

@configclass
class ObservationsCfg:"""Observation specifications for the environment."""@configclassclass PolicyCfg(ObsGroup):"""Observations for policy group."""# observation terms (order preserved)joint_pos_rel = ObsTerm(func=mdp.joint_pos_rel)joint_vel_rel = ObsTerm(func=mdp.joint_vel_rel)def __post_init__(self) -> None:self.enable_corruption = Falseself.concatenate_terms = True# observation groupspolicy: PolicyCfg = PolicyCfg()

定义模拟事件

此时,我们已为车杆环境定义了场景、行动和观测。所有这些组件的一般思路是定义配置类,然后将它们传递给相应的管理器。 事件管理器也不例外。

managers.EventManager类负责与模拟状态变化相对应的事件。这包括重置(或随机化)场景、随机化物理属性(如质量、摩擦等)和变化视觉属性(如颜色、纹理等)。每个事件都通过managers.EventTermCfg类指定,该类接受managers.EventTermCfg.func,它指定执行事件的函数或可调用类。

此外,它期望事件的模式。模式指定应用事件项的时机。可以指定自己的模式。为此,您需要适应BaseEnv类。然而,Orbit开箱即用提供了三种常用模式:

  • "startup" - 环境启动时只发生一次的事件。
  • "reset" - 环境终止和重置时发生的事件。
  • "interval" - 在给定间隔执行的事件,即,在一定数量的步骤后定期执行。

在这个示例中,我们定义了在启动时随机化杆的质量的事件。由于这个操作的代价很昂贵,我们不想在每次重置时都进行,所以这个操作只做一次。我们还创建了一个事件,在每次重置时随机化车杆和杆的初始关节状态。

@configclass
class EventCfg:"""Configuration for events."""# on startupadd_pole_mass = EventTerm(func=mdp.add_body_mass,mode="startup",params={"asset_cfg": SceneEntityCfg("robot", body_names=["pole"]),"mass_range": (0.1, 0.5),},)# on resetreset_cart_position = EventTerm(func=mdp.reset_joints_by_offset,mode="reset",params={"asset_cfg": SceneEntityCfg("robot", joint_names=["slider_to_cart"]),"position_range": (-1.0, 1.0),"velocity_range": (-0.1, 0.1),},)reset_pole_position = EventTerm(func=mdp.reset_joints_by_offset,mode="reset",params={"asset_cfg": SceneEntityCfg("robot", joint_names=["cart_to_pole"]),"position_range": (-0.125 * math.pi, 0.125 * math.pi),"velocity_range": (-0.01 * math.pi, 0.01 * math.pi),},)

将所有内容整合在一起

定义了场景和管理器配置后,我们现在可以通过envs.BaseEnvCfg类定义环境配置。这个类接受场景、行动、观察和事件配置。

除此之外,它还接受envs.BaseEnvCfg.sim,它定义了诸如时间步、重力等模拟参数。这被初始化为默认值,但可以根据需要进行修改。我们推荐通过在envs.BaseEnvCfg类中定义__post_init__()方法来进行修改,该方法在配置初始化后被调用。

大家都要是来这训练机器人的,谁要在这种关键的地方看车杆的例子阿 5555555555555555555555

@configclass
class CartpoleEnvCfg(BaseEnvCfg):"""Configuration for the cartpole environment."""# Scene settingsscene = CartpoleSceneCfg(num_envs=1024, env_spacing=2.5)# Basic settingsobservations = ObservationsCfg()actions = ActionsCfg()events = EventCfg()def __post_init__(self):"""Post initialization."""# viewer settingsself.viewer.eye = [4.5, 0.0, 6.0]self.viewer.lookat = [0.0, 0.0, 2.0]# step settingsself.decimation = 4  # env step every 4 sim steps: 200Hz / 4 = 50Hz# simulation settingsself.sim.dt = 0.005  # sim step every 5ms: 200Hz

运行模拟

最后,我们回顾模拟执行循环。现在这变得更简单了,因为我们已经将大部分细节抽象到环境配置中。我们只需要调用envs.BaseEnv.reset()方法来重置环境和envs.BaseEnv.step()方法来步进环境。这两个函数都返回观测值和可能包含环境提供的额外信息的info字典。这些可以被代理用于决策。

envs.BaseEnv类没有任何关于终止的概念,因为那是特定于情节任务的概念。因此,用户负责为环境定义终止条件。在这个教程中,我们在规律的间隔内重置模拟。

def main():"""Main function."""# parse the argumentsenv_cfg = CartpoleEnvCfg()env_cfg.scene.num_envs = args_cli.num_envs# setup base environmentenv = BaseEnv(cfg=env_cfg)# simulate physicscount = 0while simulation_app.is_running():with torch.inference_mode():# resetif count % 300 == 0:count = 0env.reset()print("-" * 80)print("[INFO]: Resetting environment...")# sample random actionsjoint_efforts = torch.randn_like(env.action_manager.action)# step the environmentobs, _ = env.step(joint_efforts)# print current orientation of poleprint("[Env 0]: Pole joint: ", obs["policy"][0][1].item())# update countercount += 1# close the environmentenv.close()

需要注意的一点是,整个模拟循环都包裹在torch.inference_mode()上下文管理器内。这是因为环境在底层使用了PyTorch操作,我们希望确保模拟不会因为PyTorch自动微分引擎的开销而变慢,并且不会为模拟操作计算梯度。

代码运行

要运行本教程中制作的基础环境,可以使用以下命令:

./orbit.sh -p source/standalone/tutorials/03_envs/create_cartpole_base_env.py --num_envs 32

在这里插入图片描述

这应该会打开一个包含地面平面、光源和车杆的展台。模拟应该在车杆上播放随机动作。此外,它在屏幕右下角打开一个名为"Orbit"的UI窗口。这个窗口包含了可以用于调试和可视化的不同UI元素。

要停止模拟,可以关闭窗口,或在启动模拟的终端中按Ctrl+C。

在这个教程中,我们了解了帮助定义基础环境的不同管理器。我们在orbit/source/standalone/tutorials/03_envs目录中包含了更多定义基础环境的示例。为了完整性,它们可以使用以下命令运行:

# Floating cube environment with custom action term for PD control
./orbit.sh -p source/standalone/tutorials/03_envs/create_cube_base_env.py --num_envs 32

在这里插入图片描述

# Quadrupedal locomotion environment with a policy that interacts with the environment
./orbit.sh -p source/standalone/tutorials/03_envs/create_quadruped_base_env.py --num_envs 32

在这里插入图片描述

在接下来的教程中,我们将研究envs.RLTaskEnv类以及如何使用它来创建一个马尔科夫决策过程(MDP)。

愿本文除一切机器人模拟器苦

非常的有品

以上

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/763580.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LangChain模块介绍

LangChain模块介绍 Model I/O Prompts 提示词 Template 模板 复用Selector 提示词选择器 根据不同的条件选择不同的提示词 Language Models 语言模型 LLM 指代续写模型 Chat 对话形态的大语言模型 区分不同的语言模型 Output Parsers JSONStructured Data Connection ​ 构…

leetcode每日一题1969

目录 一.题目原型: 二思路解析: 三.代码实现: 一.题目原型: 二思路解析: 灵神的做法非常让人惊叹: 理解就是,如果一个数大于另一个数要交换的1的权重,那么他们的乘积就变小。 那么一个大的数…

关闭Elasticsearch built-in security features are not enabled

禁用Kibana安全提示(Elasticsearch built-in security features are not enabled) Kibana提示#! Elasticsearch built-in security features are not enabled. Without authentication, your cluster could be accessible to anyone. See https://www.e…

鸿蒙开发图形图像:【图形子系统】

图形子系统 图形子系统主要包括UI组件、布局、动画、字体、输入事件、窗口管理、渲染绘制等模块,构建基于轻量OS应用框架满足硬件资源较小的物联网设备或者构建基于标准OS的应用框架满足富设备的OpenHarmony系统应用开发。 1.1 轻量系统 简介 图形子系统主要包括…

Redis五种数据结构,以及所对应在大厂中的实战应用

Redis五种数据结构,以及所对应在大厂中的实战 String应用场景(单值缓存、对象缓存、分布式锁、计数器、存储session集群共享、分布式全局序列号) Hash应用场景对象缓存、电商购物车、购物车操作优点:1. 同类别归类存储 2. 消耗更小…

实至名归!苏州金龙旅行家荣获“高端旅游之星”殊荣

荣光熠熠,加冕时刻!苏州金龙KLQ6127旅行家再度以出众实力,在高端用车领域璀璨夺目。 3月20日,见证中国品牌力量——2024(第四届)中国商用车品牌营销盛典在北京隆重举办。此次盛典旨在表彰卓越,…

DXP学习2- 绘制电气图【实验】

目录 一、实验目的 二、实验原理 1、创建一个新的项目文件。 2、新建原理图文件 3、设置原理图选项 4、放置元器件 5、其他电路元素的放置 6、对所有电路元素属性参数值的修改 三、实验设备 四、实验内容 1、绘制实验图2-1 元器件所在位置: 1,…

yank+mermaid+甘特图实例

因为notion对于mermaid支持很一般,尤其是甘特图,如果时间跨度大、节点多,字号会小到看不见,非常不方便。 同样的代码,在notion中如下图所示:(下图是我的一份年度规划) (…

STM32之HAL开发——初识HAL库

HAL库介绍 自从ST公司推出HAL库来替代原有的标准库,HAL库开始慢慢的被广大STM32开发者所接受,现在已经在实际的项目开发中大量使用,HAL库使得项目的移植变得简单容易。 Drivers:文件夹下是官方的 CMSISI 库, HAL 库&am…

全网最详细的生产小工单介绍——生产看板介绍篇

生产小工单,你了解多少?生产小工单在生产管理中扮演着怎样的角色?生产小工单适用于哪些对象和业务流程?生产小工单又能为企业带来哪些显著优势?如何高效搭建生产看板模板,让生产小工单发挥最大价值&#xf…

详解rtklib中main函数如何配置文件

目录 Step1:如何给rtklib中的主函数 rnx2rtkp 传参 Step2:给配置选项结构体赋默认值 Step3:继续配置 Step4:寻找 main 函数参数中的 -k Step5:依次遍历参数 Step1:如何给rtklib中的主函数 rnx2rtkp 传参…

第十四届蓝桥杯JavaB组省赛真题 - 阶乘求和

/ 10^9考虑前九位,% 10^9保留后9位 解题思路: 求获取结果的后九位数字,需要对10^9取余,因为202320232023这个数字的阶乘太大,必须要减少计算量,因为当一个整数乘以10^9后对其取余,那么结果都为0。 所以我…

Linux系统------------MySQL事务

目录 一、MySQL事务的概念 二、事务的ACID特点 ●原子性 ●一致性 ●隔离性 ●持久性 事务之间的相互影响有以下几种: ①脏读 ②不可重复读 ③幻读 ④丢失更新 三、Mysql及事务隔离级别 3.1Mysql及事务隔离级别 (1)read…

【微服务】Feign远程调用

📝个人主页:五敷有你 🔥系列专栏:微服务 ⛺️稳中求进,晒太阳 先来看我们以前利用RestTemplate发起远程调用的代码: 存在下面的问题:代码可读性差,编程体验不统一参数复杂URL…

vant4实现图片放大预览

页面引入showImagePreview (展示一个全屏的图片预览组件) import { showImagePreview } from vant;van-image 是用来展示的小图 点击小图 调用showImagePreview放大 <van-cell v-if"img ! null && img.length ! 0" title"图片预览"></van…

荒野大镖客2缺少emp.dll的多种解决方法分享,快速搞定游戏报错问题

在计算机游戏运行过程中&#xff0c;如果出现提示“游戏显示emp.dll丢失”的情况&#xff0c;这可能会引发一系列的问题与故障。首先&#xff0c;由于emp.dll是游戏运行所必需的重要动态链接库文件之一&#xff0c;它的缺失将直接影响到游戏程序的正常启动与执行。具体来说&…

搭建GItlab实现自动化部署Springboot项目(超详细)

提示&#xff1a;本例程中使用Docker搭建GItlab&#xff0c;Gitlab runner 通过编写CICD文件实现Springboot项目自动部署。 1、拉取GitLab镜像 命令&#xff1a; docker pull gitlab/gitlab-ce2、部署Gitlab&#xff1a; 我们通过docker搭建的gitlab部署项目的时候会出现一个…

Python Flask框架 -- 模版继承

一个网站中&#xff0c;大部分网页的模块是重复的&#xff0c;比如顶部的导航栏&#xff0c;底部的备案信息。如果在每个页面中都重复的去写这些代码&#xff0c;会让项目变得臃肿&#xff0c;提高后期维护成本。比较好的做法是&#xff0c;通过模板继承&#xff0c;把一些重复…

DP:斐波那契数列模型

创作不易&#xff0c;感谢三连支持 &#xff01; 斐波那契数列用于一维探索的单峰函数之中&#xff0c;用于求解最优值的方法。其主要优势为&#xff0c;在第一次迭代的时候求解两个函数值&#xff0c;之后每次迭代只需求解一次 。 一、第N个泰波那契数 . - 力扣&#xff08;…

[LLM] 大模型基础|预训练|有监督微调SFT | 推理

现在的大模型在进行预训练时大部分都采用了GPT的预训练任务&#xff0c;即 Next token prediction。 要理解大语言模型&#xff08;LLM&#xff09;&#xff0c;首先要理解它的本质&#xff0c;无论预训练、微调还是在推理阶段&#xff0c;核心都是next token prediction&#…