1. 项目概述
小车倒立摆是控制理论中的经典基准模型,由可移动的小车和铰接其上的摆杆组成。这个项目的核心挑战在于:如何让小车在环形轨道上运动的同时,保持摆杆始终处于竖直平衡状态。传统控制方法(如PID控制)虽然有效,但需要精确的数学模型和参数调校。而基于Q-Learning的强化学习方案则提供了一种无需精确建模的自适应控制方法。
我在实际项目中发现,三维环形轨道场景比传统的直线轨道更具挑战性,因为引入了额外的向心加速度和角度变化。通过MATLAB仿真,我们可以直观地观察控制效果,并验证Q-Learning算法在这种复杂场景下的适用性。
2. 核心算法原理
2.1 Q-Learning基础框架
Q-Learning是一种无模型的强化学习算法,其核心是学习一个状态-动作价值函数Q(s,a)。这个函数表示在状态s下采取动作a后,预期能获得的累积奖励。算法通过不断与环境交互来更新Q值,最终形成最优控制策略。
在实际应用中,我发现以下几个关键点特别重要:
- 状态表示要足够表征系统动态
- 动作空间设计要平衡控制精度和计算复杂度
- 奖励函数要准确反映控制目标
2.2 倒立摆动力学建模
倒立摆系统的动力学可以用拉格朗日方程描述。设小车质量为M,摆杆质量为m,摆杆长度为2l,摆杆与垂直方向夹角为θ,则系统动力学方程为:
code复制(M+m)ẍ + mlθ̈cosθ - mlθ̇²sinθ = F
mlẍcosθ + (4/3)ml²θ̈ - mglsinθ = 0
在环形轨道场景下,我们需要将直角坐标系转换为极坐标系。设轨道半径为R,小车角位置为φ,则转换关系为:
x = Rcosφ
y = Rsinφ
这种转换引入了额外的向心加速度项,增加了控制难度。
3. 算法实现细节
3.1 状态空间设计
在实际实现中,我将状态空间离散化为以下几个维度:
- 摆杆角度θ:离散化为20个区间
- 摆杆角速度θ̇:离散化为20个区间
- 小车位置φ:离散化为36个区间(每10度一个区间)
- 小车速度φ̇:离散化为10个区间
这样总状态数为20×20×36×10=144,000。虽然看起来很大,但通过合理的哈希函数可以高效存储和访问。
3.2 动作空间设计
动作空间定义为施加在小车上的力,离散化为7个等级:
F ∈ {-30, -20, -10, 0, +10, +20, +30} N
在实际测试中,我发现这种离散化提供了足够的控制精度,同时保持了合理的计算效率。更精细的离散化虽然能提高控制精度,但会显著增加训练时间。
3.3 奖励函数设计
奖励函数是Q-Learning成功的关键。我设计的奖励函数包含以下几个部分:
code复制r = -θ² - 0.1θ̇² - 0.01F² + 10(如果|θ|<5°)
其中:
- θ²项惩罚摆杆偏离垂直位置
- θ̇²项抑制摆杆摆动速度
- F²项限制控制力大小
- 最后一项是平衡时的额外奖励
通过反复试验,我发现这个权重配置能在控制效果和能量消耗之间取得良好平衡。
4. 训练过程与参数调优
4.1 训练参数设置
关键训练参数包括:
- 学习率α=0.2:控制Q值更新幅度
- 折扣因子γ=0.9:平衡即时和未来奖励
- ε初始值=0.3:探索概率,随训练衰减
在实际训练中,我采用线性衰减的ε策略:
ε = max(0.01, 0.3×(1 - episode/1000))
这样可以在训练初期充分探索,后期稳定利用学到的策略。
4.2 训练曲线分析
典型的训练过程会经历三个阶段:
- 随机探索期(前200回合):智能体随机尝试各种动作,成功率很低
- 快速学习期(200-800回合):智能体开始掌握基本平衡技巧
- 收敛期(800回合后):性能趋于稳定,策略优化
我通常会训练1500-2000回合,直到连续100回合的成功率超过95%。
5. MATLAB实现技巧
5.1 三维可视化实现
MATLAB的三维可视化是本项目的一大亮点。核心代码如下:
matlab复制function draw_cart_3d(cx,cy,cz, phi, w,h,d)
% 定义立方体顶点
vertices = [...
-w/2 -h/2 -d/2; w/2 -h/2 -d/2; w/2 h/2 -d/2; -w/2 h/2 -d/2;
-w/2 -h/2 d/2; w/2 -h/2 d/2; w/2 h/2 d/2; -w/2 h/2 d/2];
% 旋转和平移
Rz = [cos(phi) -sin(phi) 0; sin(phi) cos(phi) 0; 0 0 1];
vertices = (Rz*vertices')' + [cx cy cz];
% 绘制立方体面
faces = [1 2 3 4; 2 6 7 3; 4 3 7 8; 1 5 8 4; 1 2 6 5; 5 6 7 8];
patch('Vertices',vertices,'Faces',faces,...
'FaceColor',[0.7 0.7 1],'EdgeColor','k','LineWidth',1);
end
5.2 性能优化技巧
为了提高仿真效率,我采用了以下优化措施:
- 预分配数组:避免在循环中动态扩展数组
- 向量化运算:减少for循环使用
- 稀疏矩阵:存储Q表时使用稀疏格式
- 并行计算:使用parfor加速训练过程
6. 常见问题与解决方案
6.1 训练不收敛问题
可能原因及解决方法:
- 学习率过高:降低α值,如从0.5降到0.2
- 奖励函数设计不合理:调整奖励权重
- 状态离散化太粗糙:增加离散化区间
- 探索率ε衰减太快:减缓衰减速度
6.2 控制抖动问题
当控制器频繁切换动作方向时,会出现明显的抖动现象。解决方法包括:
- 在奖励函数中增加动作变化惩罚项
- 采用动作滤波:对连续几个时间步的动作取平均
- 减小学习率,使Q值更新更平滑
6.3 三维场景下的特殊问题
在环形轨道场景中,我遇到了以下特有挑战:
- 向心加速度导致摆杆额外偏移
- 角度连续性处理(如359°到0°的跳变)
- 可视化时的坐标系转换
对于角度连续性,我采用了角度差值法:
matlab复制function delta = angle_diff(a,b)
delta = mod(a-b+pi, 2*pi)-pi;
end
7. 扩展应用与改进方向
基于这个基础框架,可以考虑以下扩展方向:
- 多摆杆系统:增加摆杆数量,形成级联倒立摆
- 抗干扰能力:测试系统对随机扰动的鲁棒性
- 迁移学习:将在环形轨道上学到的策略迁移到其他轨道形状
- 深度Q网络:用神经网络替代Q表,处理更高维状态空间
在实际测试中,我发现将Q-Learning与传统的PID控制结合,可以取得更好的控制效果。例如,可以用Q-Learning调整PID参数,或者用PID提供基础控制,Q-Learning处理非线性部分。