Isaac Lab安装可以看这个教程:http://t.csdnimg.cn/SN7duhttp://t.csdnimg.cn/SN7du
1. 问题定义与建模
- 问题描述:CartPole问题是一个经典的强化学习问题,cartpole 由 cart和pole构成,其中一个小车(Cart)上连接着一根可以摆动的杆子(Pole)。小车可以在一条无摩擦的轨道上左右移动,而我们的目标是通过对小车施加向左或向右的力,使杆子保持直立状态尽可能长的时间。
- 状态空间S:状态通常包括小车的位置、速度、杆子的角度和角速度。这里我们使用摄像头传感器作为状态空间。
- 动作空间A:一般的cartpole-v0与cartPole -v1动作空间是离散的,只有两种可能的动作——向左(0)或向右(1)。这里动作是给cart施加力,动作空间是(-∞,+∞)。
动作接口方法
- 奖励函数R:每当杆子保持直立时,会获得一个正的奖励(如+1)。当杆子偏离垂直方向超过一定角度(如15度)或小车偏离中心过远时,该回合结束,并可能获得一个负的奖励。
reward接口方法
具体reward计算方法
这里reward可以看到,活着有奖励,杆子角度偏离0°惩罚线性增大,这个惩罚权重最高,同时车的速度波动也有惩罚。
- 终止条件 :
2. 环境设置
- 在强化学习中,我们通常使用现有的库(如OpenAI Gym)来提供CartPole环境。通过
gym.make('CartPole-v1')
(或v0,取决于版本)可以创建CartPole环境。 - 如何添加摄像头:
Adding sensors on a robot — Isaac Lab documentation (isaac-sim.github.io)
相机是使用 sensors.CameraCfg
.它基于 USD Camera 传感器,并使用 Omniverse Replicator API 捕获不同的数据类型。由于它在场景中具有相应的prim,因此在场景中以指定的prims路径创建prim。
相机传感器的配置包括以下参数:
spawn
:要创建的 USD 相机类型。这可以是 PinholeCameraCfg
或 FisheyeCameraCfg
。
offset
:相机传感器与父prim的偏移量。
data_types
:相机要获取的数据类型。这可以是 rgb
、depth 、 distance_to_image_plane
、 normals
或 USD 相机传感器支持的其他类型。
官方的一个相机例子:
camera = CameraCfg(
prim_path="{ENV_REGEX_NS}/Robot/base/front_cam",
update_period=0.1,
height=480,
width=640,
data_types=["rgb", "distance_to_image_plane"],
spawn=sim_utils.PinholeCameraCfg(
focal_length=24.0, focus_distance=400.0, horizontal_aperture=20.955, clipping_range=(0.1, 1.0e5)
),
offset=CameraCfg.OffsetCfg(pos=(0.510, 0.0, 0.015), rot=(0.5, -0.5, 0.5, -0.5), convention="ros"),
)
我们将相机的更新周期设置为 0.1s,这意味着相机传感器以 10Hz 更新。prim_path 设置为 {ENV_REGEX_NS}/Robot/base/front_cam
其中 是 {ENV_REGEX_NS}
环境命名空间, "Robot"
是机器人的名称, "base"
是相机附加到的 prim 的名称,"front_cam"是
与相机传感器关联的 prim 的名称。
这里的offset是偏移量,被指定为相对于base基础框架的平移和旋转。convention似乎是该指定偏移的约定。
再看CartPole例程里添加的RGB和深度相机的配置:
那么这里offset实际该如何确定呢?
在运行的场景里查看摄像头实际偏移量offset,很明显这里的摄像头offset是相对于env_120的。
切到该摄像头视角
所以这里是将摄像头架到倒立摆前面,去做视觉端到端训练。
offset具体参数如何定义,我的建议是去USD Composer或Isaac Sim里设置,然后将获取的坐标关系带到代码里。
3. 策略定义
- 初始策略可以是随机的,即随机选择向左或向右的动作。
- 随着学习的进行,策略会逐渐优化,使智能体能够更长时间地保持杆子直立。
4. 学习算法选择
- 对于CartPole这样的简单问题,可以选择多种强化学习算法,如Q-learning、SARSA、策略梯度等。
- 也可以使用深度学习技术,如深度Q网络(DQN),来逼近Q值函数
这里使用的是ppo算法,配置在yaml文件中,网络是cnn,可以从文件中看到模型结构。
5. 训练与迭代
- 智能体与环境进行交互,收集数据(状态、动作、奖励和下一个状态)。
- 使用这些数据来更新策略或Q值函数。
- 随着迭代的进行,智能体将学会在给定状态下选择最佳动作,以最大化累积奖励。
# 不使用摄像头训练
python source/standalone/workflows/rl_games/train.py --task=Isaac-Cartpole-Direct-v0
# 使用RGB摄像头
python source/standalone/workflows/rl_games/train.py --task=Isaac-Cartpole-RGB-Camera-Direct-v0 --headless --enable_cameras --video
由于加了--video,可以在logs目录里看到保存的视频;
Isaac Lab CartPole训练20000步效果
训练窗口展示,当有最高reward的时候会保存模型
使用tensorboard来查看训练过程:
python -m tensorboard.main --logdir logs/rl_games/cartpole_camera_direct
6. 测试与评估
- 在测试环境中评估智能体的性能,观察它能够保持杆子直立多长时间。
- 可以比较不同算法或参数设置下的性能。
cartpole_camera_direct.pth 是 best rewards的结果,所以加载该checkpoint 来演示效果。
saving next best rewards: [250.49663]
=> saving checkpoint 'D:\omniverse\pkg\isaac-lab\IsaacLab\logs\rl_games\cartpole_camera_direct\2024-06-06_11-01-07\nn\cartpole_camera_direct.pth'
# python source/standalone/workflows/rl_games/play.py --task=Isaac-Cartpole-RGB-Camera-Direct-v0 --checkpoint /PATH/TO/model.pth
python source/standalone/workflows/rl_games/play.py --task=Isaac-Cartpole-RGB-Camera-Direct-v0 --checkpoint logs/rl_games/cartpole_camera_direct/2024-06-06_11-01-07/nn/cartpole_camera_direct.pth
Isaac Lab CartPole play效果