球杆系统控制实战:MATLAB建模、PID与LQR控制器设计与Simulink仿真

发布时间:2026/9/20 18:45:30
球杆系统控制实战:MATLAB建模、PID与LQR控制器设计与Simulink仿真 简介这是一份球杆系统控制器设计与MATLAB仿真的完整课程设计文档面向自动化、控制工程相关专业学生及对模糊控制感兴趣的初学者。文档以球杆系统为被控对象系统讲解了从不稳定数学模型建立、模糊控制器设计到Simulink闭环仿真验证的全过程尤其给出了输入输出变量论域、隶属度划分及“如果-那么”模糊规则的制定方法并对比了模糊控制相对传统PID的适应性优势。资源为单个docx文件大小约1.83MB包含摘要、中英文目录、章节论述及参考文献结构完整可直接作为毕业设计、课程报告或控制理论入门的参考资料。目前已有254人学习下载对于希望快速上手MATLAB模糊控制仿真的读者这份资源能有效缩短建模与调试的摸索时间。 球杆系统应该是控制类课设和毕设里出现频率最高的一批对象之一一根金属杆、一颗小钢球通过改变杆的倾角让球停在指定位置。很多人第一次拿到这个题目时会觉得“不就是调个角度嘛”但真正上手用MATLAB建模、仿真、调控制器之后才会明白它为什么能作为经典教学平台存在——开环不稳定、非最小相位、强耦合几乎把控制理论里最有代表性的难点都集中在一个玩具大小的装置上。这篇内容我会按照自己实际做过的完整流程来梳理从物理建模、到控制器设计、再到Simulink仿真验证最后把我在这个过程中踩过的坑和调试经验一并整理出来。不管你是正在做课程设计的学生还是想用MATLAB仿真验证控制器方案的工程师都应该能从里面找到可以直接照抄的步骤和参数。1. 球杆系统的控制难点与实验价值1.1 系统结构与典型应用场景标准的球杆系统硬件组成并不复杂底座上装一个直流伺服电机或者步进电机电机轴带动一根金属杆绕中心轴旋转杆上放一个可以自由滚动的小钢球杆的一端或两端安装位置传感器常见的有电位计式、激光测距或摄像头视觉方案来实时测量球的当前位置。系统的工作方式很直观控制器根据球的当前位置和目标位置的偏差计算出杆应该倾斜的角度电机驱动杆转动球在重力分量的作用下滚向目标位置。但在控制理论课程里球杆系统从来不是“直观”的代名词。它被广泛用于验证PID控制、根轨迹校正、状态反馈、LQR最优控制、滑模控制甚至自适应控制算法。原因在于它具备了两个非常“磨人”的动态特性——开环不稳定和非最小相位行为这两个特性在工业对象里也很常见比如飞行器俯仰控制、磁悬浮、倒立摆、双容液位等但球杆系统的物理结构足够简单方便在实验室里复现所以成了连接理论和实践的最佳桥梁。1.2 为什么说它是“看着简单、控制起来难”的典型对象先说开环不稳定。如果把杆放平倾角为零球放在任意位置只要有一点点扰动哪怕是空气流动球就会开始滚动而且一旦滚起来没有恢复力让它停下来。也就是说系统的开环极点里存在临界稳定甚至不稳定的因素控制器必须主动提供“阻尼”和“回复力”。再说非最小相位。这个词听起来玄乎但你可以这样理解对大多数常规系统你给一个正向的输入输出会先朝正方向走但对球杆系统这类非最小相位对象你给正向控制指令后输出的响应会先朝反方向冲一下然后再折回来朝正确方向走。这个“先反向再正向”的特征在传递函数上表现为右半平面存在零点。为什么会有这个现象物理直觉上是这样的当你想让球往右滚杆必须先往左翘起来球由于惯性会先相对往左“溜”一下然后才跟着杆的倾斜方向往右加速。这个短暂的“反向溜动”就是非最小相位零点在时域上的体现。它给控制带来的麻烦很实际如果你用常规的高增益反馈去压制这个反向响应系统很容易发散所以控制器设计必须格外小心。2. 从物理机理到MATLAB数学模型2.1 拉格朗日方程建立非线性模型做控制器设计之前必须先有一个可靠的被控对象模型。球杆系统的建模方法常用的有牛顿力学法和拉格朗日法两种。我用的是拉格朗日法因为杆和球之间存在耦合项用能量法推导不容易漏项。先定义参数球质量 m 0.11 kg球半径 R 0.015 m球绕自身质心的转动惯量 J_b 0.4 × m × R² ≈ 9.9e-5 kg·m²杆绕转轴的等效转动惯量 J_total 0.05 kg·m²包含了电机转子和传动机构转轴到杆质心距离 L_c 0.25 m重力加速度 g 9.81 m/s²系统的广义坐标取两个球心沿杆方向的距离 r以及杆与水平面的夹角 α。小球在杆上做纯滚动因此它的动能包括平动动能和绕自身质心的转动动能两部分T_ball 0.5 × m × (ṙ² r²α̇²) 0.5 × J_b × (ṙ/R)²杆的动能绕转轴转动T_rod 0.5 × J_total × α̇²系统的势能V m × g × r × sin(α)把以上各项代入拉格朗日方程之后可以得到两个非线性微分方程(J_b/R² m) × r̈ m × r × α̇² − m × g × sin(α)J_total × α̈ τ − 2 × m × r × ṙ × α̇ − m × g × r × cos(α)第一个方程描述球的滚动运动第二个方程描述杆的转动。注意第二项 −2m × r × ṙ × α̇ 是科氏力项它表示球沿杆方向运动时对杆转动产生的耦合力矩这个项在低速工作点附近很小但在大角度快速运动时不能忽略。我建议在仿真模型里保留它这样结果更接近真实装置。2.2 平衡点线性化与状态空间表达控制器设计通常基于工作点附近的线性化模型。平衡工作点取 α 0杆水平、r r₀球停在任意参考位置、速度加速度均为零。在 α≈0 处做小扰动线性化保留一阶项sin(α) ≈ αcos(α) ≈ 1r × α̇² ≈ 0于是球动力学简化成(J_b/R² m) × r̈ −m × g × α定义等效质量 m_e m J_b/R²代入数值m_e 0.11 9.9e-5 / (0.015²) ≈ 0.55 kg系统的简化开环传递函数输入为杆倾角 α输出为球位置 rG(s) −(m × g / m_e) / s² ≈ −1.962 / s²注意这个“负号”很重要。它意味着杆向上翘α 0时球会向负方向左侧加速滚动。很多人在仿真时发现符号反了其实就是忽略了这个负号的物理含义。如果把电机力矩 τ 作为输入状态向量取 x [r, ṙ, α, α̇]可以得到四阶线性状态空间模型A [0 1 0 0; 0 0 0 -1.962; 0 0 0 1; 0 0 0 0]B [0; 0; 0; 20]因为 B 的第四行是 1/J_total 1/0.05 20C [1 0 0 0]D 0这里 A(2,4) -1.962 表示杆倾角通过重力分量作用在球的加速度上A(4,:) 0 表示简化模型中没有考虑球位置对杆转动的反向耦合。设计控制器时用这个简化模型仿真验证时用完整的非线性模型是工程上很常见的做法——设计模型够用就好验证模型要“真实”。2.3 用MATLAB快速建立与验证模型在MATLAB里建立线性模型非常快直接敲矩阵就行m 0.11; R 0.015; Jb 0.4*m*R^2; me m Jb/R^2; g 9.81; J_total 0.05; A [0 1 0 0; 0 0 0 -m*g/me; 0 0 0 1; 0 0 0 0]; B [0; 0; 0; 1/J_total]; C [1 0 0 0]; D 0; sys ss(A, B, C, D); % 查看零极点 pzmap(sys); grid on;运行pzmap你会看到系统有一个极点位于原点积分环节、一个位于原点附近还有一对在虚轴附近的共轭极点。整体上系统是临界稳定到不稳定的混合状态单靠比例控制很难压住。下一步做控制器设计时心里要清楚这个底子。如果你更习惯符号推导也可以用MATLAB Symbolic Toolbox对拉格朗日方程做求导和线性化避免手算漏项。不过对于球杆系统这种规模手推也能控制住复杂度符号工具更适用于杆长变化、球质量可变这类参数化建模场景。3. 控制器设计从经典到现代控制的三条路径3.1 串级PD/PID控制工程上最稳妥的起步方案球杆系统的控制输入是电机力矩被控输出是球位置中间隔着一个杆的动力学。如果你直接设计一个从“球位置误差”到“电机力矩”的单环控制器参数会非常敏感几乎无法同时保证内环稳定和外环精度。常规做法是拆成两环内环杆的倾角环。输入是期望倾角输出是实际倾角直接驱动电机。外环球的位置环。输入是目标位置输出是期望倾角通过改变杆倾角来移动球的位置。内环设计杆的动力学近似为 J_total × α̈ τ对它做PD控制τ Kp_α × (α_ref − α) − Kd_α × α̇闭环特征方程为 J_total × s² Kd_α × s Kp_α 0由此得Kp_α J_total × ωn_α²Kd_α 2 × ζ_α × J_total × ωn_α取内环自然频率 ωn_α 20 rad/s阻尼比 ζ_α 0.9代入 J_total 0.05Kp_α 0.05 × 400 20 N·m/radKd_α 2 × 0.9 × 0.05 × 20 1.8 N·m·s/rad内环带宽比外环高3到5倍以上这样外环看到的被控对象近似是一个比例环节设计起来就很轻松。外环设计在杆倾角环闭合之后从 α_ref 到 r 的简化模型可近似为G_r(s) −(m × g / m_e) / s² −1.962 / s²外环控制器用PDα_ref Kp_r × (r_ref − r) − Kd_r × ṙ闭环特征方程 s² Kd_r × 1.962 × s Kp_r × 1.962 0。取外环自然频率 ωn_r 4 rad/s阻尼比 ζ_r 0.8Kp_r 4² / 1.962 ≈ 8.15 rad/mKd_r 2 × 0.8 × 4 / 1.962 ≈ 3.26 rad·s/m算出来的外环比例系数单位是 rad/m意思是“球偏离目标1米时杆需要倾斜约8.15弧度”。实际运行中球的位置偏差都是厘米级所以8.15这个数用起来并不夸张配合限幅后表现正常。3.2 LQR状态反馈换一种思路处理多变量耦合经典PD串级结构直观、好调但它是把系统拆成内外环分别处理忽略了状态间的耦合。LQR方法则直接面对四阶状态空间模型通过最小化二次型性能指标 J ∫(xᵀQx uᵀRu)dt 来求解状态反馈矩阵 K让 u −Kx。权重矩阵的选择决定控制系统行为Q越大表示对该状态的约束越强R越大表示对控制能量的惩罚越重。我的经验是先用对角矩阵Q中位置项权重设大保证定位精度角度项权重适中限制杆的摆动幅度R取得很小允许电机出力Q diag([100, 10, 50, 1]); % 位置、速度、角度、角速度权重 R 0.01; K lqr(A, B, Q, R)运行后会得到 K 的数值解。和PD串级结构相比LQR的优势是自动考虑了状态间的耦合关系在理论上能保证一定的稳定裕度劣势是它要求所有状态都可测量而实际系统通常只能测到球位置和杆角度速度量需要由观测器估计或数值微分加低通滤波得到。3.3 两种方案的仿真对比我在Simulink里把上述两种控制器都搭出来在同样的初始条件下球初始位置0.15m目标位置0.3m运行对比方案超调量调节时间2%误差带最大杆倾角调参难度串级PD约10%约1.4s约9°低两套参数独立LQR约6%约1.2s约7°中等需要选Q/R矩阵串级PD胜在物理意义明确内环外环参数可以分开调试出现问题容易定位LQR胜在整体指标更优但对模型的精度要求更高模型偏差大的时候鲁棒性并不比调好的PD强多少。我的建议是课程设计报告里两条路都写既展示经典控制功底也展示现代控制方法但最终确认参数时以非线性模型仿真结果为准。4. Simulink仿真平台搭建与闭环验证4.1 模型搭建结构与模块清单在Simulink里搭建球杆系统仿真模型时我不建议把控制器和被控对象挤在一张图里最好分成三层Plant层放被控对象的非线性方程。Controller层放PD或LQR控制器。Reference层信号源和限幅模块。被控对象层我建议保留非线性方程而不是直接用State-Space模块。原因是Simulink里用积分器搭建非线性微分方程并不复杂而且能直观看到科氏力项、重力项对系统的影响排查问题时很有帮助。具体模块清单可以参考这张表模块用途Integrator × 4对 r̈、α̈ 积分得到 ṙ、r、α̇、αGain各项系数如 m*g/me、1/J_totalProduct计算 r × α̇²、r × cos(α) 等耦合项Add汇总加速度表达式Saturation杆倾角限幅模拟实际机械限位PID Controller内环/外环控制器可切换PD参数Scope / To Workspace记录球位置、杆倾角、控制力矩等信号积分器初值设置要对应初始工况球初始位置0.15m杆水平静止角速度为零。我把初值直接写在积分器属性里而不是在初始化脚本里赋值这样避免启动瞬间出现不期望的跳变。4.2 初始化脚本与批量扫参我习惯用独立的 .m 脚本管理所有参数脚本开头定义物理常量中间计算控制器参数最后调用 sim() 运行仿真并绘制曲线。这样做的好处是换一组参数只需要改脚本里几个数字不用反复打开Simulink点击对话框。% 初始化脚本 init_ball_beam.m m 0.11; R 0.015; Jb 0.4*m*R^2; me m Jb/R^2; g 9.81; J_total 0.05; % 内环PD wn_alpha 20; zeta_alpha 0.9; Kp_alpha J_total * wn_alpha^2; Kd_alpha 2 * zeta_alpha * J_total * wn_alpha; % 外环PD wn_r 4; zeta_r 0.8; k m*g/me; Kp_r wn_r^2 / k; Kd_r 2*zeta_r*wn_r / k; % 限幅 alpha_max 20*pi/180; % 20度 % 运行仿真 sim(ball_beam_sim.slx); plot(ball_pos.time, ball_pos.signals.values); xlabel(时间 (s)); ylabel(球位置 (m));批量扫参时用set_param修改Simulink本文还有配套的精品资源点击获取