
一句话介绍: 这套 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. 当前源码有哪些必须公开的实现边界?
这套程序的自适应控制链是完整的,但源码中有几处非常值得注意。
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 自适应非线性控制原理与仿真实验工程来理解和扩展。