首先在安装时得到了isaac gym和IsaacGymEnvs. isaac gym是基础包,IsaacGymEnvs是一个包装好的并行强化学习实例库。
参考isaacgym/docs/index.html
1. 初始化环境
参考dof_control.py
import os
import time
import math
import numpy as np
from scipy.spatial.transform import Rotation
import math
from isaacgym import gymapi, gymtorch
from isaacgym import gymutil
import time
import torch
from torch.utils.tensorboard import SummaryWriter
from DDPG_Prior import DDPGAgent
# from DDPG import DDPGAgent
from config import *
from config import opt
from ReplayMemory import *
device = torch.device('cuda') if opt.use_gpu else torch.device('cpu')
np.set_printoptions(precision=3, suppress=True) # 设定numpy打印精度
np.random.seed(opt.random_seed)
torch.manual_seed(opt.random_seed)
# initialize gym
gym = gymapi.acquire_gym()
# parse arguments
args = gymutil.parse_arguments(description="Joint control Methods Example")
# create a simulator
sim_params = gymapi.SimParams()
sim_params.substeps = 1
sim_params.dt = opt.dt
sim_params.physx.solver_type = 1
sim_params.physx.num_position_iterations = 4
sim_params.physx.num_velocity_iterations = 1
sim_params.physx.num_threads = args.num_threads
sim_params.physx.use_gpu = args.use_gpu
sim_params.use_gpu_pipeline = False
if args.use_gpu_pipeline:
print("WARNING: Forcing CPU pipeline.")
sim = gym.create_sim(args.compute_device_id, args.graphics_device_id, args.physics_engine, sim_params)
if sim is None:
print("*** Failed to create sim")
quit()
# create viewer using the default camera properties
viewer = gym.create_viewer(sim, gymapi.CameraProperties())
if viewer is None:
raise ValueError('*** Failed to create viewer')
# add ground plane
plane_params = gymapi.PlaneParams()
gym.add_ground(sim, gymapi.PlaneParams())
# set up the env grid
num_envs = 1
spacing = 1.5
env_lower = gymapi.Vec3(-spacing, 0.0, -spacing)
env_upper = gymapi.Vec3(spacing, 0.0, spacing)
# add cartpole urdf asset
asset_root = "/home/blamlight/NVIDIA_Omniverse/ISAAC_Gym/isaacgym/assets"
asset_file = "urdf/cartpole.urdf"
# Load asset with default control type of position for all joints
asset_options = gymapi.AssetOptions()
asset_options.fix_base_link = True
asset_options.default_dof_drive_mode = gymapi.DOF_MODE_POS
print("Loading asset '%s' from '%s'" % (asset_file, asset_root))
cartpole_asset = gym.load_asset(sim, asset_root, asset_file, asset_options)
# initial root pose for cartpole actors
initial_pose = gymapi.Transform()
initial_pose.p = gymapi.Vec3(0.0, 2.0, 0.0)
initial_pose.r = gymapi.Quat(-0.707107, 0.0, 0.0, 0.707107)
# Create environment 3
# Cart has no drive mode, but will be pushed around using forces.
# Pole held steady using position target mode.
env3 = gym.create_env(sim, env_lower, env_upper, 2)
cartpole3 = gym.create_actor(env3, cartpole_asset, initial_pose, 'cartpole', 3, 1)
# Configure DOF properties
props = gym.get_actor_dof_properties(env3, cartpole3)
props["driveMode"] = (gymapi.DOF_MODE_EFFORT, gymapi.DOF_MODE_EFFORT)
props["stiffness"] = (0.0, 0.0)
props["damping"] = (0.0, 0.1)
gym.set_actor_dof_properties(env3, cartpole3, props) # Environment Handle, Actor Handle
# Set DOF drive targets
cart_dof_handle3 = gym.find_actor_dof_handle(env3, cartpole3, 'slider_to_cart')
pole_dof_handle3 = gym.find_actor_dof_handle(env3, cartpole3, 'cart_to_pole')
gym.set_dof_target_position(env3, cart_dof_handle3, 0.0)
# Look at the first env
cam_pos = gymapi.Vec3(8, 4, 1.5)
cam_target = gymapi.Vec3(0, 2, 1.5)
gym.viewer_camera_look_at(viewer, None, cam_pos, cam_target)
num_bodies = gym.get_actor_rigid_body_count(env3, cartpole3)
num_joints = gym.get_actor_joint_count(env3, cartpole3)
num_dofs = gym.get_actor_dof_count(env3, cartpole3)
# print(num_bodies)
# print(num_joints)
# print(num_dofs)
last_time = time.time()
# gym.apply_dof_effort(env3, pole_dof_handle3, 200)
其中 apply_dof_effort 在 DOF 上施加力。如果自由度是棱柱形的,则作用力将以牛顿为单位。如果自由度是旋转的,则作用力将是扭矩(以 Nm 为单位)。
替换查看作用在滑块的效果:
gym.apply_dof_effort(env, cart_dof_handle, -pos * 50)
2. 获取传感器信息
参考Isaac-gym(8):Tensor API_isaac gym api.acquire gym() cannot find declaratio-CSDN博客
file:///home/blamlight/NVIDIA_Omniverse/ISAAC_Gym/isaacgym/docs/programming/physics.html#creating-actors
def getstate():
gym.refresh_actor_root_state_tensor(sim)
body_states = gym.get_actor_rigid_body_states(env3, cartpole3, gymapi.STATE_ALL)
quaternion_values = body_states["pose"]["r"][2]
cart_pos = body_states["pose"]["p"]
# print(quaternion_values.dtype)
rotation = Rotation.from_quat([quaternion_values[key] for key in quaternion_values.dtype.names])
euler_angles = rotation.as_euler('xyz', degrees=True)[0]
# print("BODY Angle: ", euler_angles[2])
cart_vel = body_states["vel"]["linear"][1][2]
pole_vel = body_states["vel"]["angular"][2][0]
# print("BODY: ", cart_vel, pole_vel)
return [euler_angles, cart_pos[1][2], cart_vel, pole_vel], cart_pos
3. step
def envstep(action):
forces = torch.zeros(num_dofs, dtype=torch.float32, device="cpu")
# print(action[0],action[0].dtype)
forces[0] = torch.tensor(action)
gym.set_dof_actuation_force_tensor(sim, gymtorch.unwrap_tensor(forces))
其余部分不粘贴了,与isaac gym相关的参数主要在以上部分