前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >matlab倒立摆环境建模

matlab倒立摆环境建模

作者头像
万木逢春
发布于 2019-11-05 08:05:07
发布于 2019-11-05 08:05:07
1.3K0
举报
文章被收录于专栏:帮你学MatLab帮你学MatLab

matlab强化学习工具箱提供了建立环境的模板对象,我们只要

新建模板rlCreateEnvTemplate("CartPoleEnv")

就可以自行建立需要的学习环境,成功建立之后

env = CartPoleEnv;

就成功得到环境变量、配合强化学习agent就可以进行学习训练

训练之前可以通过

step(env,10);

查看是否正常

下面就是环境对象

classdef CartPoleEnv < rl.env.MATLABEnvironment

%CartPoleEnv: matlab倒立摆环境.

%% 属性设置

properties

% 常量设置

Gravity = 9.8

% 滑块质量

CartMass = 1.0

% 摆杆质量

PoleMass = 0.1

% 摆杆长度的一半(重心)

HalfPoleLength = 0.5

% 推力最值

MaxForce = 10

% 采样时间

Ts = 0.02

% 摆动范围限制

AngleThreshold = 12 * pi/180

% 移动范围限制

DisplacementThreshold = 2.4

% 平衡时的reward

RewardForNotFalling = 1

% 超出平衡范围的reward

PenaltyForFalling = -10

% 保存显示的figure句柄

h

% 是否绘图

show

end

properties

% 初始状态 [x,dx,theta,dtheta]'

State = zeros(4,1)

end

properties(Access = protected)

% 结束标记

IsDone = false

end

%% 必须的方法

methods

% 构造方法

function this = CartPoleEnv()

% 初始设置观察状态

ObservationInfo = rlNumericSpec([4 1]);

ObservationInfo.Name = 'CartPole States';

ObservationInfo.Description = 'x, dx, theta, dtheta';

% 设置动作

ActionInfo = rlFiniteSetSpec([-1 1]);

ActionInfo.Name = 'CartPole Action';

% 继承系统环境

this = this@rl.env.MATLABEnvironment(ObservationInfo,ActionInfo);

% 初始化、设置

updateActionInfo(this);

this.h = figure;

this.show=1;

notifyEnvUpdated(this);

end

% 一次动作的效果

function [Observation,Reward,IsDone,LoggedSignals] = step(this,Action)

LoggedSignals = [];

% 计算推力

Force = getForce(this,Action);

% 取出状态

XDot = this.State(2);

Theta = this.State(3);

ThetaDot = this.State(4);

% 缓存变量

CosTheta = cos(Theta);

SinTheta = sin(Theta);

SystemMass = this.CartMass + this.PoleMass;

temp = (Force + this.PoleMass*this.HalfPoleLength * ThetaDot^2 * SinTheta) / SystemMass;

% 计算运动结果

ThetaDotDot = (this.Gravity * SinTheta - CosTheta* temp) / (this.HalfPoleLength * (4.0/3.0 - this.PoleMass * CosTheta * CosTheta / SystemMass));

XDotDot = temp - this.PoleMass*this.HalfPoleLength * ThetaDotDot * CosTheta / SystemMass;

% 更新状态

Observation = this.State + this.Ts.*[XDot;XDotDot;ThetaDot;ThetaDotDot];

this.State = Observation;

% 检查是否超出范围

X = Observation(1);

Theta = Observation(3);

IsDone = abs(X) > this.DisplacementThreshold || abs(Theta) > this.AngleThreshold;

this.IsDone = IsDone;

% 计算reward

Reward = getReward(this);

% 通知绘图方法进行绘图

notifyEnvUpdated(this);

end

% 环境重置

function InitialObservation = reset(this)

% 初始角度

T0 = 2 * 0.05 * rand - 0.05;

% 初始角速度

Td0 = 0;

% 滑块位置

X0 = 0;

% 滑块速度

Xd0 = 0;

InitialObservation = [T0;Td0;X0;Xd0];

this.State = InitialObservation;

% 通知绘图

notifyEnvUpdated(this);

end

end

