首页/文章/ 详情

2-43 倒立摆存在未知非线性时,RBF 网络怎样在线逼近并完成摆角跟踪?

9天前浏览170
文末获取源代码
一句话介绍: 这套 MATLAB / Simulink 程序把一级倒立摆写成“已知控制增益 + 待逼近非线性项”的二阶系统,利用 5 节点 RBF 网络在线估计未知非线性函数,再把估计补偿、期望加速度和 PD 型误差反馈组合成控制输入,使初始存在摆角偏差的倒立摆跟踪 0.1sin(t) 参考轨迹,同时输出真实非线性项与 RBF 估计值用于对比。

先看它解决什么问题

一级倒立摆的困难并不只是“摆杆会倒”。

从当前源码看,模型的角加速度同时受三类因素影响:

重力产生的非线性项;

摆角、角速度共同形成的耦合项;

控制输入通过随摆角变化的输入增益进入系统。

如果控制器完全依赖精确的非线性模型,一旦其中某一部分未知或者建模不准,固定模型补偿就会出现偏差。

当前程序采用的思路是:

参考摆角 → 计算跟踪误差 → RBF 网络估计未知非线性项 → 自适应更新网络权值 → 误差反馈与非线性补偿合成控制量 → 倒立摆响应 → 继续闭环修正

围绕直立位置的小幅正弦摆角自适应跟踪,而不是单纯把摆杆稳定在零角度。

1. 当前工程实际上由哪些文件组成?

压缩包中的工程很精简,没有外部数据集、训练样本或预训练模型,核心就是一个 Simulink 闭环模型和两个 M 文件 S-Function。


文件

当前工程中的作用

chap1_1sim.mdl

主 Simulink 模型,连接参考轨迹、误差、RBF 控制器和倒立摆对象

chap1_1ctrl.m

RBF 网络自适应控制器,包含 5 个连续权值状态

chap1_1plant.m

一级倒立摆非线性对象

chap1_1plot.m

绘制摆角跟踪、角速度跟踪、控制输入以及非线性函数估计结果

真正的主入口是:chap1_1sim.mdl

模型默认采用 ode45 连续求解器,仿真时间为:0~30 s

相对误差容限设置为:1e-5

所以这不是先离线训练一个 RBF 网络再加载权值,而是:

仿真开始时网络权值全部为 0,随着闭环运行实时更新。

2. 当前倒立摆从什么状态开始,又要跟踪什么?

chap1_1plant.m 中只有两个连续状态:

x = [θ, ω]ᵀ

其中:

θ:摆角;

ω:摆角速度。

初始状态为:θ(0) = π/60 rad、ω(0) = 0

也就是摆杆初始偏离直立位置约:3°

而参考轨迹来自 Simulink 的 Sine Wave 模块:

y_d = 0.1sin(t)

对应参考角速度和参考角加速度分别为:

ẏ_d = 0.1cos(t)

ÿ_d = -0.1sin(t)

因此参考摆角幅值为:0.1 rad,约 5.73°

程序的任务不是把初始 3° 偏差直接压到一个固定零点,而是让实际摆角逐渐进入这条周期参考轨迹。

3. 一级倒立摆的非线性模型是怎样写进程序的?

当前对象使用的是一个二阶摆角动力学模型。

最核心的状态关系为:

θ̇ = ω

ω̇ = f(θ,ω) + G(θ)u

这里 u 是控制输入。

源码先定义一个中间量:

S(θ) = l[4/3 - m cos²(θ)/(m_c+m)]

然后计算非线性项:

f(θ,ω) = [g sin(θ) - m·l·ω²cos(θ)sin(θ)/(m_c+m)] / S(θ)

控制输入增益为:

G(θ) = [cos(θ)/(m_c+m)] / S(θ)

当前固定物理参数为:


项目

当前值

重力加速度 g

9.8

小车质量 m_c

1.0

摆杆质量 m

0.1

摆长 l

0.5

这里最关键的是:

f(θ,ω)在被控对象里虽然有明确公式,但控制器并不直接读取这个真实值,而是让 RBF 网络在线逼近它。

