MATLAB直线倒立摆控制仿真:一阶倒立摆LQR控制、PD控制与MPC模型预测控制的对比研究
MATLAB直线倒立摆一阶倒立摆LQR控制仿真,小车倒立摆起摆和平衡控制,附带参考文献 三种控制方法对比 pd控制、lqr控制、mpc模型预测控制
倒立摆这玩意儿在控制领域算是个经典玩具,别看它结构简单,实际调试起来能让你深刻体会什么叫"差之毫厘谬以千里"。今天咱们拿一阶直线倒立摆开刀,用MATLAB仿真三种主流控制方法——PD、LQR、MPC,看看它们是怎么让杆子立起来的。
先看PD控制这个老实人。核心思路就是靠角度误差和角速度反馈硬怼,代码实现也够直白:
Kp = 50; % 这个数调得我肝疼
Kd = 15;
u = Kp*(theta_ref - theta) + Kd*(0 - dtheta);
但实际运行会发现,单纯PD控制就像用筷子戳气球——响应滞后明显。当摆杆从下垂状态启动时,需要额外加个起摆策略。常见操作是让小车来回抖动积累能量,类似人用手晃绳子让上面的重物摆起来:
if abs(theta) > pi/3 % 大角度时粗暴起摆
u = sign(theta)*20;
else % 小角度切平衡控制
u = Kp*(0 - theta) + Kd*(0 - dtheta);
end
这种分段控制虽然有效,但过渡时容易出现抖动,参数整定全凭手感,换个摆长又得重新调参。
这时候LQR就显出优势了。先建立状态空间模型:
A = [0 1 0 0;
(M+m)*g/(M*l) 0 0 0;
0 0 0 1;
-m*g/M 0 0 0]; % 状态矩阵
B = [0; -1/(M*l); 0; 1/M]; % 输入矩阵
Q = diag([10 1 100 1]); % 状态权重矩阵
R = 0.1; % 输入权重
[K,~,~] = lqr(A,B,Q,R); % 自动求解最优增益
LQR最大的妙处在于自动计算最优反馈矩阵,但魔鬼藏在权重参数里。某次仿真我把Q矩阵对角元素从[10,1,100,1]改成[100,1,10,1],结果小车直接冲出轨道——原来位置权重给太高,系统宁可让杆子倒下也要保持小车静止。
MPC则是另一幅面孔。每次求解未来N步的最优控制序列,像下棋一样预测未来:
mpcobj = mpc(model, Ts, 10, 2); % 预测时域10步,控制时域2步
mpcobj.Weights.OutputVariables = [100 1]; % 杆角度权重100,小车位置1
mpcobj.Weights.ManipulatedVariablesRate = 0.1; % 控制量变化率惩罚
实测发现MPC在扰动抑制上表现惊艳。有次我故意在仿真中给摆杆加瞬时冲击,MPC能在0.3秒内恢复平衡,而LQR用了0.5秒,PD控制直接翻车。不过计算量也是真的大,预测时域设为20步时仿真速度肉眼可见变慢。
三种方法各有生存法则:
- PD:简单粗暴见效快,调参地狱等你来
- LQR:数学优雅省计算,权重矩阵定生死
- MPC:预测未来性能强,算力换稳定
最后放个冷知识:实际倒立摆实验中,电机死区问题会让仿真完美的控制器当场扑街。这时候得在控制量里偷偷加个sign(u)*0.1的偏移量,比任何高级算法都管用——来自某次实验室通宵后的血泪教训。
参考文献:
[1] 倒立摆系统LQR控制权重优化方法, 自动化学报
[2] Model Predictive Control of Inverted Pendulum, IEEE CDC会议论文
[3] 经典控制理论中的倒立摆案例, 奥格塔《现代控制工程》

更多推荐
所有评论(0)