自由摆平板控制系统:动力学建模与双环PID控制实现
2026/9/20 8:29:07 网站建设 项目流程

简介:从经典控制理论中的PID控制谈起,在实际工程中,许多非线性、多干扰系统的稳定控制都依赖于准确的对象建模与传感器融合。以自由摆平板系统为例,其核心难点在于摆杆运动对平板产生复杂的切向与离心干扰,单纯依赖位置反馈难以实现小球稳定。通过拉格朗日方程建立动力学模型,并借助IMU互补滤波还原摆角信息,再结合外环位置、内环角度的双环PID结构,可以有效抑制扰动。该系统广泛应用于自动化竞赛、课程设计及机器人平衡控制等场景。本文围绕动力学建模、硬件选型、滤波与控制器实现展开,并给出前馈补偿与参数整定方法,为类似控制问题提供一套可参考的工程方案。

1. 自由摆平板控制系统:先看干扰再看算法

自由摆末端装一块平板,摆杆摆动时,平板上的小球要求停在原地或者只允许小幅移动——这是很多自动化课程设计和电子设计竞赛都爱出的题目。真正动手调试时最先让人意外的现象是:摆杆摆到最大角度、平板那一瞬间稳定下来时,小球反而最容易滚出去;摆杆加速回摆时,平板还没来得及补偿,球已经过了边界。原因是平板的加速度干扰并不和摆角同步,它更依赖摆杆的角速度与角加速度。这个系统的本质不是“把平板放平”,而是让平板在非惯性坐标系中不断抵消运动产生的切向干扰,再把小球位置闭环起来。本文按工程师自己做这套系统的路径展开:动力学建模、硬件选型、角度解算与双环PID实现、参数整定与排错,最后给前馈补偿等实用技巧。正在做类似毕业设计或竞赛题的同学,可以把它当作一份可复现的控制方案参考。

2. 自由摆平板控制系统的动力学建模与目标划分

2.1 自由摆坐标系与自由度划分

常见做法是把系统抽象成三个自由度:摆杆绕铰链的转角theta,平板相对水平面的倾角phi,小球在平板上的位置x。摆杆自由摆动,电机只驱动平板转动,因此系统里只有phi是直接控制量,theta是外部扰动源,x是最终被控量。

建模时取铰链为原点,竖直向下为基准方向。摆杆简化为长度L的均质杆,小球简化为平板上的质点。平板的转动惯量与摆杆相比通常很小,但平板质量不能忽略,因为它会改变摆杆的等效质心位置,影响摆动周期。实际系统中摆杆越长,摆动周期越长,留给控制器的时间越充分;摆杆太短时,摆动频率高,对控制带宽的要求成倍增加。

2.2 摆杆运动在平板上形成的两类耦合加速度

用拉格朗日方程建立系统动能和势能后,把运动方程在摆角不大的条件下线性化,可以得到一个在工程上很有指导意义的近似式:

x_ddot = -g * sin(phi) - L * theta_ddot + x * theta_dot^2

其中x_ddot是小球相对平板的加速度,g * sin(phi)是平板倾角提供的恢复加速度,-L * theta_ddot是摆杆角加速度产生的切向干扰,x * theta_dot^2是摆杆转动带来的法向离心项。

-g * sin(phi)表明平板倾角本身就有让小球的稳的能力,这一项是控制作用的“执行通道”。-L * theta_ddot是最棘手的部分:摆杆回摆时角加速度方向突变,干扰瞬间换向,如果控制器只按当前角度误差输出,就会滞后半拍。x * theta_dot^2在摆速较高时明显,它会把小球向外侧推,表现为球在平板上来回“蠕动”。

从传递函数角度看,若暂不考虑干扰项,从平板倾角phi到小球位置x的通道近似是两个积分环节,系统开环不稳定,只靠比例控制必然振荡,必须引入速度反馈或者等效阻尼。这个结论直接决定了后面控制器要采用内外双环结构,而不是一个简单的单环PID。