因此这是一个典型的“仿真对象知道真实模型、控制器假定其中一部分未知”的自适应控制实验。

4. 控制器首先拿到的并不是摆角,而是跟踪误差

Simulink 中参考轨迹和实际摆角先经过求和模块。

当前误差定义为:e = y_d - θ

误差经过 Derivative 模块后形成误差变化率。连续模型下可以理解为:

ė = ẏ_d - ω

随后两者被送进控制器:E = [e, ė]ᵀ

控制器又根据硬编码的参考轨迹反推出:

x₁ = y_d - e

x₂ = ẏ_d - ė

理论上这两项分别对应:

x₁ = θ

x₂ = ω

不过需要注意,当前源码虽然计算了 x₁ 和 x₂,后续并没有完整使用它们,这一点会在后面的源码边界中单独说明。

5. 为什么这里不是只使用一个固定 PD 控制器?

当前程序确实使用了比例和微分反馈:k_p = 30、k_d = 50

如果只看误差反馈部分,可以理解成:k_p·e + k_d·ė

这种反馈能够根据位置误差和速度误差不断修正控制量。

但倒立摆中还存在 f(θ,ω) 这样的非线性项。

如果它完全未知,单纯依靠固定 PD 参数只能通过误差间接抵消它,而不能主动估计并补偿这部分动态。

所以当前程序在 PD 反馈之外又增加了一条:

未知非线性在线估计链

即:e、ė → RBF 网络 → f̂ → 非线性补偿

最终形成:

RBF 自适应补偿 + 期望加速度前馈 + PD 误差反馈

这才是当前控制器与普通固定 PD 的主要区别。

6. 5 个 RBF 节点具体怎样逼近未知函数?

RBF 网络的输入不是直接使用摆角和角速度,而是:

ξ = [e, ė]ᵀ

程序设置了 5 个二维高斯基函数中心:

c₁ = (-2,-2)、c₂ = (-1,-1)、c₃ = (0,0)、c₄ = (1,1)、c₅ = (2,2)

因此这里是:5 个二维节点

而不是 5×5=25 个网格节点。

所有节点共用宽度:b = 0.20

第 j 个节点输出为:

hⱼ = exp[-||ξ-cⱼ||²/(2b²)]

5 个网络权值记为:

W = [w₁,w₂,w₃,w₄,w₅]ᵀ

于是 RBF 网络给出的非线性估计为:f̂ = Wᵀh

仿真开始时:W(0) = [0,0,0,0,0]ᵀ

所以初始时刻网络没有预先学到任何非线性规律。

它必须依靠后面的自适应律,在控制过程中逐渐调整权值。

7. RBF 权值为什么能够在运行过程中自己变化?

5 个网络权值本身就是 chap1_1ctrl.m 中的 5 个连续状态。

程序定义:Φ = [[0,1],[-k_p,-k_d]]

并令:A = Φᵀ

同时使用:Q = 500I₂

然后通过 MATLAB 的 lyap 求取矩阵 P,满足:

AP + PAᵀ + Q = 0

再定义:B = [0,1]ᵀ

当前自适应增益为:γ = 1200

最终权值更新关系可以直接概括为:Ẇ = -γ(EᵀPB)h

这里不需要把它展开成完整的自适应控制理论推导。

对当前程序来说,最重要的直觉是:

跟踪误差越能在当前 RBF 节点上形成有效激励,对应节点的权值就越会被更新;当误差逐渐减小时,网络权值也逐渐趋于稳定。

所以 RBF 网络并不是独立于控制器训练,而是:

误差产生学习信号 → 网络权值变化 → 非线性估计变化 → 控制输入变化 → 新误差再次驱动学习

构成一个连续闭环。

8. 最终控制输入是怎样合成出来的?

当前程序先得到 RBF 输出:f̂ = Wᵀh

然后把参考角加速度、误差反馈和非线性补偿组合起来。

控制关系为:

u = [-f̂ + ÿ_d + KᵀE] / G_c

其中:K = [30,50]ᵀ

所以三个主要部分分别是:

