引言
倒立摆(Inverted Pendulum)作为一种经典的控制问题,在机器人学、航空航天等领域有着广泛的应用。传统的倒立摆控制方法,如PID控制、线性二次调节器(LQR)、滑模控制等,虽然能够取得一定的效果,但在面对非线性、不确定性和复杂环境变化的情况下,其适应性和鲁棒性往往受到限制。近年来,随着人工智能技术的发展,特别是强化学习(Reinforcement Learning, RL)方法逐渐被引入到倒立摆的控制中,因其具备无需精确模型即可学习最优策略的能力而备受关注。基于强化学习的倒立摆平衡控制算法是一种非常实用的技术,在机器人学、自动化等领域有着广泛的应用。倒立摆问题是一个经典的控制问题,它涉及到使一个摆保持在不稳定的直立位置。强化学习方法可以自动学习控制策略,而不需要显式地了解系统的动力学模型。本文将详细介绍基于强化学习的倒立摆平衡控制算法,包括强化学习的基本概念、倒立摆的动力学模型、常用的强化学习算法(如Q-learning和Policy Gradients),以及如何将这些算法应用于倒立摆平衡控制问题。
1.强化学习理论基础
强化学习是一种机器学习方法,它使代理能够在环境中通过与环境交互来学习最优的行为策略。其核心思想是代理通过观察环境状态、采取行动并获得奖励或惩罚来学习如何最大化累积奖励。强化学习是一种通过试错方式让智能体(Agent)在与环境交互的过程中学习最佳行为策略的方法。其基本框架包含三个核心元素:智能体、环境以及奖励机制。
-
智能体(Agent):执行动作的主体。
-
环境(Environment):智能体所处的世界,可以影响智能体的状态。
-
奖励(Reward):用于评估智能体采取的动作好坏的标准,智能体的目标是最大化累积奖励。
1.1 Markov决策过程(MDP)
强化学习中的决策过程通常被建模为马尔可夫决策过程(Markov Decision Process, MDP)。MDP由五元组<�S, �A, �P, �R, �γ>定义:
S 是所有可能状态的集合。
A 是所有可能动作的集合。
P 是状态转移概率,即给定状态 s 和动作a,转移到状态s′ 的概率P(s′∣s,a)。
R 是奖励函数,即给定状态s 和动作a,得到的即时奖励R(s,a)。
1.2 策略与价值函数
策略(Policy):策略π(a∣s)定义了给定状态下选择特定动作的概率分布。
价值函数(Value Function):价值函数量化了策略的好坏,主要有两种形式:
状态价值函数(State Value Function):Vπ(s) 表示按照策略π,从状态s开始所能获得的期望回报。
动作价值函数(Action Value Function):Qπ(s,a) 表示按照策略π,从状态s采取动作a所能获得的期望回报。
2.倒立摆动力学模型
倒立摆可以简化为一个单自由度系统。设摆长为l,摆的质量为m,小车的质量为M,摆角为θ,小车的位置为x,则摆的运动方程可以表示为:
其中F 是作用于小车上的力,g 是重力加速度。
其中,
-
m 是倒立摆的质量。
-
x 是小车的位置。
-
θ 是摆杆与垂直方向的夹角。
-
F 是施加于小车上的水平力。
-
g 是重力加速度。
-
b 是摩擦系数。
-
l 是摆杆的长度。
为了简化问题,我们通常会假设摆杆质量集中在顶端,并忽略空气阻力等因素的影响。
3.基于强化学习的****倒立摆控制系统
1.状态与动作空间
在强化学习框架下,我们需要定义状态空间S和动作空间A。对于倒立摆而言,状态空间可能包含小车位置x、摆杆角度θ、小车速度x˙和摆杆角速度θ˙。动作空间则是施加于小车的水平力F。
2.奖励函数设计
奖励函数的设计直接影响学习的效果。对于倒立摆的平衡控制问题,奖励函数应该鼓励摆杆保持在竖直方向附近,同时尽量减少对小车的控制力。一个简单的奖励函数可能是:
3.学习算法
Q-learning是一种无模型的强化学习算法,适用于离散状态和动作空间的情况。其目标是找到最优的动作价值函数Q∗(s,a)。
4.训练过程
强化学习的训练过程涉及状态的观测、动作的选择、奖励的接收以及策略的更新。具体步骤如下:
-
初始化:设定初始状态s0,初始化策略π。
-
观测:从环境获取当前状态st。
-
决策:根据当前策略选择动作at。
-
执行:执行动作at,并观察下一个状态
st+1及奖励
rt+1。 -
学习:根据
st,at,
rt+1, st+1更新策略
π。 -
重复:回到步骤2,直到满足结束条件。
在实际应用中,强化学习算法需要经过大量的仿真或实验来调整超参数,如学习率、探索率等,以达到满意的控制效果。评估指标通常包括摆杆稳定的时间长度、控制力的大小以及学习收敛的速度等。
4.MATLAB程序
使用MATLAB实现:
% 函数定义:根据目标位置与两连杆初始角度生成机器人模型并模拟运动``function func_robot(X1,Y1,Arm1,Arm2,Iters)``% 初始化机器人模型,最大身体数量为3,数据格式为列向量``robot = robotics.RigidBodyTree('DataFormat','column','MaxNumBodies',3);` `% 定义连杆长度``L1 = 5; % 连杆1长度``L2 = 5; % 连杆2长度` `% 创建第一个连杆和关节``body = robotics.RigidBody('link1');``joint = robotics.Joint('joint1', 'revolute');``% 设置关节固定变换(无位移)``setFixedTransform(joint,trvec2tform([0 0 0]));``joint.JointAxis = [0 0 1]; % 关节轴沿Z方向``body.Joint = joint;``addBody(robot, body, 'base'); % 将连杆添加到基座上` `% 同理创建第二个连杆及关节,并将其连接到第一个连杆``body = robotics.RigidBody('link2');``joint = robotics.Joint('joint2','revolute');``setFixedTransform(joint, trvec2tform([L1,0,0])); % 沿X轴偏移L1``joint.JointAxis = [0 0 1];``body.Joint = joint;``addBody(robot, body, 'link1');` `% 创建末端执行器并固定于第二个连杆``body = robotics.RigidBody('tool');``joint = robotics.Joint('fix1','fixed');``setFixedTransform(joint, trvec2tform([L2, 0, 0]));``body.Joint = joint;``addBody(robot, body, 'link2');` `% 显示机器人模型细节``showdetails(robot)` `% 初始化角度序列变量``k = 1;` `% 根据连杆1角度范围生成角度序列``if(Arm1>30)` `for i = 30:Arm1` `qs(k,1) = i*pi/180; % 转换为弧度` `qs(k,2) = 30*pi/180; % 初始化连杆2角度` `k = k+1;` `end``else` `for i = 30:-1:Arm1` `qs(k,1) = i*pi/180;` `qs(k,2) = 30*pi/180;` `k = k+1;` `end``end ``% 类似地处理连杆2角度序列``if(Arm2>30)` `for j = 30:Arm2` `qs(k,2) = j*pi/180;` `qs(k,1) = i*pi/180; % 使用前一循环的i值` `k = k+1;` `end``else` `for j = 30:-1:Arm2` `qs(k,2) = j*pi/180;` `qs(k,1) = i*pi/180;` `k = k+1;` `end``end` `% 绘制机器人模型并设置视图``figure``show(robot,qs(1,:)');``view(2)``ax = gca;``ax.Projection = 'orthographic'; % 设置正交投影``hold on``% 绘制目标点``for l = 1:size(qs,1)` `points(l,1) = X1;` `points(l,2) = Y1;``end``scatter(points(:,1),points(:,2),'k'); % 散点图表示目标位置``% 添加标题与坐标轴限制``title(Iters); % 代数或迭代次数``axis([-11 11 -11 11]) % 设置坐标轴范围``% 动画模拟``framesPerSecond = 15; % 帧率``r = robotics.Rate(framesPerSecond);``for i = 1:size(qs,1)` `show(robot,qs(i,:)','PreservePlot',false); % 更新姿势显示` `drawnow % 更新图形窗口` `waitfor(r); % 等待以保持帧率``end``end``up4121
仿真结构如下:
总结
通过强化学习方法解决倒立摆的平衡控制问题不仅展示了机器学习在控制领域中的应用潜力,也为解决其他复杂的非线性控制问题提供了新的思路。随着计算资源的不断进步和算法研究的深入,强化学习将在更多领域展现出其独特的优势。然而,值得注意的是,强化学习的成功实施还面临许多挑战,如样本效率、泛化能力等问题,这些都是未来研究的重要方向。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。