2.3 两类控制目标的工程取舍

自由摆平板控制系统通常会分成两类目标。第一类是“镇定型”:不管摆杆怎么摆,小球尽量停在固定位置,通常停在平板中心。第二类是“跟随型”:给小球设定一条随时间变化的轨迹,比如正弦运动,系统要让小球跟随轨迹。两类目标对传感器和算法的要求差异很大,明确自己要做哪一类再动手,能避免后期返工。

目标类型控制任务验收标准传感器要求实现难度
镇定型小球固定在目标点摆幅30°内球位移<2cm球位置传感器+摆角传感器较低,适合入门
跟随型小球跟踪时变轨迹跟随延时<0.3s,误差<5cm球位置传感器+连续轨迹生成较高,需加前馈

硬件方案上两类目标几乎相同,区别主要在控制算法。镇定型用双环PID加前馈就能达到不错的效果;跟随型则额外需要轨迹规划模块,并且在控制环里加入目标速度前馈,否则纯位置调节会有明显滞后。下面章节的硬件方案按两类通用设计,算法部分以镇定型为基线,最后补充跟随型的扩展方法。

3. 自由摆平板控制系统的硬件方案与参数信息

3.1 机械结构设计与频率匹配

机械结构设计的核心是让“自由摆”真正自由,同时让平板驱动不产生额外扰动。常见的做法是摆杆用铝合金空心管或碳纤维管,一端通过轴承安装在支架上,另一端固定平板电机。支架底座要足够重,避免摆杆摆动时整个系统跟着晃。铰链处选用低摩擦轴承,但不要在轴上额外加润滑脂,否则自由摆衰减太慢,会给调试带来麻烦。

摆杆长度的选择要和控制频率匹配。一个L=0.4m的自由摆,单摆周期约为2 * PI * sqrt(L/g) ≈ 1.27s,这意味着控制系统的响应带宽至少要有摆动频率的5到10倍,控制周期建议不超过5ms。如果摆杆缩短到0.2m,周期降到约0.9s,同样的控制周期下相位裕度会明显变差。因此常规做法是把摆杆长度控制在0.3m~0.5m之间,平板尺寸在25cm×20cm左右,这样既能看清运动,又给控制器留出裕量。

平板与电机之间尽量采用直连或同步带连接。直连刚度高、响应快,但电机轴要能承受平板的弯矩;同步带可以缓解弯矩,但会引入弹性变形,在高速摆动时表现为平板末端的微小抖动。对小球控制来说,平板末端抖动等于直接给小球叠加干扰,因此我一般优先选直连方案。

3.2 角度检测与位置检测方案对比

摆杆角度测量有两种主流方案:编码器和六轴IMU。编码器安装在铰链转轴上,直接输出摆杆相对支架的角度,精度高、零漂小,但安装要求同轴度好,且只能测摆杆这一个角度。IMU方案把加速度计和陀螺仪贴在摆杆上,不需要精确的机械对准,但需要做滤波和零偏校正,否则角度积分漂移会让你怀疑控制算法写错了。

检测对象方案优点缺点典型器件
摆杆角度光电编码器精度高、零漂小安装同轴度要求高2000线增量编码器
摆杆角度六轴IMU安装灵活、可测角速度需要滤波与零偏校正MPU6050
小球位置线性电位器信号简单、响应快有机械摩擦导电塑料电位器
小球位置灰度传感器阵列无接触、成本低分辨率有限线性CCD或反射式传感器
小球位置摄像头信息丰富、无机械接触帧率受限OV2640

小球位置测量是很多人低估的部分。早期方案常用在平板上铺一层导电橡胶、小球作为触点的办法,但摩擦太大,小球运动被明显阻滞。更可靠的是用线性电位器或一排灰度传感器贴在平板下方,通过小球遮挡位置换算坐标。摄像头方案能同时获得位置和速度,但帧率通常只有30到60帧,控制周期被限制在16ms以上,对自由摆这种快速变化系统来说太低,不推荐在主控制环里直接使用,更适合作为离线分析工具。