-f̂:抵消 RBF 网络估计出来的未知非线性;

ÿ_d:给出参考轨迹本身需要的加速度;

KᵀE:利用位置和速度误差继续闭环校正。

理想情况下,如果 f̂ 足够接近真实 f,控制器面对的剩余动态就更接近人为设定的误差系统。

简单理解就是:

RBF 网络负责“学出不知道的那部分”,PD 型反馈负责“把没跟上的误差拉回来”。

9. Simulink 里完整的闭环到底是怎样连起来的?

主模型中的实际信号链很清楚。

参考轨迹首先进入求和模块,与倒立摆反馈角度形成误差;误差及其导数再送入 chap1_1ctrl,控制器输出 u 驱动 chap1_1plant,对象输出的新摆角继续反馈。

完整闭环可以写成:

0.1sin(t)→ 跟踪误差e→ 误差导数ė→ RBF 自适应控制器 → 控制输入u→ 非线性倒立摆 →θ、ω→ 反馈到误差端

模型同时把几组关键量保存到 MATLAB 工作区。

y 中保存:[y_d, θ, ω]、u 中保存:

控制输入fx 中保存:[真实 f, RBF 估计 f̂]

t 中保存:仿真时间

所以 chap1_1plot.m 后续实际上在检查三件事:

实际摆角能否跟上参考摆角;

实际角速度能否跟上参考角速度;

RBF 网络的 f̂ 能否逐渐接近对象中的真实 f。

10. 按当前源码等价复算,跟踪过程是什么水平?

当前压缩包没有附带 .mat 结果文件或原作者运行截图,因此不能把某张历史曲线当成已经保存的项目结果。

不过当前对象和控制器都是连续状态方程,可以按源码原样进行等价复算。将 Simulink Derivative 模块按连续关系 ė=ẏ_d-ω 处理,并保持当前全部模型参数不变,0~30 s 仿真得到的代表性数值约为:


指标

按当前源码等价复算

初始绝对摆角跟踪误差

0.05236 rad

25~30 s 位置误差 RMS

约 1.03×10⁻⁴ rad

25~30 s 最大绝对位置误差

约 1.35×10⁻⁴ rad

0~30 s 最大绝对控制输入

约 2.34

25~30 s 的 f-f̂ RMS

约 8.74×10⁻³

其中最大位置误差出现在初始时刻,因为:y_d(0)=0

而:θ(0)=π/60≈0.05236 rad

进入后期以后,实际摆角已经能够非常接近参考正弦轨迹。

需要注意,源码没有对控制输入 u 明确标注物理单位,所以这里保留其程序数值,不自行补写单位。

同样,这些数字属于:

按当前源码状态方程得到的等价复算结果,而不是压缩包中读取到的原作者固定结果文件。

11. 5 个 RBF 节点在当前工况下真的都会发挥作用吗?

当前参考摆角只有 0.1 rad 的幅值,实际误差主要活动在零附近,而 RBF 中心却放在:

(-2,-2) → (-1,-1) → (0,0) → (1,1) → (2,2)

同时宽度只有:b=0.20

这意味着当 e 和 ė 都比较小时,位于 (0,0) 的第 3 个节点响应最明显,距离 ±1、±2 的节点响应会快速衰减。

按当前源码等价复算,30 s 结束附近主要变化的也是第 3 个权值,其数值约为:w₃ ≈ -1.57

其余远离原点的几个权值仍然非常接近 0。

因此虽然结构上是一个 5 节点 RBF 网络,但在当前小幅跟踪工况下,它更接近:

由原点附近的中心节点承担主要逼近任务。

如果把参考轨迹幅值、初始偏差或运行工况扩大,当前中心位置与 b=0.20 是否还能覆盖新的误差区域,就需要重新验证。

12. 当前源码有哪些必须公开的实现边界?

这套程序的自适应控制链是完整的,但源码中有几处非常值得注意。

第一处:控制增益使用了 RBF 权值状态 x(1)

在 chap1_1ctrl.m 的输出函数中,程序先计算:x1 = y_d - e

理论上这正好可以还原当前摆角。

