mujoco+spinningup进行强化学习训练快速入门

本文档介绍了如何搭建一个使用强化学习进行力控的UR5机器人环境。首先,通过MuJoCo加载XML模型并初始化模拟器。接着,设置了动作和状态空间,其中动作空间对应于控制器的输入范围,状态空间包含关节位置和速度信息。在step方法中,将动作传递给控制器接口,并计算关节位置偏差作为奖励。reset方法用于重置关节位置和速度。此外,还提到了一个名为spinningup的强化学习框架,它在性能和训练效率上优于其他框架,并提供了MPI多线程支持。最后,给出了使用spinningup库训练和运行UR5力控算法的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、搭建env

目标:使用强化学习做力控,使机器人(UR5)平稳地运动到指定位置,并保持该状态。

env的几个要素*:

​ 必要方法:step(action)、reset()、render()

​ 必要元素:action_space、observation_space

​ 我们在写环境就是实现这几个基本要素的过程

(1)初始化MuJoCo相关的组件
 self.model = mp.load_model_from_path('ur5.xml') # 从路径加载模型。
 self.sim = mp.MjSim(self.model) # MjSim 表示一个正在运行的模拟,包括其状态。
 self.viewer = mp.MjViewer(self.sim) #显示器
(2) 设置动作和状态空间
self.action_high = np.array([2, 2, 2, 1, 1, 1], dtype=np.float32)
self.action_space = spaces.Box(-self.action_high, self.action_high, dtype=np.float32)
self.observation_high = np.array([np.finfo(np.float32).max] * 12)
self.observation_space = spaces.Box(-self.observation_high, self.observation_high, dtype=np.float32)

action_space是由控制器的范围直接决定的,我们希望做一个力控,也就是把动作的输入直接给控制器上。

action_high即三个-2到2,三个-1到1,对称的

观测的是六个关节,共12个量,即对每个关节的位置和速度信息进行观测

(3) step实现

对于step的实现,直接将action输出到力控的接口

self.sim.data.ctrl[i] = action[i]

reward设为关节位置偏差求和。偏差越大,reward的值越小,反之越大

r -= abs(self.sim.data.qpos[i] - self.target[i])

state设置为各关节的位置和速度组成的向量

self.state[i] = self.sim.data.qpos[i]
self.state[i + 6] = self.sim.data.qvel[i]
(4) render
 self.viewer.render()
(5) reset

关节位置速度归零

self.sim.data.qpos[i] = 0
self.sim.data.qvel[i] = 0
self.state = [0] * 12

(6)完整环境代码

# UR5_Controller.py
import mujoco_py as mp
import numpy as np
from gym import spaces


class UR5_Controller(object):
    def __init__(self, target): #传入目标位置
        self.model = mp.load_model_from_path('ur5.xml') # 从路径加载模型。
        self.sim = mp.MjSim(self.model) # MjSim 表示一个正在运行的模拟,包括其状态。
        self.viewer = mp.MjViewer(self.sim) #显示器
        self.state = [0] * 12
        self.action_high = np.array([2, 2, 2, 1, 1, 1], dtype=np.float32)
        self.action_space = spaces.Box(-self.action_high, self.action_high, dtype=np.float32)
        self.observation_high = np.array([np.finfo(np.float32).max] * 12)
        self.observation_space = spaces.Box(-self.observation_high, self.observation_high, dtype=np.float32)

        self.target = target

    def step(self, action):
        for i in range(6): 
            self.sim.data.ctrl[i] = action[i] # 直接将action输出到控制器接口
        self.sim.step() # step的调用
        r = 0
        for i in range(6):
            r -= abs(self.sim.data.qpos[i] - self.target[i]) # 6个关节的偏差进行一个累加
            # r -= abs(self.sim.data.qvel[i])
            self.state[i] = self.sim.data.qpos[i] # state更新成每次的速度和位置
            self.state[i + 6] = self.sim.data.qvel[i]
        done = False
        # if r < -50:
        #     done = True
        # print(r)
        return np.array(self.state, dtype=np.float32), r, done, {} # 返回状态(observaton观测到的一些东西),reward,是否完成过程的一个标记,返回一个info(包括一些信息,一般是自检的形式。比如希望返回是否在一个高速的状态,可以在里面写上一些具体的信息,自己定义的,一般可以在输出上使用))

    def render(self):
        self.viewer.render()

    def reset(self): # 从摄像机渲染视图,并将图像作为 numpy.ndarray 返回。
        self.sim.reset()
        for i in range(6):
            self.sim.data.qpos[i] = 0
            self.sim.data.qvel[i] = 0
        self.state = [0] * 12
        return np.array(self.state, dtype=np.float32) # 返回reset后的状态

    def close(self):
        pass

2、spinning up框架介绍

这是一个性能上比较优秀的强化学习框架,它的实验细节比baseline好很多。spinningup的训练效率也比baseline好很多。

支持mpi多线程

Ubuntu: sudo apt-get update && sudp apt-get install libopenmpi-dev
Mac OSX: brew install openmpi

注意:这里不建议使用conda,可能会出问题

安装spinningup

git clone https://github.com/openai/spinningup.git
cd spinningup
pip install -e .

