希望和正在或者想要学习使用ISAAC-GYM的朋友一起有一个讨论群,尝试互帮互助,交流学习内容~
目前刚开始尝试,不知道能不能建立起来,如果有意向请私戳!!
——2023.02

1.环境创建与相关参数

1.1 环境创建与物理参数

# get default set of parameters
sim_params = gymapi.SimParams()

# set common parameters
sim_params.dt = 1 / 60
sim_params.substeps = 2
sim_params.up_axis = gymapi.UP_AXIS_Z
sim_params.gravity = gymapi.Vec3(0.0, 0.0, -9.8)

# set PhysX-specific parameters
sim_params.physx.use_gpu = True
sim_params.physx.solver_type = 1
sim_params.physx.num_position_iterations = 6
sim_params.physx.num_velocity_iterations = 1
sim_params.physx.contact_offset = 0.01
sim_params.physx.rest_offset = 0.0

# set Flex-specific parameters
sim_params.flex.solver_type = 5
sim_params.flex.num_outer_iterations = 4
sim_params.flex.num_inner_iterations = 20
sim_params.flex.relaxation = 0.8
sim_params.flex.warm_start = 0.5

# create sim with these parameters
sim = gym.create_sim(compute_device_id, graphics_device_id, physics_engine, sim_params)

1.2 坐标轴

sim_params.up_axis = gymapi.UP_AXIS_Z
sim_params.gravity = gymapi.Vec3(0.0, 0.0, -9.8)

1.3 创建地面

# configure the ground plane
plane_params = gymapi.PlaneParams()
plane_params.normal = gymapi.Vec3(0, 0, 1) # z-up!
plane_params.distance = 0
plane_params.static_friction = 1
plane_params.dynamic_friction = 1
plane_params.restitution = 0

# create the ground plane
gym.add_ground(sim, plane_params)

2. 载入模型

可以载入URDF,MJCF,USD
方式1:

asset_root = "../../assets"
asset_file = "urdf/franka_description/robots/franka_panda.urdf"
asset = gym.load_asset(sim, asset_root, asset_file)

方式2:

asset_options = gymapi.AssetOptions()
asset_options.fix_base_link = True
asset_options.armature = 0.01

asset = gym.load_asset(sim, asset_root, asset_file, asset_options)

3. 环境与参与者(actors)

环境由一起模拟的 actors和传感器的集合组成。环境中的参与者在物理上相互作用。它们的状态由物理引擎保持,可以使用稍后讨论的控制API来控制。放置在环境中的传感器,如摄像机,将能够捕捉环境中的actors。

Isaac Gym的一个重要设计方面是能够将一个环境的多个实例打包到一个模拟中。这在强化学习等应用领域非常重要,因为在强化学习中,需要大量的运行来训练代理执行某些任务。使用Isaac Gym,您可以同步运行数十、数百甚至数千个环境实例。可以随机化每个环境中的初始条件,如布局、演员姿势,甚至 actors本身。可以随机化所有 actor的物理、视觉和控制属性

3.1 创建环境

Isaac Gym提供了一个简单的过程API,用于创建环境并用参与者填充环境。这比从文件加载静态场景更有用,因为它允许您在将所有actor添加到场景中时控制其位置和属性。在添加参与者之前,必须创建一个环境

spacing = 2.0
lower = gymapi.Vec3(-spacing, 0.0, -spacing)
upper = gymapi.Vec3(spacing, spacing, spacing)
env = gym.create_env(sim, lower, upper, 8)

每个env都有自己的坐标空间,该坐标空间嵌入到全局模拟空间中。创建环境时,我们指定环境的局部范围,这取决于环境实例之间所需的间距。随着新环境被添加到模拟中,它们将一次一行地排列在二维网格中。create_env最后一个参数表示

3.2 添加actor

actor只是GymAsset的一个实例。要将actor添加到环境中,必须指定源资源、所需姿势和其他一些细节:

pose = gymapi.Transform()
pose.p = gymapi.Vec3(0.0, 1.0, 0.0)
pose.r = gymapi.Quat(-0.707107, 0.0, 0.0, 0.707107)