但后面计算控制增益时实际使用的是:cos(x(1))

这里的 x 并不是倒立摆状态,而是控制器内部的 5 个 RBF 权值状态。

也就是说,当前源码实际用:第 1 个 RBF 权值

进入了本应与摆角相关的输入增益计算。

而刚刚计算出的 x1 并没有用在这里。

如果原始设计意图是根据当前摆角计算 G(θ),那么这里需要重点核对是否原本应使用 x1。

本文按照压缩包中的现有源码理解和复算,不擅自把这一处改掉。

第二处:这是理想仿真模型,不是完整小车倒立摆工程模型

当前对象只有:摆角 + 摆角速度两个状态。

源码中虽然包含小车质量 m_c,但没有把小车位移、速度、轨道边界、执行器饱和、传感器噪声等作为状态或约束加入模型。

误差导数也直接使用 Simulink Derivative 模块。

因此它适合研究:

RBF 自适应非线性补偿和摆角跟踪机制

但不能直接等同于包含真实执行器、噪声和小车位移约束的完整倒立摆实验平台。

13. 当前程序里哪些参数最值得修改?

真正值得实验的不是所有常数,而是那些会直接改变闭环动态或 RBF 学习行为的参数。


参数

当前值

为什么值得改

调整后的主要影响

k_p、k_d

30、50

直接决定误差反馈强度

会改变跟踪速度、阻尼和控制输入大小

γ

1200

决定 RBF 权值自适应速度

过小学习慢,过大可能使权值变化过于激烈

b

0.20

决定每个高斯节点覆盖范围

增大后节点响应更宽,减小后局部性更强

RBF 中心 c

-2~2 的 5 个对角节点

决定网络在哪些误差区域具有有效基函数

工况扩大后通常需要结合误差范围重新布局

y_d

0.1sin(t)

直接决定当前跟踪任务

修改时必须同时同步 Simulink 正弦模块和控制器内部 y_d、ẏ_d、ÿ_d

在当前小幅工况下,最需要留意的是 RBF 中心与宽度的组合。

因为中心相距 1,而 b 只有 0.20,实际误差又集中在零附近,所以网络有效激活范围明显偏向中心节点。

14. 怎么运行这套程序?

主模型为:chap1_1sim.mdl

打开模型后即可按照当前配置进行 30 s 连续仿真。

当前工程至少依赖:

MATLAB;Simulink;

即可按照工程自带绘图逻辑检查:

参考摆角与实际摆角 → 参考角速度与实际角速度 → 控制输入 → 真实非线性项与 RBF 估计值

如果要修改目标正弦轨迹,不要只改模型中的 Sine Wave,还必须同步修改 chap1_1ctrl.m 中的参考位置、速度和加速度表达式。

15. 一句话看懂这个项目

这是一个 MATLAB / Simulink 一级倒立摆 RBF 网络自适应控制程序:对象以摆角和角速度构成二阶非线性模型,默认从 3° 初始摆角出发跟踪幅值 0.1 rad 的正弦参考;控制器以位置误差和误差变化率作为 5 节点 RBF 网络输入,用在线更新的权值逼近对象中的未知非线性项,再把 RBF 补偿、参考加速度和k_p=30、k_d=50的误差反馈合成为控制量。按当前源码等价复算,25~30 s 位置误差 RMS 约为 1.03×10⁻⁴ rad,同时也能观察到真实f与估计f̂的逐渐接近。需要特别注意,当前控制器计算输入增益时使用了 RBF 权值状态x(1)而不是已经恢复出的摆角x1,参考轨迹也同时存在于 Simulink 和控制器硬编码中,因此这套程序更适合作为 RBF 自适应非线性控制原理与仿真实验工程来理解和扩展。


来源:MATLAB学习与应用
非线性MATLABSimulink理论控制Plant
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2026-09-30
最近编辑:9天前
explicit-z
硕士 工种号:MATLAB学习与应用
获赞 212粉丝 79文章 326课程 5
点赞
收藏
作者推荐
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习计划 福利任务
下载APP
联系我们
帮助与反馈