3.3 驱动电机与扭矩估算

平板驱动选型需要同时满足扭矩和响应速度两个条件。航模舵机是入门阶段最省事的方案,自带位置闭环,但内部PID响应较慢,且无法直接控制扭矩,用在自由摆上会感觉平板动作“黏”。更可靠的是带编码器的直流减速电机或总线舵机,前者由主控直接做位置环,后者可以修改速度环参数。

驱动电机的最小扭矩可以按最恶劣工况估算。平板和球的转动惯量J乘以期望角加速度alpha_max,再加上重力偏置项:

T_min = J * alpha_max + M * g * r

其中M是平板和球的总质量,r是质心到电机轴的水平距离。工程上取1.5~2倍的安全余量后,额定扭矩在0.3~0.6 N·m的直流减速电机基本够用。减速比选择上,电机输出转速控制在60~120 rpm比较合适,太高则低速控制不平滑,太低则响应跟不上摆动干扰。

4. 基于互补滤波的摆角解算与双环PID控制实现

4.1 用互补滤波从IMU还原自由摆摆角

如果摆角由IMU测量,最常见的做法是先用加速度计结合atan2求静态角度,再用陀螺仪积分补充动态信息,最后用互补滤波融合。互补滤波比卡尔曼滤波简单得多,在自由摆这种角度变化范围已知的系统中效果差别很小。

#define GYRO_COEF 0.96f #define ACC_COEF 0.04f float pitch_angle = 0.0f; float gyro_bias = 0.0f; void swing_angle_init(float ax, float ay, float az, int samples) { float sum = 0.0f; for (int i = 0; i < samples; i++) { sum += read_gyro(); // 静止时采集陀螺仪输出 } gyro_bias = sum / samples; } void update_swing_angle(float ax, float ay, float az, float gyro_rate, float dt) { // 加速度计静态估计:把摆杆近似看作静止时测得重力分量 float acc_angle = atan2f(-ax, az) * 180.0f / PI; // 陀螺仪积分:减去零偏后再累计 float gyro_angle = pitch_angle + (gyro_rate - gyro_bias) * dt; // 一阶互补:低频信任加速度计,高频信任陀螺仪 pitch_angle = ACC_COEF * acc_angle + GYRO_COEF * gyro_angle; }

代码里acc_angle由加速度计的axaz求得,atan2f能同时处理象限符号,避免在摆杆过竖直位置时跳变。gyro_bias在初始化时静止采集若干帧陀螺仪平均值得到,这一步不能省,否则积分漂移会在几十秒内让角度偏出十几度。GYRO_COEF取0.96意味着动态过程主要依赖陀螺仪,只有低频段才由加速度计纠正,这个比例在摆杆场景下基本不用改动。

4.2 双环PID控制器结构:外环控位置、内环控角度

自由摆平板控制器的经典结构是双环控制器:外环根据小球位置误差计算出期望平板倾角,内环让平板快速跟踪这个期望倾角。外环慢、内环快,两者控制频率可以相同,但参数上内环增益要远高于外环。

#define BALL_TARGET 0.0f // 目标位置,平板中心 #define PWM_LIMIT 80.0f // 输出限幅,防止过驱动 void balance_control(float ball_pos, float ball_vel, float plate_angle, float plate_vel) { float target_angle, err_pos, err_angle, pid_out; // 外环:位置误差映射到期望倾角 err_pos = BALL_TARGET - ball_pos; target_angle = KP_POS * err_pos - KD_POS * ball_vel; // 内环:期望倾角和实际倾角的误差 err_angle = target_angle - plate_angle; pid_out = KP_ANG * err_angle - KD_ANG * plate_vel; // 限幅后输出PWM if (pid_out > PWM_LIMIT) pid_out = PWM_LIMIT; if (pid_out < -PWM_LIMIT) pid_out = -PWM_LIMIT; set_plate_pwm(pid_out); }