actor_handle = gym.create_actor(env, asset, pose, "MyActor", 0, 1)
# "MyActor":自定义的名称
#参数列表末尾的两个整数是collis_group和collis_filter

每个actor都必须被置于一个环境中。你不能有一个不属于环境的actor。使用位置向量p和方向四元数r在env局部坐标中定义演员姿势。在上面的片段中,方向由四元数(-0.707107,0.0,0.0,0.707107)指定。Quat构造函数以(x,y,z,w)顺序接受参数,因此此四元数表示围绕x轴的-90度旋转。当将使用z-up约定定义的资源加载到使用y-up约定的模拟中时,这种旋转是必要的。Isaac Gym提供了一个方便的数学助手集合,包括四元数实用程序,因此四元数可以这样定义为轴角形式:

pose.r = gymapi.Quat.from_axis_angle(gymapi.Vec3(1, 0, 0), -0.5 * math.pi)
  • collision_group:

collisingroup是一个整数,用于标识参与者身体将被分配到的碰撞组。两个物体仅在属于同一碰撞组时才会相互碰撞。每个环境通常有一个冲突组,在这种情况下,组id对应于环境索引。这防止了不同环境中的actor之间的物理交互。在某些情况下,您可能希望为每个环境设置多个冲突组,以实现更细粒度的控制。值-1用于与所有其他组碰撞的特殊碰撞组。这可以用于创建“共享”对象,这些对象可以在所有环境中与actor进行物理交互。

collision_filter :
collisionfilter是一个位掩码,可以过滤出物体之间的碰撞。如果两个实体的碰撞过滤器具有公共位集,则它们不会碰撞。该值可用于过滤多体actor中的自碰撞,或防止场景中某些类型的对象发生物理交互

3.3 环境初始化

设置模拟时,可以在单个循环中初始化所有环境:

# set up the env grid
num_envs = 64
envs_per_row = 8
env_spacing = 2.0
env_lower = gymapi.Vec3(-env_spacing, 0.0, -env_spacing)
env_upper = gymapi.Vec3(env_spacing, env_spacing, env_spacing)

# cache some common handles for later use
envs = []
actor_handles = []

# create and populate the environments
for i in range(num_envs):
    env = gym.create_env(sim, env_lower, env_upper, envs_per_row)
    envs.append(env)

    height = random.uniform(1.0, 2.5)

    pose = gymapi.Transform()
    pose.p = gymapi.Vec3(0.0, height, 0.0)

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

注意,分配给每个参与者的冲突组对应于环境索引,这意味着来自不同环境的参与者不会在物理上彼此交互
目前,用于设置环境的过程API有一些限制。假设所有环境都是按顺序创建和填充的。您创建一个环境并将所有参与者添加到其中,然后创建另一个环境,并将其所有参与者添加到此环境中,依此类推。一旦完成填充一个环境并且开始填充下一个环境后,您就不能再将参与者添加到上一个环境中。

4.仿真运行

设置环境栅格和其他参数后,可以开始模拟。这通常在循环中完成,其中循环的每个迭代对应于一个时间步长:

while True:
    # step the physics
    (sim)
    gym.fetch_results(sim, True)

5. 添加观察者(viewer)

cam_props = gymapi.CameraProperties()
viewer = gym.(sim, cam_props)

详见官方解说)

6.自定义鼠标/键盘输入

参考examples/projectiles.py

gym.subscribe_viewer_keyboard_event(viewer, gymapi.KEY_SPACE, "space_shoot")
gym.subscribe_viewer_keyboard_event(viewer, gymapi.KEY_R, "reset")
gym.subscribe_viewer_mouse_event(viewer, gymapi.MOUSE_LEFT_BUTTON, "mouse_shoot")
...
while not gym.query_viewer_has_closed(viewer):
    ...
    for evt in gym.query_viewer_action_events(viewer):
        ...

7. 窗口退出

gym.destroy_viewer(viewer)
gym.destroy_sim(sim)
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