%% 可选函数、为了方便自行添加的

methods

% 计算推力

function force = getForce(this,action)

if ~ismember(action,this.ActionInfo.Elements)

error('Action must be %g for going left and %g for going right.',-this.MaxForce,this.MaxForce);

end

force = action;

end

% 设置最大推力

function updateActionInfo(this)

this.ActionInfo.Elements = this.MaxForce*[-1 1];

end

% 计算Reward

function Reward = getReward(this)

if ~this.IsDone

Reward = this.RewardForNotFalling;

else

Reward = this.PenaltyForFalling;

end

end

% 绘制环境

function plot(this)

% 初始化句柄

this.h = figure;

% 通知绘图

envUpdatedCallback(this)

end

% 用于测试环境的几个方法

function set.State(this,state)

validateattributes(state,{'numeric'},{'finite','real','vector','numel',4},'','State');

this.State = double(state(:));

notifyEnvUpdated(this);

end

function set.HalfPoleLength(this,val)

validateattributes(val,{'numeric'},{'finite','real','positive','scalar'},'','HalfPoleLength');

this.HalfPoleLength = val;

notifyEnvUpdated(this);

end

function set.Gravity(this,val)

validateattributes(val,{'numeric'},{'finite','real','positive','scalar'},'','Gravity');

this.Gravity = val;

end

function set.CartMass(this,val)

validateattributes(val,{'numeric'},{'finite','real','positive','scalar'},'','CartMass');

this.CartMass = val;

end

function set.PoleMass(this,val)

validateattributes(val,{'numeric'},{'finite','real','positive','scalar'},'','PoleMass');

this.PoleMass = val;

end

function set.MaxForce(this,val)

validateattributes(val,{'numeric'},{'finite','real','positive','scalar'},'','MaxForce');

this.MaxForce = val;

updateActionInfo(this);

end

function set.Ts(this,val)

validateattributes(val,{'numeric'},{'finite','real','positive','scalar'},'','Ts');

this.Ts = val;

end

function set.AngleThreshold(this,val)

validateattributes(val,{'numeric'},{'finite','real','positive','scalar'},'','AngleThreshold');

this.AngleThreshold = val;

end

function set.DisplacementThreshold(this,val)

validateattributes(val,{'numeric'},{'finite','real','positive','scalar'},'','DisplacementThreshold');

this.DisplacementThreshold = val;

end

function set.RewardForNotFalling(this,val)

validateattributes(val,{'numeric'},{'real','finite','scalar'},'','RewardForNotFalling');

this.RewardForNotFalling = val;

end

function set.PenaltyForFalling(this,val)

validateattributes(val,{'numeric'},{'real','finite','scalar'},'','PenaltyForFalling');

this.PenaltyForFalling = val;

end

end

methods (Access = protected)

% 收到绘图通知开始绘图的方法

function envUpdatedCallback(this)

% 判断是否需要绘图

if ~this.show

return

end

figure(this.h)

clf

% 取出变量

X = this.State(2);

theta = this.State(3);

% 绘制滑块

cartpoly = polyshape([-0.25 -0.25 0.25 0.25],[-0.125 0.125 0.125 -0.125]);

cartpoly = translate(cartpoly,[X 0]);

plot(cartpoly,'FaceColor',[0.8500 0.3250 0.0980])

hold on

% 绘制摆杆

L = this.HalfPoleLength*2;

polepoly = polyshape([-0.1 -0.1 0.1 0.1],[0 L L 0]);

polepoly = translate(polepoly,[X,0]);

polepoly = rotate(polepoly,rad2deg(theta),[X,0]);

plot(polepoly,'FaceColor',[0 0.4470 0.7410])

hold off

xlim([-3 3])

ylim([-1 2])

end

end

