Isaac-gym(7):物理模拟(actor生成、创建、控制等)

news2025/7/9 20:17:11

1. 创建actor

1.1 actor的创建与句柄

actor是GymAsset的实例。函数create_actor将一个参与者添加到环境中,并返回一个参与者句柄,该句柄可用于以后与该参与者交互。出于性能原因,最好在actor创建期间保存句柄,而不是在模拟运行时每次都查找句柄:

# cache useful handles
envs = []
actor_handles = []

print("Creating %d environments" % num_envs)
for i in range(num_envs):
    # create env
    env = gym.create_env(sim, env_lower, env_upper, num_per_row)
    envs.append(env)

    # add actor
    actor_handle = gym.create_actor(env, asset, pose, "actor", i, 1)
    actor_handles.append(actor_handle)

参与者句柄特定于创建参与者的环境。对参与者进行操作的API函数需要环境引用和参与者句柄,因此通常将它们缓存在一起。

有相当多的功能对参与者起作用。它们被命名为get_actor_*、set_actor_或apply_cactor_。使用API参考获取完整列表。

1.2 Aggregates(聚合)

Aggregates仅用于PhysX;

聚合是actors的集合。聚合不提供额外的模拟功能,但允许您告诉PhysX一组actors将聚集在一起,从而允许PhysX优化其空间数据操作。不需要创建聚合,但这样做可以适度提高性能。要将多个actors放置到聚合中,应将对create_actor的调用括在对begin_aggregateend_aggregate的调用之间:

gym.begin_aggregate(env, max_bodies, max_shapes, True)
gym.create_actor(env, ...)
gym.create_actor(env, ...)
gym.create_actor(env, ...)
...
gym.end_aggregate(env)

聚合中只能包含来自同一env的actors。创建聚合时,需要指定刚体和形状的最大数量,这应该是将放置在聚合中的所有actors的刚体和形状总数。可以从用于创建参与者的资产(`` ,get_asset_rigid_shape_count)中获取此信息。
实例:python/rlgpu/tasks/franka.py

2. actor组件

每个角色都有一组刚体、关节和自由度。可以这样计算:

num_bodies = gym.get_actor_rigid_body_count(env, actor_handle)
num_joints = gym.get_actor_joint_count(env, actor_handle)
num_dofs = gym.get_actor_dof_count(env, actor_handle)

此时,一旦创建了参与者,就不可能添加或删除参与者组件。

3.1 刚体

每个刚体由一个或多个刚性形状组成。可以为每个角色自定义刚体和形状属性,如body_physics_props.py中所示.

4. Controlling Actors

使用自由度来控制参与者。对于每个自由度,可以设置驱动模式、限制、刚度、阻尼和目标。您可以为每个参与者设置这些值,并覆盖从资源加载的默认设置。

5. Actor缩放

可以在运行时缩放其大小。缩放角色将更改其碰撞几何体、质量属性、关节位置和棱柱关节限制。参考:examples/actor_scaling.py

5.1 DOF特性和驱动模式

可以访问资产(get_asset_DOF_properties)和单个参与者(get_actor_DOF_properties/set_actor_DOF _properties)的DOF属性数组。返回具有以下字段的结构化Numpy数组:
在这里插入图片描述
(具体细节描述与参考详见官方文档:Programming-phsics simulation-Scaling actors)

5.2 张量控制API

新的张量API提供了应用控件的替代方法。设置DOF属性的API保持不变,但您可以使用CPU或GPU张量施加力或设置PD目标。这使得完全在GPU上运行模拟成为可能,而无需在主机和设备之间复制数据。

6. 物理状态

Gym提供了一个API,用于获取和设置结构化Numpy数组的物理状态。

6.1 刚体状态

刚体状态包括位置(Vec3)、方向(Quat)、线速度(Vec3)和角速度(Vec3)。这允许您在最大坐标中处理模拟状态。
可以获取actor、环境或整个模拟的刚体状态数组:

body_states = gym.get_actor_rigid_body_states(env, actor_handle, gymapi.STATE_ALL)
body_states = gym.get_env_rigid_body_states(env, gymapi.STATE_ALL)
body_states = gym.get_sim_rigid_body_states(sim, gymapi.STATE_ALL)

这些方法返回结构化numpy数组。最后一个参数是一个位字段,用于指定应返回的状态类型。STATE_POS表示应计算位置,STATE_VEL表示应计算速度,STATE_ALL表示应计算两者。返回的数组的结构始终相同,但只有设置了相应的标志时,才会计算位置和速度值。在内部,Gym维护存储这些值的状态缓存缓冲区。Numpy数组只是缓冲区切片的包装器。根据基础物理引擎的不同,获取和设置状态可能需要非平凡的计算,并且可以使用位标志来避免不必要的操作。
可以这样访问状态数组切片:

body_states["pose"]             # all poses (position and orientation)
body_states["pose"]["p"])           # all positions (Vec3: x, y, z)
body_states["pose"]["r"])           # all orientations (Quat: x, y, z, w)
body_states["vel"]              # all velocities (linear and angular)
body_states["vel"]["linear"]    # all linear velocities (Vec3: x, y, z)
body_states["vel"]["angular"]   # all angular velocities (Vec3: x, y, z)

可以使用相应的方法编辑并设置状态:

gym.set_actor_rigid_body_states(env, actor_handle, body_states, gymapi.STATE_ALL)
gym.set_env_rigid_body_states(env, body_states, gymapi.STATE_ALL)
gym.set_sim_rigid_body_states(sim, body_states, gymapi.STATE_ALL)

实例:projectiles.py
要确定状态阵列中特定刚体的偏移,请使用find_actor_rigid_body_index方法:

i1 = gym.find_actor_rigid_body_index(env, actor_handle, "body_name", gymapi.DOMAIN_ACTOR)
i2 = gym.find_actor_rigid_body_index(env, actor_handle, "body_name", gymapi.DOMAIN_ENV)
i3 = gym.find_actor_rigid_body_index(env, actor_handle, "body_name", gymapi.DOMAIN_SIM)

使用域domain_ACTOR获取get_ACTOR_rigid_body_states返回的状态缓冲区的索引;
使用域domain_ENV获取get_ENV_rigid_body_states返回的状态缓冲区的索引;
使用域domain_SIM获取get_SIM_rid_body_states返回的状态缓冲区的索引.

6.2 DOF状态

您还可以使用简化坐标与actors合作:

dof_states = gym.get_actor_dof_states(env, actor_handle, gymapi.STATE_ALL)
gym.set_actor_dof_states(env, actor_handle, dof_states, gymapi.STATE_ALL)

DOF状态数组包括作为单个浮点数的位置和速度。对于线性自由度,位置单位为米,速度单位为米/秒。对于角DOF,位置以弧度为单位,速度以弧度/秒为单位

您可以这样访问位置和速度切片:

dof_states["pos"]   # all positions
dof_states["vel"]   # all velocities

可以使用find_actor_DOF_index方法确定特定DOF的偏移。

注意,DOF状态不包括根刚体的姿势或速度,因此它们不能完全捕捉演员状态。因此,我们没有提供获取和设置整个环境或模拟的DOF状态的方法。
实例:joint_monkey.py

6.3 物理状态张量API

新的张量API允许使用CPU或GPU张量获取和设置状态。这使得完全在GPU上运行模拟成为可能,而无需在主机和设备之间复制数据。

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

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

相关文章

[同向双指针] 209. 长度最小的子数组 713. 乘积小于 K 的子数组 3. 无重复字符的最长子串

同向双指针 该文结合灵神讲解进行编码:https://www.bilibili.com/video/BV1hd4y1r7Gq 该类滑动窗口一般符合某种单调性。 当不满足条件时左指针后移,当满足条件时右指针后移。 假设数组长度为 n,左指针最多移动 n 次,右指针最…

【无人机】基于RRT算法实现四旋翼无人机的安全和最小能量轨迹规划附matlab代码和报告

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

Linux安装RabbitMQ步骤分享

1、Erlnag安装 1.1、 安装Erlang版本要求 Erlang安装需要对应各自的版本 RabbitMQ Erlang Version Requirements — RabbitMQ 1.2、 Erlang安装 1、目录准备 cd /usr/local/src/ mkdir rabbitmq cd rabbitmq2、添加仓库地址 为了减少安装的错误 我们使用仓库安装 ,类似于m…

【算法篇-数论】快速幂

快速幂1. 利用快速幂优化的时间复杂度2. 快速幂方法及代码3.总结文章参考自 B站董晓算法 1. 利用快速幂优化的时间复杂度 所谓的快速幂就是快速计算底数的n次幂暴力求幂的话时间复杂度为O(n) 利用快速幂可以做到 时间复杂度为 O(log2n) 2. 快速幂方法…

操作系统4小时速成:I/O管理,spooling脱机技术,设备分配,分配数据结构,IO调度,IO子系统,IO控制方式,IO分类

操作系统4小时速成:I/O管理,spooling脱机技术,设备分配,分配数据结构,IO调度,IO子系统,IO控制方式,IO分类 2022找工作是学历、能力和运气的超强结合体,遇到寒冬&#xf…

一、什么是 MQ

MQ的概念 MQ (Message Queue)消息队列,是在消息传输过程中存储消息的容器。多用于分布式系统之间的通信。 队列是基础数据结构中 “先进先出” 的一种数据结构。 消息对列,指把要传输的数据消息放在队列中,用队列机制…

SpringBoot:速成总结+实战——员工管理系统