注意:pip install -e .执行的是 spinningup下的setup.py文件,如果报错,打开setup.py,手动安装依赖,逐个排查问题所在!!!

安装测试

python -m spinup.run ppo --hid "[32,32]"--env LunarLander-v2 --exp_name installtest --gamma 0.999
python -m spinup.run test_policy data/installtest/installtest_s0
python -m spinup.run plot data/installtest/installtest_so

3、训练+运行

使用spinningup强化学习算法库编写的运行程序

# main.py
from spinup import ppo_pytorch as ppo
from UR5_Controller import UR5_Controller
from spinup.utils.test_policy import load_policy_and_env, run_policy
import torch

TRAIN = 0  # 0:运行已有信息      1:训练模式

target = [0, -1.57, 1.57, 0, 0, 0] # 目标位置
env = lambda : UR5_Controller(target) # 创建环境

if TRAIN:
    ac_kwargs = dict(hidden_sizes=[64,64], activation=torch.nn.ReLU) # 网络参数:隐藏层,激活函数
    logger_kwargs = dict(output_dir='log', exp_name='ur5_goToTarget')# 记录和输出信息的函数

    ppo(env, ac_kwargs=ac_kwargs, logger_kwargs=logger_kwargs,
        steps_per_epoch=5000, epochs=4000)

else:
    _, get_action = load_policy_and_env('log') # 读取log中的信息
    env_test = UR5_Controller(target)
    run_policy(env_test, get_action)

### MuJoCo环境 (MujocoEnv) 的使用方法、安装以及实现细节 #### 使用方法 `MujocoEnv` 是 OpenAI Gym 中的一个基础类,用于封装基于物理引擎 MuJoCO 创建的各种强化学习环境。通过继承 `MujocoEnv` 类并重写其中的关键函数,可以快速构建自定义的机器人控制任务[^1]。 以下是创建一个简单的 `MujocoEnv` 子类的主要步骤: - **初始化组件**: 需要加载 XML 文件来描述场景中的物体及其交互方式。XML 文件可以通过 MuJoCo 提供的工具手动编写或利用其他建模软件生成。 - **设置动作和状态空间**: 动作空间通常表示为连续型的动作范围(例如关节扭矩),而状态空间则由观察到的状态变量组成,比如位置、速度等。 - **step 函数**: 此函数接收当前时间步上的输入动作,并返回下一时刻的状态观测值、奖励信号以及其他辅助信息。 - **render 方法**: 负责渲染模拟器的画面输出,便于调试或者展示实验效果。 - **reset 方法**: 初始化仿真环境至某一随机初始条件之下,以便每次训练迭代都能从不同起点开始探索策略性能。 #### 安装过程 为了能够正常使用 `MujocoEnv`, 用户需先完成以下几个方面的准备工作: 1. 下载官方发布的最新版本二进制文件包, 并按照指示配置好相应的环境变量路径. 2. 确认 Python 开发环境中已成功导入 mujoco_py 库模块. 3. 如果遇到任何依赖项缺失错误提示,则应及时解决这些问题直到所有测试样例均能正常执行为止. ```bash pip install gym[mujoco] ``` 上述命令会自动处理大部分必要的库文件下载工作. #### 实现细节 下面给出一段简化版代码片段作为参考实例说明如何派生一个新的子类别出来: ```python import numpy as np from gym import utils from gym.envs.mujoco import mujoco_env class CustomAntEnv(mujoco_env.MujocoEnv, utils.EzPickle): def __init__(self): xml_path = 'path/to/custom_ant.xml' # 自定义蚂蚁模型的xml文件地址 frame_skip = 5 # 控制频率参数设定 super().__init__(model_path=xml_path, frame_skip=frame_skip) utils.EzPickle.__init__(self) def step(self, a): xposbefore = self.sim.data.qpos[0] self.do_simulation(a, self.frame_skip) xposafter = self.sim.data.qpos[0] forward_reward = (xposafter - xposbefore)/self.dt ctrl_cost = .5 * np.square(a).sum() contact_cost = 0.5 * 1e-3 * sum( max(0, c) for c in self.sim.data.cfrc_ext.flat[:]) survive_reward = 1.0 reward = forward_reward - ctrl_cost - contact_cost + survive_reward state = self.state_vector() notdone = np.isfinite(state).all() and state[2] >= 0.2 and state[2] <= 1.0 done = not notdone ob = self._get_obs() return ob, reward, done, dict(reward_forward=forward_reward, reward_ctrl=-ctrl_cost, reward_contact=-contact_cost, reward_survive=survive_reward) def _get_obs(self): return np.concatenate([ self.sim.data.qpos.flat[2:], self.sim.data.qvel.flat, ]) def reset_model(self): qpos = self.init_qpos + \ self.np_random.uniform(size=self.model.nq, low=-.1, high=.1) qvel = self.init_qvel + \ self.np_random.randn(self.model.nv) * .1 self.set_state(qpos, qvel) return self._get_obs() def viewer_setup(self): self.viewer.cam.distance = self.model.stat.extent * 0.5 ``` 此段程序展示了怎样扩展默认提供的 Ant 运动学结构成为满足特定需求的新变体形式之一.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值