外环输出target_angle表示“平板应该倾斜多少度才能把球拉回中心”,KD_POS乘的是小球速度,方向为负是因为小球正在远离目标时应减小期望倾角。内环的KD_ANG直接作用于平板角速度,这一项相当于系统阻尼,能抑制平板本身的振荡。PWM_LIMIT根据电机驱动能力设定,工程上先取最大输出的80%,避免平板动作过猛。

这里有一个关键细节:外环的KD_POS不要加在位置误差微分上。小球位置信号通常带有测量噪声,直接微分会放大噪声,导致平板高频抖动。如果传感器只输出位置没有速度,可以用一阶低通近似微分,或者用位置差分加滑动平均,但不要用纯差分。

4.3 控制周期与中断定时器的参数设置

控制周期直接决定系统带宽上限。常见的做法是让内环控制频率保持在500Hz到1kHz,外环可以降到250Hz左右。若控制频率太低,自由摆的切向干扰在每个控制周期内变化过大,PID无法有效跟踪;太高则主控负担重,而且球位置传感器的采样率未必跟得上。

// 以72MHz主控为例,定时器中断频率500Hz void plate_timer_init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; // 72MHz/72 = 1MHz TIM_TimeBaseStructure.TIM_Period = 2000 - 1; // 1MHz/2000 = 500Hz TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); TIM_Cmd(TIM3, ENABLE); }

预分频器和自动重装值共同决定中断频率:72MHz / 72 / 2000 = 500Hz。把控制逻辑放在定时器中断服务函数里,主循环只负责显示和参数调整,这样控制周期不因主循环任务变化而抖动。如果主控还承担通信任务,需要给中断处理函数设定高优先级,并且中断服务函数里不要做浮点打印或阻塞式串口输出。

5. 自由摆平板控制器参数整定与典型故障排查

5.1 先整内环再开外环的调参步骤

双环控制器直接从外环调起很容易陷入振荡。正确顺序是先把小球固定住,整定内环平板角度环,再放开小球整定外环。

步骤整定对象操作现象调整方向
1内环KP_ANG平板快速到达目标倾角但来回抖减小KP_ANG
2内环KD_ANG平板到位慢、有超调增大KD_ANG
3内环联合手推平板感到柔顺有阻力定住当前值
4外环KP_POS球在中心附近低频振荡先减小KP_POS再加大KD_POS
5外环KD_POS球缓慢漂移、不收敛适当增大KP_POS
6前馈KFF摆动时球向一侧偏移调整前馈方向和幅值

内环整定时把小球用手按住或取下,给平板一个方波目标角,观察响应。KP_ANG过大时平板抖动明显并伴随电机发热;KD_ANG过小时平板会冲过目标位置再折返。内环调好后,平板的阶跃响应应该在一个到两个控制周期内到位,没有明显振荡。再把手松开,从KP_POS=0.5附近的较小值开始加,观察小球运动。如果球在中心来回荡,说明外环阻尼不够,优先增大KD_POS,不要急着减小KP_POS

5.2 自由摆运动中常见的三个失败场景

第一个故障场景是摆杆摆动后小球总是沿摆动方向偏移。这通常是前馈缺失或陀螺零偏不准导致的,而不是PID参数问题。处理办法是先让摆杆静止,检查小球是否能在平板中心稳定住;能稳定后再手动小幅度摆动摆杆,看偏移量是否随摆幅增大而增大。

第二个故障场景是平板高频高频抖动,类似“震颤”。这有两种来源:一种来自内环增益过高,放大了位置传感器噪声;另一种来自机械谐振,电机带动平板在高频段出现固有共振。排查时可以让摆杆完全静止,只给内环阶跃信号,如果静止时平板仍然发烫或声音尖锐,优先降低控制频率或对plate_vel增加一阶低通滤波。