这篇文章先是总结SpringBoot,当然我很多源码都没有仔细的去抠,而且这样一个成熟的框架想都不用想就知道源码很复杂,先学框架怎么用。接着就用SpringBoot完成一个较为简单的项目:员工管理系统。 目录端口号被占用怎么办什么是Sprin…

Hadoop总结——Hadoop基础

一、Hadoop是什么 Hadoop是一个由Apache基金会所开发的分布式系统基础架构 主要解决,海量数据的存储和海量数据的分析计算问题 广义上来说,Hadoop通常是指一个更广泛的概念——Hadoop生态圈 二、Hadoop发展历史 1)Lucene--Doug Cutting开…

python中深拷贝和浅拷贝的区别

文章目录值的引用浅拷贝可变数据类型与不可变数据类型不可变数据类型可变数据类型深拷贝深拷贝浅拷贝总结若将需要注释若干行,则将这些行选中,然后按住 ctrl / 键就可以了,再按一次,即可取消多行注释若要批量缩进,那么…

磷脂酰丝氨酸 猪脑(phosphatidylserine,PS)试剂级;丝氨酸磷脂

磷脂酰丝氨酸(phosphatidylserine,PS)又称丝氨酸磷脂,二酰甘油酰磷酸丝氨酸,简称PS,是一类普遍存在的磷脂,通常位于细胞膜的内层,磷酯化合物中的磷酸甘油酯类,是细胞膜组…

QGIS创建要素与属性

QGIS之矢量操作——创建要素与属性 创建要素 打开常用的工具条:View—Toolbar 这样常用的工具条就加载进来了 新建矢量图层,并设置字段等等: 创建属性,选中你的矢量图层,右键选择Toggle_Editing(或者点击…

SpringBoot项目上线运维

文章目录一.高级属性配置1.1 简介1.2 临时属性设置1.3 配置文件的四级分类1.4 自定义配置文件二.多环境开发2.2 多环境开发(yaml版)2.3 多环境开发多文件版(yaml版)2.4 多环境开发(Properties版)2.5 多环境…

这次把怎么做好一个PPT讲清-画图篇

文章目录概述布尔运算PPT幻灯片中如何设置形状对象格式每一个图形既是一个形状,又是一个文本框如何用PPT来实现三维3D效果,附参数设置详解怎么用ppt画三维立体图?**PPT做3D可动样机****PPT做3D[动态图标]****PPT做3D插画**如何使用[PPT绘图]&#xff1f…

图像处理:图像清晰度评价

目录 0、实现效果 1、概述 2、模糊度分类 1、运动模糊 2、压缩模糊 3、高斯模糊 3、清晰度量化指标 Brenner 能量梯度函数(Energy of Gradient) ​编辑 Roberts Laplace SMD(灰度方差)函数 SMD2 (灰度方差乘积)函数 …

JUC学习笔记——并发工具线程池

在本系列内容中我们会对JUC做一个系统的学习,本片将会介绍JUC的并发工具线程池 我们会分为以下几部分进行介绍: 线程池介绍自定义线程池模式之Worker ThreadJDK线程池Tomcat线程池Fork/Join 线程池介绍 我们在这一小节简单介绍一下线程池 线程池简介…

Linux基础教程:9、linux进程管理(2)

前面我们讲到fork创建子进程,那么这一期我们接着讲创建进程之后如何调试以及插入其他进程、特殊进程、和进程如何退出; 同样我们写了一个C语言程序,但是在这个程序中是有两个进程,我们调试的时候只会选择一个进程调试&#xff0c…

了解ixgbe网卡驱动— 驱动注册(纯代码分享)

1 ixgbe 网卡注册驱动 和大部分设备驱动一样,网卡驱动是作为一个 module 注册到 kernel 的 通过 module_init() -> ixgbe_init_module() -> pci_register_driver() 注册 ixgbe_driver 通过 module_exit() -> ixgbe_exit_module() -> pci_unregister_dr…

【仿牛客网笔记】项目进阶,构建安全高效的企业服务——置顶、加精、删除

添加依赖,去掉版本 实现置顶、加精的修改,删除 首先开发数据访问层,因为是对帖子的操作所以无论是置顶、加精最终是要修改帖子,先打开DiscussPostMapper增加修改的操作,一个修改类型,一个修改状态。 打…

[iOS]MonkeyDev安装

MonkeyDev官方安装文档:https://github.com/AloneMonkey/MonkeyDev/wiki/%E5%AE%89%E8%A3%85 1.安装HomeBrew 终端输入指令 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 选择源后安装 更多安装方式可以参…

HTML+CSS+JS大作业:网站设计——家具装修公司(12页 bootstrap, 响应式)

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 公司官网网站 | 企业官网 | 酒店官网 | 等网站的设计与制 | HTML期末大学生网页设计作业,Web大学生网页 HTML:结构 CSS&#…