倒立摆系统作为控制理论中的经典问题,一直被视为检验各类控制算法性能的"试金石"。这个看似简单的物理系统(一根摆杆通过关节连接在小车上)却蕴含着丰富的非线性动力学特性,对控制器的实时性和鲁棒性提出了极高要求。传统PID控制虽然能实现基本平衡,但在参数调节和抗干扰能力方面存在明显局限。
去年我在参与一个自动化仓储项目时,就遇到了类似场景——需要设计一套能够自主调整姿态的物流搬运车。当时尝试了多种控制方法后,最终发现基于Q-Learning的强化学习方案在动态环境适应性上表现尤为突出。这促使我决定用Matlab搭建一个完整的仿真环境,系统性地验证这类算法在倒立摆控制中的实际效果。
建立精确的数学模型是仿真的基础。通过拉格朗日方程推导,得到小车倒立摆系统的非线性动力学方程:
code复制(m_c + m_p)ẍ + m_p l θ̈ cosθ - m_p l θ̇² sinθ = F
m_p l ẍ cosθ + (I + m_p l²)θ̈ - m_p g l sinθ = 0
其中m_c为小车质量(我设置为0.5kg),m_p为摆杆质量(0.2kg),l为摆杆质心到转轴距离(0.3m),I为摆杆转动惯量。这个方程组揭示了系统的高度非线性特性——控制力F与摆角θ之间存在复杂的耦合关系。
在Simulink中搭建的仿真模型包含以下几个关键模块:
特别要注意的是采样时间设置。经过多次测试,发现将仿真步长设为0.02秒(对应50Hz控制频率)能在计算精度和实时性之间取得较好平衡。更小的步长会导致训练时间剧增,而大于0.05秒则会出现明显的控制滞后。
将连续状态变量离散化是Q-Learning的关键步骤。我的具体处理方式:
这样形成的状态空间总维度为10×8×15×12=14,400。这个规模既能保证控制精度,又不会导致"维度灾难"。实际测试发现,将角度分辨率提高到20个区间时,训练时间会呈指数增长,但控制效果提升有限。
动作空间简化为三个离散值:
奖励函数采用分段设计:
matlab复制if abs(θ) > pi/2 % 摆杆倒下
reward = -100;
elseif abs(x) > 2.4 % 小车出界
reward = -50;
else
reward = 1 - 0.1*abs(θ) - 0.05*abs(x);
end
这种设计既惩罚失败状态,又鼓励摆杆保持竖直和小车居中。系数0.1和0.05是通过参数扫描找到的最佳平衡点。
初始阶段设置ϵ=0.9(高探索率),随着训练轮次按以下规律衰减:
matlab复制epsilon = max(0.1, 0.9*exp(-episode/500))
这样在前500轮保持较强探索,之后逐渐偏向利用已有知识。实测发现这种衰减方式比线性衰减收敛更快。
采用动态学习率方案:
matlab复制alpha = 0.7 / (1 + episode/1000)
折扣因子γ经过对比实验,最终确定为0.95。这个值既能保证长期回报的考虑,又避免奖励传播过于分散。
建立容量为5000的循环缓冲区存储(s,a,r,s')转移样本。每步更新时随机抽取32个样本进行批量学习,显著提高了数据利用率。在Matlab中可以用circular buffer对象高效实现:
matlab复制buffer = circularBuffer(5000);
buffer.put([state,action,reward,new_state]);
batch = buffer.sample(32);
在Core i7-11800H处理器上,完整训练需要约2小时(5000轮)。观察到的典型收敛曲线:
成功标准设为连续100轮平均奖励>0.8,本系统平均在1200轮左右达到。
在系统平衡后施加脉冲干扰(模拟外力冲击):
| 指标 | Q-Learning | PID控制 | LQR控制 |
|---|---|---|---|
| 稳定时间(s) | 1.2 | 3.5 | 2.0 |
| 抗干扰性 | ★★★★☆ | ★★☆☆☆ | ★★★☆☆ |
| 参数调节难度 | 自动学习 | 困难 | 中等 |
| 计算资源需求 | 高 | 低 | 中 |
初期尝试将速度变量划分得过细(20个区间),导致:
尝试过多种奖励函数设计后,发现:
在最终部署时,采用以下加速策略:
当前系统可以进一步扩展:
我在实验中发现,当摆杆质量分布不均匀时(比如顶端装有传感器),需要在动力学方程中加入额外项。这种情况下,强化学习的优势更加明显——它能自动适应模型的不确定性,而传统控制方法需要重新建模和调参。