第三个故障场景是球到达平板边缘后失控。这不是算法问题,而是平板边界与传感器量程不匹配。自由摆摆动幅度大时,球的运动范围会超过传感器有效测量区,控制器读到的是钳位值而不是真实位置。常见做法是在控制代码里判断球位置超出安全阈值后立即执行“平板上电回中”策略,防止球掉落后平板还朝一个方向猛转。

5.3 用冻结参数法判断控制器带宽

“冻结参数法”是我在调试这类系统时比较依赖的技巧。具体操作是:把控制器输出固定在一个偏置值上,让平板不参与反馈,只由外部电机或手动推动摆杆摆动,记录球在平板上的实际运动轨迹。这个轨迹反应的是纯干扰下的开环响应。

如果开环响应中球位移明显,说明干扰能量落在控制带宽之外;如果球位移虽然存在,但频率较低,则说明控制器有希望把干扰抑制掉。这能直观地回答一个常见问题:“到底是我PID参数不够好,还是响应速度根本不够?”冻结参数法还能验证前馈项的符号和比例——让前馈先单独作用,看能否抵消部分开环位移,再把前馈并入闭环,参数调整会顺畅很多。

6. 把摆杆角加速度变成前馈量:三个工程落点

6.1 摆杆角加速度前馈的写法

前馈补偿的目标是抵消x_ddot中的-L * theta_ddot项。估算摆杆角加速度最容易的方式是差分:用陀螺仪输出的摆杆角速度连续两帧做差再除以控制周期。虽然差分会引入噪声,但前馈通常只取差值的部分比例,噪声幅度有限。

float get_feedforward(float swing_vel, float dt) { static float last_vel = 0.0f; // 角速度差分近似角加速度 float swing_accel = (swing_vel - last_vel) / dt; last_vel = swing_vel; // 方向符号与摆杆长度有关,KFF=1时表示完全补偿 return KFF * swing_accel; }

KFF不是越大越好。大于1时前馈方向相反,反而会把球推向边缘;小于0.5时补偿不足,摆动中仍能看到周期性偏移。标定方法:让摆杆以固定幅度来回摆动,同时观察球的平均位置偏移。从0开始逐步增大KFF,当球的平均偏移量不再变化时,说明前馈系数已经收敛到该摆幅下的最佳值。

6.2 开机自检要检查的四个量

上电后不要急着进入控制循环,先做静态自检。第一项检查IMU零偏是否在预期范围,若零偏超过阈值说明传感器或供电有问题;第二项检查球位置传感器中心值,把球放在平板中心,确认读数与标定值一致;第三项检查平板电机正反向,用很小的PWM输出让平板左右各转一次,确认控制方向没有反;第四项确认定时器中断频率稳定,可以用示波器量一个GPIO翻转波形。这四项检查通过后再运行控制算法,可以把大部分硬件问题拦截在调参之前。

6.3 参数集管理与比赛调参的落地方式

调参过程中改动频繁,手动改代码里的常量再烧录效率太低。常见做法是把控制器参数定义成结构体数组,用拨码开关或按键选择参数组,在运行时直接生效。

typedef struct { float kp_ang, kd_ang; float kp_pos, kd_pos; float kff; int pwm_limit; } control_params_t; const control_params_t param_sets[3] = { { 8.0f, 0.4f, 1.2f, 0.3f, 0.6f, 80 }, { 6.5f, 0.5f, 1.0f, 0.4f, 0.8f, 80 }, { 9.0f, 0.3f, 1.5f, 0.5f, 0.5f, 100 }, };

这样每个参数组只对应一组完整配置,调参时可以快速对比三组之间的差别。比赛或验收现场时间有限,建议现场只验证“小摆幅稳定”“大摆幅缓慢恢复”和“小球位置回中精度”三个动作,这三项通过后再考虑跟随型轨迹。若出现球在平板上反复漂移且每种参数组都无改善,优先怀疑传感器标定值失效,而不是继续改PID参数。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询