MATLAB/Simulink两轮自平衡车仿真:从动力学建模到PID/LQR控制调参实战

发布时间:2026/9/8 21:00:46
MATLAB/Simulink两轮自平衡车仿真:从动力学建模到PID/LQR控制调参实战 简介这是一份MATLAB/Simulink两轮自平衡车仿真项目实战资源面向自动控制与机器人方向的学习者和工程师旨在解决从车辆建模到PID控制器设计与仿真验证的一体化需求。压缩包大小约19.21MB资源包中文件总数与类型明细暂未列出根据描述内容包内应以Simulink模型、控制算法源代码和说明文档为主。项目从自平衡车动力学原理切入建模时考虑质心位置、转动惯量、摩擦力等因素并涵盖建立系统模型、设计PID控制器、仿真测试、结果分析、代码生成等重点环节还讲解了利用陀螺仪和加速度计测量数据调整电机转速的方法结合Simulink模块库快速搭建闭环控制模型以及如何通过自动代码生成将模型部署到硬件在环HIL测试。资源已有1766人学习浏览适用于课程设计、毕业设计或自学PID控制与仿真建模能帮助读者从零完成两轮自平衡车的仿真实验有效缩短从理论到实践的上手周期。 毫不夸张地说两轮自平衡车是所有控制类课程里被玩得最透的实验对象。它有倒立摆的动力学本质但比倒立摆更接近真实产品从平衡车、扫地机到自动驾驶里的某些稳定性控制问题底层逻辑都能追溯到这套模型。而MATLAB/Simulink做这套仿真实验最大的价值不是让你跑通一个方块图而是让你亲手把物理原型翻译成数学模型再用算法把数学模型按住——这两件事做完整个项目的含金量才算真正落地。这篇文章不是给你抄一个现成Simulink模型而是拆解我在做这个仿真项目时的完整思考链路模型怎么简化、PID和LQR怎么选、仿真里哪些坑常态性出现、怎么调参才能从勉强能平衡到稳得像钉在地上。适合正在做控制类课程设计的学生、想用仿真验证算法的工程师以及准备从仿真走向实物的爱好者。1. 为什么用MATLAB做自平衡车仿真从模型到算法的完整闭环很多人在实物平衡车和纯理论推导之间反复横跳实物项目受电池、电机、传感器噪声、机械公差影响太大出了问题根本分不清是控制算法的问题还是硬件的问题纯理论推导又停在公式层面纸上算完觉得懂了实际连Simulink里一个Integrator该放哪儿都不清楚。MATLAB在这中间的定位是给你一个无损耗环境先验证逻辑把模型、控制器、执行器、传感器做成一条可追溯的链路。我认为这个实验项目最大的价值是训练一种双向翻译能力。一条路是物理到数学把车体倾角、角速度、位移、速度这些物理量用运动学和动力学方程转化成状态空间矩阵另一条路是数学到物理把LQR算出来的增益矩阵K或者PID里的三个系数重新映射回倾角误差大时车轮该以多大加速度跟上这种直觉。MATLAB用脚本写模型验证、用Simulink做模块化仿真两条路恰好都覆盖了。使用场景上也很有讲究。如果你是课程设计重点是模型推导控制器对比的论证过程建议以脚本为主、Simulink为辅写清楚每一步矩阵的含义如果你是想为实物项目做预研重点则是执行器饱和、传感器延迟、离散化步长这些Simulink里才能真实呈现的问题。这个出发点决定了你后续花时间的重心别一上来就拖模块。另外工具链本身的配套也要吃透。Control System Toolbox提供tf、ss、lqr、place这些核心函数Simulink Control Design可以辅助线性化分析Simscape如果装了还可以做多体仿真验证你的简化模型误差。但我的建议是第一遍做实验不要用Simscape这种高级工具箱它的物理建模能力很强反而掩盖了你对数学模型的把控——亲手把方程敲成矩阵你才知道线性化时丢掉的项到底丢掉了什么。2. 两轮自平衡车的动力学建模从物理原型到数学方程2.1 自由度分析与核心假设两轮自平衡车虽然看起来只有左右两个轮子但简化到平面问题时核心自由度数并不多。最常见的建模路线是车体俯仰角 前进位移的二维平面模型把左右轮合并成单一等效轮车体简化为一根绕轮轴转动的倒立摆杆。这个简化过程至少做了四个关键假设。第一个左右轮运动完全一致车体没有侧倾和偏航这相当于把三维问题压成二维第二个轮子与地面之间纯滚动、不打滑引入约束条件第三个轮子质量集中在轮心车体质量集中在质心第四个忽略轮轴摩擦力、空气阻力等非线性因素。每个假设都不完美但它们的价值是让系统变成一个可线性化、可状态空间化的经典受控对象。选坐标和参数的时候要特别注意符号的一致性。我见过太多人卡在一个低级错误上倾角θ的正方向定义和电机推力的正方向定义不匹配导致仿真里控制量方向反了车子一启动就往倒的方向加速。建议第一步就把坐标图手绘出来标注质心位置、轮心位置、倾角正方向、驱动力正方向然后对着图写方程。2.2 拉格朗日方程到线性化状态空间推导方程我推荐用拉格朗日方程而不是牛顿力学。牛顿法需要把内力轮子与车体之间的约束力也画出来容易出错拉格朗日法直接基于动能和势能得到的广义坐标方程过程更机械、更不容易漏项。系统的动能包括轮子平移动能、轮子转动动能、车体平移动能和车体转动动能势能则来自车体质心的重力分量。代入拉格朗日方程后得到的是两组二阶非线性微分方程其中带有sinθ和cosθ项。平衡点附近的线性化处理是全程最关键的一步在θ0附近做泰勒展开只保留一阶项也就是令sinθ≈θcosθ≈1二阶小量全部忽略。把两条方程联立解出θ̈和ẍ再定义状态变量x₁θx₂θ̇x₃px₄ṗp为位移就整理成标准状态空间形式ẋAxBu。这里的u是作用在轮子上的合力或等效电机的驱动力矩。我建议在MATLAB脚本里用符号计算工具Symbolic Math Toolbox先推导一遍再用手工化简的结果对照双重校验。得到一个典型的简化模型系数设定后A矩阵和B矩阵大致长这样% 参数定义 g 9.81; % 重力加速度 m/s^2 M 1.0; % 车体质量 kg m 0.1; % 轮子质量 kg L 0.2; % 质心到轮轴距离 m J 0.005; % 车体转动惯量 kg*m^2 r 0.05; % 轮子半径 m b 0.1; % 阻尼系数 % 状态空间模型简化后 % x [theta; theta_dot; p; p_dot] % A矩阵的(1,2)和(3,4)体现了积分关系 % (2,1)来自重力分量是系统不稳定的根源 A [0 1 0 0; (Mm)*g*L/(J*(Mm)M*m*L^2) 0 0 0; 0 0 0 1; -m*g*L^2/(J*(Mm)M*m*L^2) 0 0 0]; B [0; -L/(J*(Mm)M*m*L^2); 0; (JM*L^2)/(J*(Mm)M*m*L^2)];注意这里的符号正负一定要和你的坐标定义一致不要直接照抄参数把推导过程自己走一遍。3. 控制策略对比与选型PID和LQR在平衡控制中的取舍3.1 PID的直觉逻辑与调节缺陷PID控制自平衡车是最直觉的方案——倾角大了就加速往倾倒方向追倾角变化快了就加阻尼。PD两项已经足够应付角度回路的稳定I项在纯仿真里要谨慎使用它容易引入低频振荡很多仿真发散问题就是积分项调大了引起的。实际调参的时候比例系数Kp起回复刚度作用太小了车体像面条一样软绵绵回不来太大了会高频振荡甚至数值爆炸微分系数Kd起阻尼作用抑制超调但Kd太大会放大传感器高频噪声仿真里会有种抖抖索索的虚假振颤。用根轨迹或者频域Bode图能看出趋势但我个人经验是先用仿真脚本手动扫描几个数量级的参数找到临界回复→临界振荡的过渡区间再细化效率最高。PID在自平衡车上有一个结构性问题它天然是单输入单输出的视角你把倾角回路调好了位移回路怎么办很多方案是级联PID——内环控角度外环控位移外环的输出作为内环的给定倾斜角度。这在慢速场景下能用但两个回路带宽要是设计不当就会互相打架车体走走停停呈S形蠕动。3.2 LQR的统一代价统一优化LQR线性二次型调节器用状态反馈u-Kx统一处理所有状态变量不再分别调P、I、D而是通过Q矩阵和R矩阵设定代价权重。Q矩阵是一个对角矩阵对角线上的每一项代表系统对某个状态偏差的容忍度。我可以给你一套比较实用的Q矩阵设定思路先归一化再加权。因为θ的量级在0.1弧度约6°左右而位移p的量级可能达到1米直接放在一起数值上差一个数量级所以建议先手动归一化再设计权重或者直接在Q里把位移对应的权重压低。我用过一组实测效果不错的初始权重供参考% LQR权重设计 % 状态顺序: [theta, theta_dot, p, p_dot] % 角度偏差罚得最重位移次之角速度/线速度的罚则用于抑制运动幅度 Q diag([100, 1, 10, 1]); R 0.01; % 控制量代价越小代表执行器越敢出力 K lqr(A, B, Q, R);这组权重下得到的反馈增益矩阵角度项的增益通常远大于位移项这符合物理直觉——先稳住姿态再调整位置。LQR真正的好处是它自动权衡多个状态之间的冲突你不用手动调级联PID的内外环带宽只需调Q、R的值而Q、R每个值的语义也相对直观。3.3 仿真阶段我建议怎么选如果目的是理解控制律的结构差异PID和LQR都做一遍最好如果目的是追求仿真稳定性和后续实物移植我更推荐LQR。原因不只是性能更因为LQR的设计过程强制你建立状态空间的全局视角而且增益矩阵K一旦算出来后续做离散化、降阶、硬件部署都比PID直观。但这不代表PID没有存在价值。我在第一次搭模型时一定会用一个简单的PD控制器先把模型跑通确认模型的符号方向、Simulink接线、积分器初始值都没有问题再切换到LQR做精细调节。用PD做冒烟测试用LQR做最终方案这套组合拳在后续实物项目里同样适用。4. Simulink仿真模型搭建与调参实战从零跑通完整实验4.1 模型架构设计和关键模块选型如果你已经推导出了状态空间模型最可靠的方式是在Simulink里用积分模块搭建状态方程结构的模型而不是直接拖一个State-Space模块。原因很简单用积分器和Gain模块搭出来的结构信号流动路径和你的数学方程一一对应出错了你能从示波器上排查是哪条支路的问题直接拖模块等于把模型当黑盒仿真是个空转。推荐的最小模型架构分成五个功能块输入台阶信号或手动扰动、控制器、状态方程、传感器、示波器。其中状态方程可以用四个积分器级联的方式完成二阶积分关系用Gain模块把A和B矩阵的各项乘进去再用Add模块求和。这个过程看起来繁琐但做完一次你对状态方程的理解会扎实一大截。方式上我建议这样组织信号反馈信号和设定值在控制器里先做差控制器输出u进入B矩阵增益块θ̈和ẍ积分两次得到θ、θ̇、p、ṗ。4.2 传感器建模与执行器约束很多仿真实验失败问题不在控制器在传感器和执行器的理想化假设太强。你在Simulink里加两个模块就能让结果真实很多第一个是饱和模块Saturation限幅电机的最大输出力矩。我见过一个仿真LQR增益算出来控制量峰值大得离谱但仿真照样平衡住了——因为模型里没有执行器上限相当于你凭空捏了一个无限功率电机。真实电机输出到一定值就会饱和饱和之后系统非线性度急剧上升调参逻辑完全不同。一般取额定力矩的±80%作为限幅值留一点控制余量。第二个是量化/噪声扰动模块。给角度测量加一个高斯白噪声仿真结果才会接近真实传感器的表现。Simulink里的Band-Limited White Noise模块就能做噪声功率设置成0.0001这个量级你会发现同样一组LQR增益在理想环境下稳如泰山加噪声后角速度信号开始抖动——这时候你就理解为什么实物系统中滤波器不可或缺了。实测下来加上饱和限幅后LQR的反馈增益K不能直接使用无约束求出的结果因为控制量一旦饱和线性最优的性质就破坏了。这时候要么把Q矩阵中对状态偏差的权重降低让系统在极端工况下不要追求立即回正要么在控制器输出侧加Anti-Windup逻辑限制积分环节的累积量。仿真里加上这一层才真正接近实物行为。4.3 求解器设置与步长选择Simulink求解器这块是最容易被忽略但影响最大的配置选项。两轮自平衡车是一个刚性较强的系统角度回路的动态响应很快如果你用默认的变步长求解器仿真结果会一会长步长跳变、一会缩步长看起来波形有锯齿调参时很难判断到底是参数问题还是数值积分问题。我的建议是在Simulink的Solver设置里直接选择固定步长求解器步长设成1e-3秒求解器选择ode4四阶龙格-库塔或ode3。定步长不仅让波形更稳定可复现更重要的是它模拟了实物控制器以固定周期运行的真实情况后面做离散化控制器移植时这个步长就是控制周期。一个容易踩的细节是LQR在连续时间域算出的K矩阵可以用在连续模型上但实物系统是离散采样控制的所以仿真中如果想验证采样-控制-执行的完整链路需要在控制器前后加Zero-Order Hold模块采样周期取1毫秒或2毫秒。加上ZOH之后原来连续域里倾斜多少就使多大劲的微分会变成带一拍延迟的信号重构边界增益往往要往下调10%~15%这个差异很重要。4.4 调参流程参考我习惯的调参顺序是先用PD把系统初步稳定住P从0开始逐步翻倍找到发散临界值后设到临界值的30%~50%D跟随P同步增大消除振荡得到一个勉强能站住的基线再切换到LQR让反馈增益从保守值逐步放宽。这个过程写成一个脚本驱动效率会高很多。脚本化调参的逻辑大概是这样% 调参辅助脚本批量扫描LQR权重 Qs logspace(0, 3, 10); % 角度权重从1到1000 Rs logspace(-3, -1, 10); % 控制代价从0.001到0.1 results []; for i 1:length(Qs) for j 1:length(Rs) Q diag([Qs(i), 1, 1, 1]); R Rs(j); K lqr(A, B, Q, R); % 离线判断闭环极点位置 e eig(A - B*K); % 记录最大实部越小越稳 results(end1, :) [Qs(i), Rs(j), max(real(e))]; end end这种批量扫描本质上是在找一个稳定裕度最大的权重组合省去了一组一组手动试的体力活。然后选定一组结果放进Simulink观察动态响应再微调。整个流程下来你对权重越大某状态越不敢偏差这句话的理解会是浸入式的而不是背书式的。5. 仿真中的典型翻车现场与排查手记做这个实验最不缺的就是翻车经历。我按出现频率总结几个典型故障每个都附排查链路你复现项目时遇到类似问题可以按这个思路走一遍。5.1 仿真直接发散先查模型符号再查步长现象是示波器里角度曲线以指数形式直接飙到几万弧度不是振荡发散而是单调爆掉。遇到这种情况第一反应不要调参数先检查建模符号。把B矩阵中控制量作用到θ̈上的那两项正负号反一下你会发现原本LQR算出的增益在推动系统往正反馈方向走相当于你装了一个促进跌倒的控制器。如果符号验证过没问题第二步检查步长。固定步长设太大时四阶龙格-库塔的数值误差在快速动态项上会指数放大现象就是角度看起来在收敛但带毛刺毛刺越来越大最终发散。排查方法是把步长从1e-3改成1e-4如果波形明显变好说明原步长就不适合这个系统。5.2 控制量饱和后系统开始极限环振荡加了Saturation限幅后一种常见现象是车体在一个固定的小角度区间内来回抖频率不高但始终不收敛。这是典型的执行器饱和导致的极限环振荡——线性控制器在饱和区失去线性特性积分项或大增益项在饱和期间不断累积误差退出饱和后又过度修正。排查时在控制器输出和限幅模块之间加一个Scope观察控制量在饱和边界上撞墙的频率。如果确认是这个原因最有效的手段是给积分环节加Clamping或Back-calculation抗饱和逻辑或者在Q矩阵里降低对状态的惩罚、让控制器在饱和期间别那么着急。这个坑对后续实物项目有很高的借鉴价值因为真实电机的饱和远比仿真里的Saturation模块复杂。5.3 加了噪声后角速度项出现高频颤振角度传感器带高斯白噪声时LQR中角速度对应的反馈增益会放大噪声。现象是车体能站住但轮子的速度指令高频抖动整个系统听着像在磨牙。根因是状态反馈不知道这个角速度变化是真实的动力学响应还是传感器噪声它只会机械地乘以增益再输出。排查思路很直接把噪声源临时置零如果高频颤振消失就能确认是噪声放大问题。解决方向有两条——在控制器设计时限制K矩阵中角速度项的增益或者在信号路径上串联低通滤波器。实测下来一阶低通滤波的截止频率设在20~30Hz效果比较好既抑制噪声又不明显拖慢平衡回路的响应。5.4 初始倾角稍大就控制不住这是线性模型和非线性现实的冲突。LQR设计时在θ0附近线性化初始倾角到0.2弧度约11°时sinθ近似θ的误差已经到约2%这个值看起来不大但配合大增益反馈足以让控制器在短时间内输出一个错误方向上的修正量系统表现为先偏离再回落或者直接起振。排查时把初始角度从小到大扫一遍找到能稳住的最大初始倾角这个指标。如果你的需求是抗较大扰动建议不要硬调Q矩阵而是在控制结构上增加分段控制逻辑——大倾角时用高增益快回正小倾角时切回常规定常增益或者改用非线性控制器设计方法。仿真里实现分段控制很简单用Switch模块判断角度绝对值就行但分段边界的滞后处理要仔细测试。5.5 位移回路稳定时间过长车体倾角稳住了但位移漂出去十米才慢慢回来或者一直在目标点附近缓慢游走。出现这个问题本质是Q矩阵中位移对应的权重太小。很多人设计Q时只盯着角度忽略了位移回路结果位移回路的带宽比角度回路低一两个数量级。排查方法是在观测位移波形的时看看它回落的时间常数是不是和理论极点位置相匹配。解决方式不是单纯增大位移权重——那样容易让两个回路耦合振荡而是调整Q矩阵中位移和速度权重的比值让位移回路的自然频率在角度回路自然频率的1/5到1/3之间既保证回中能力又不破坏主回路的稳定性。6. 从仿真到实物移植的扩展思考哪些经验可以直接复用仿真做到位之后很多人会问这个模型能不能直接搬到实物上我的回答是数学模型和控制律可以搬但一堆仿真里的理想化红利会在实物阶段一次性清零。提前想清楚下面这几件事能少走很多弯路。第一滤波器的位置要从可选变成必选。实物传感器的角度信号普遍带噪声而且加速度计和陀螺仪的数据还需要做融合才能得到干净的倾角和角速度。仿真里加不加噪声是你自己控制的实物里噪声由环境决定所以从设计的第一天起就应该把滤波模块做进仿真链路里哪怕初版用一阶低通也比完全不带滤波器强。第二控制周期的设定要提前论证。仿真里把步长设成1e-3秒很轻松但实物上主控芯片在1毫秒内要完成传感器读取、姿态解算、控制律计算、电机指令输出这个时间预算是否够取决于处理器的算力。建议在仿真里加一个延时模块模拟计算耗时把ZOH周期从1毫秒调到5毫秒看看控制性能退化到什么程度——这个数据直接决定你选什么价位的控制器。第三模型参数的不确定性在实物中显著增大。车体质量分布、轮胎材质、电机死区都会导致理论模型和实物之间的偏差。仿真阶段做的一个有价值的实验是参数敏感性分析把L或J上下浮动20%看系统是否仍然稳定。如果模型参数变化20%系统就崩了说明你设计的控制器鲁棒性不足实物阶段必然翻车。第四如果后续走向实物建议先在仿真里做硬件在环测试的前置准备。把控制律从连续时间转换成离散时间的差分方程形式用嵌入式代码生成工具生成C代码在仿真环境里把生成的代码跑一遍确认数值行为和模型一致。这一步做完真正烧录到单片机时剩下的基本就是传感器标定和电机极性检查这类体力活了。这套实验做下来我的个人体会是两轮自平衡车的仿真实验表面上是搭个模型、调个参数实际上是一趟从物理直觉到系统思维的训练。你亲手推导的状态空间矩阵、亲手调的Q权重、亲手排查的每一个发散原因都会沉淀成一种看到控制对象先想状态变量、先想约束条件、先想不确定性来源的思维习惯。下次遇到无人机姿态控制、倒立摆同步控制甚至更复杂的电机控制问题大概率会发现底层那套建模和控制器设计的语言是完全互通的。本文还有配套的精品资源点击获取