Reinforcement Learning学习(三)

发布于:2024-06-11 ⋅ 阅读:(15) ⋅ 点赞:(0)

前言

最近在学习Mujoco环境,学习了一些官方的Tutorials以及开源的Demo,对SB3库的强化学习标准库有了一定的了解,尝试搭建了自己的环境,基于UR5E机械臂,进行了一个避障的任务,同时尝试接入了图像大模型API,做了一些有趣的应用,参考资料如下:

https://mujoco.readthedocs.io/en/stable/overview.html
https://pab47.github.io/mujocopy.html
https://github.com/ian-chuang/Manipulator-Mujoco.git

下面我打算分为原理部分,实验过程,结果展示,后续优化几个方面来展开

原理部分

首先是SB3的强化学习库,就我目前的理解来看,这个库基于gym环境以及其变体gymnasium,能够通过矢量转换方法加快训练速度,虽然比不上isaac gym,但其使用性相较更友好(个人意见),因此这里我就使用了该库进行学习

由于我的任务是机械臂的运动控制,因此我的动作空间是连续的,在这里最好还是使用PPO来作为基座模型,先把实验跑通,后续再尝试进行一些其他的优化

关于PPO的原理,其实之前有接触过了,简单理解就是分为两个策略来同时训练,一个策略和实时环境交互,过数个单位时间再把单位信息和真正的策略进行耦合,这里会用到KL散度以及一些Clip约束和优势函数来显示策略的更新速度和步长,防止策略跨度过大,再者就是一个价值损失:预测价值和真实价值之间的差距,这里我就使用了多层感知机来搭建网络

实验过程

整个实验过程分为以下几步:

  1. 环境的搭建,要抓取的目标,奖励的设定,障碍物&相机的配置
  2. 模型导入以及训练
  3. 重写函数,创建自由移动功能
  4. 接入大模型进行位置的设定

环境的一些坐标和物体参数代码如下:

# checkerboard floor

self._arena = StandardArena()

  

self._arena._mjcf_model

# 定义障碍物的尺寸

self.block_size = [0.3, 0.2, 0.2] # 方块的长, 宽, 高

  

self.block1_pos = [-1, .7, 0.35]

self.block2_pos = [-1, -.7, 0.35]

self.block3_pos = [-1, 0, 0.35]

# self.block4_pos = [.8, -.6, 1.5]

  

# 添加方块障碍物

block_body = self._arena._mjcf_model.worldbody.add("body", name=f"block1", pos=self.block1_pos)

block_body.add("geom", type="box", size=self.block_size, rgba=[0, 0, 1, 1])

block_body.add("freejoint") # 添加自由关节

block_body = self._arena._mjcf_model.worldbody.add("body", name=f"block2", pos=self.block2_pos)

block_body.add("geom", type="box", size=self.block_size, rgba=[0, 0, 0, 1])

block_body.add("freejoint") # 添加自由关节

block_body = self._arena._mjcf_model.worldbody.add("body", name=f"block3", pos=self.block3_pos)

block_body.add("geom", type="box", size=self.block_size, rgba=[1, 1, 1, 1])

block_body.add("freejoint") # 添加自由关节

  

# 目标方块

self.block_size2 = [0.1, 0.1, 0.1] # 方块的长, 宽, 高

# 添加方块障碍物

self.block_positions2 = [

[.6, .7, 0], # 方块1

[-.6,.7, 0], # 方块2

[0, .7, 0]

]

  

block_body = self._arena