end

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 帮你学MatLab 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MATLAB借助openai gym环境训练强化学习模型
虽然openai的gym强化学习环境底层绘图库是pyglet,不太方便自定义,但是已有的环境还是很好用的,有了前面的python环境准备之后,只需要安装gym就可以
万木逢春
2020/07/31
1.8K0
MATLAB借助openai gym环境训练强化学习模型
MATLAB调用pygame实现强化学习环境
前面我们已经能够通过MATLAB调用Python操作键鼠,也在MATLAB环境中建立简单的环境来训练强化学习模型,比如matlab倒立摆环境建模,现在我们需要稍稍复杂的环境,如果在MATLAB中从零开始搭建游戏环境耗时费力,一顿搜索之后也没发现可以利用的游戏m程序,试图通过调用python的gym库时遇到很大难题解决不了,底层pyglet库更是相当底层,想要扩展或者模仿也很有难度,所以我们选用pygame库来实现游戏环境,网上有很多开源的小游戏实现,还有个将pygame游戏包装成为强化学习环境的PLE库
万木逢春
2020/07/16
1.3K0
MATLAB训练CartPole强化学习模型
这次用的环境是移动倒立摆CartPole环境,建立环境模型,主要是对reword进行定义
万木逢春
2022/01/19
1.3K2
MATLAB训练CartPole强化学习模型
MATLAB强化学习训练simulink模型优化
simulink物理结构模型用的是前面文章matlab倒立摆环境建模当在solidworks绘制后导入的,去除子模块封装,添加驱动以及传感器接口,就像这个样子
万木逢春
2020/04/14
2.6K7
matlab强化学习Q-Learning与Sarsa对比
观察下一步选取哪一个动作会带来最大的奖励, 但是在真正要做决定时, 却不一定会选取到那个带来最大奖励的动作, Q-learning 只是估计了一下接下来的动作值
万木逢春
2019/09/05
1.5K0
matlab强化学习Q-Learning与Sarsa对比
matlab倒立摆强化学习训练
Actor(玩家):为了得到尽量高的reward,实现一个函数:输入state,输出action。用神经网络来近似这个函数。目标任务就是如何训练神经网络,让它的表现更好(得更高的reward)。这个网络被称为actor Critic(评委):为了训练actor,需要知道actor的表现到底怎么样,根据表现来决定对神经网络参数的调整。这就要用到强化学习中的“Q-value”、但Q-value也是一个未知的函数,所以也可以用神经网络来近似。这个网络被称为critic。
万木逢春
2019/11/10
1.5K0
Stanford 机器学习练习 Part 2 Logistics Regression
以下是我学习Andrew Ng machine learning 课程时logistic regression的相关代码,仅作为参考,因为是初学,暂时没办法做出总结。
xindoo
2021/01/21
3140
【深度强化学习】—— 入门
‍Deep RL(Deep Reinforcement Learning) is a type of Machine Learning where an agent learns how to behave in an environment by performing actions and seeing the results.(译:强化学习是机器学习的一个分支,强化学习最大的特点是在交互中学习(Learning from Interaction)。Agent 在与环境的交互中根据获得的奖励或惩罚不断的学习知识,更加适应环境。RL学习的范式非常类似于我们人类学习知识的过程,也正因此,RL被视为实现通用AI重要途径。)
WEBJ2EE
2022/03/30
6400
【深度强化学习】—— 入门
我用MATLAB撸了一个2D LiDAR SLAM
将提供的2DLiDAR数据集’b0-2014-07-11-10-58-16.bag’,转为matlab的.mat数据文件,这其中包括有5522批次扫描数据,每次扫描得到1079个强度点。如下:
用户1150922
2019/05/27
1.9K1
matlab强化学习Sarsa与Sarsa(lambda)对比
适用于回合型环境,要等到回合结束, 才开始对本回合所经历的所有步都添加更新, 但是这所有的步都是和宝藏有关系的, 都是为了得到宝藏需要学习的步, 所以每一步在下回合被选中的几率又高了一些
万木逢春
2019/09/16
9760
matlab强化学习Sarsa与Sarsa(lambda)对比
Matlab实现小波变换
[1] Rafael C. Gonzalez, Richard E. Woods, and Steven L. Eddins. 2003. Digital Image Processing Using MATLAB. Prentice-Hall, Inc., USA.
timerring
2023/03/07
8050
PyTorch 2.2 中文官方教程(八)
这个教程将带你了解深度强化学习的基础知识。最后,你将实现一个能够自己玩游戏的 AI 马里奥(使用双深度 Q 网络)。
ApacheCN_飞龙
2024/02/05
3900
PyTorch 2.2 中文官方教程(八)
强化学习Double DQN方法玩雅达利Breakout游戏完整实现代码与评估pytorch
Breakout是一款经典的雅达利游戏,也就是我们所熟知的“打砖块”。玩家需要左右移动在屏幕下方的短平板子将一颗不断弹跳的小球反弹回屏幕上方,使其将一块块矩形砖块组成的六行砖块墙面打碎,并防止小球从屏幕底部掉落。在Atari 2600版本的Breakout中,玩家共有5次小球掉落机会,一旦用完就标志游戏结束,每打掉一块砖块得1分,全部打掉则游戏胜利结束。
Ranlychan
2024/01/10
1.1K0
matlab控制倒立摆小车并绘制二维动态效果图[通俗易懂]
clc;close all;clear A = [0 1 0 0;0 0 -1.176 0;0 0 0 1;0 0 18.293 0];%设置倒立摆小车控制系统参数 B = [0; 1 ;0;-1.667]; C =[1 0 0 0;0 0 1 0]; G = [42.85 1.04;471.83 22.39;0.94 43.15;19.17 464.64]; K = [-9.1841 -10.7148 -63.8735 -15.4258]; sim(‘CAR.mdl’); %运行倒立摆小车控制系统simulink模型’CAR.mdl’
全栈程序员站长
2022/09/23
8100
matlab控制倒立摆小车并绘制二维动态效果图[通俗易懂]
MATLAB非线性可视化(引3)多摆模型
事实上,非线性存在于物理与工程中的各个领域。在机械中,就存在着大量的非线性现象。通过双摆和三摆的例子,来感受到一个小的扰动,随着时间的推移,到最终会带来多大的变化。
巴山学长
2023/03/15
6930
MATLAB非线性可视化(引3)多摆模型
资源 | 跟着Sutton经典教材学强化学习中的蒙特卡罗方法(代码实例)
大数据文摘出品 作者:Ray Zhang 编译:halcyon、龙牧雪 用动态规划去解决强化学习的相关问题基本够了,但还是有很多限制。比如,你知道现实世界问题的状态转移概率吗?你能从任意状态随机开始吗?你的MDP是有限的吗? 好消息是,蒙特卡罗方法能解决以上问题!蒙特卡罗是一种估计复杂的概率分布的经典方法。本文部分内容取自Sutton的经典教材《强化学习》,并提供了额外的解释和例子。 初探蒙特卡罗 蒙特卡罗模拟以摩纳哥的著名赌场命名,因为机会和随机结果是建模技术的核心,它们与轮盘赌,骰子和老虎机等游戏非常相
大数据文摘
2018/06/29
7830
2个范例带你读懂高阶API建模方法
TensorFlow的高阶API主要为tf.keras.models提供的模型的类接口。
lyhue1991
2020/07/20
4840
2个范例带你读懂高阶API建模方法
详解蒙特卡洛方法:这些数学你搞懂了吗?
之前我们讨论过马尔可夫决策过程(MDP,参阅 https://goo.gl/wVotRL)以及寻找最优的动作-价值函数
机器之心
2018/07/30
1.1K0
详解蒙特卡洛方法:这些数学你搞懂了吗?
代码详解——MATLAB/Simulink实时性仿真
[1] 白国星, 刘丽, 孟宇, 等. 基于非线性模型预测控制的移动机器人实时路径跟踪[J/OL]. 农业机械学报: 1-13 [2020-09-27]. http://kns.cnki.net/kcms/detail/11.1964.S.20200703.1012.004.html.
路径跟踪快讯
2020/10/09
1.9K0
代码详解——MATLAB/Simulink实时性仿真
NumPyML 源码解析(五)
The preprocessing module implements common data preprocessing routines.
ApacheCN_飞龙
2024/02/17
2300
推荐阅读
相关推荐
MATLAB借助openai gym环境训练强化学习模型
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档