从零构建自平衡倒立摆:LQR控制与卡尔曼滤波的嵌入式实践
2026/5/26 0:39:52 网站建设 项目流程

1. 项目概述:一个自平衡倒立摆的诞生

如果你对经典的控制理论实验——倒立摆——感到厌倦,觉得它体积庞大、线缆缠绕、离不开笨重的电源和上位机,那么这个项目可能会让你眼前一亮。我花了近一年时间,从零开始设计并制作了一个完全自包含、电池供电的一维倒立摆。它的核心是一个直角三角棱柱,仅凭一个单边就能保持直立,而实现这一“反重力”平衡的秘密,在于其内部一个高速旋转的反作用飞轮。整个系统,包括电池、电机驱动、微控制器和传感器,全部集成在一个边长仅10厘米、厚度约5厘米的紧凑外壳内。这个项目的灵感来源于苏黎世联邦理工学院的Cubli立方体机器人,但将其简化为一维,使其成为学习现代控制理论(如LQR状态反馈和卡尔曼滤波)的绝佳实践平台。对于从事汽车电子、机器人或任何涉及动态系统控制的工程师和学生来说,这不仅仅是一个“玩具”,更是一个浓缩了传感器融合、实时控制、电机驱动和电源管理技术的微型实验室。

2. 核心设计思路与系统架构解析

2.1 为什么选择“反作用轮”方案?

传统的倒立摆通常通过移动底部小车或旋转底座来保持摆杆平衡。我选择反作用轮方案,主要基于几个核心考量。首先,它实现了系统的完全自包含。所有执行机构和控制系统都集成在摆体内部,无需外部执行器,这大大简化了机械结构,使得整个装置非常紧凑。其次,反作用轮产生的扭矩直接作用于摆体本身,响应速度快,控制带宽高。最后,从控制理论角度看,这是一个典型的欠驱动系统(只有一个执行器——电机,但需要控制多个状态),其动力学模型清晰,非常适合用于验证先进的控制算法。

这个系统的核心物理原理是角动量守恒。当电机驱动飞轮朝一个方向加速旋转时,会产生一个反作用扭矩,推动摆体朝相反方向转动。通过精确控制这个扭矩的大小和方向,我们就能抵消重力矩以及外部扰动,使摆体维持在倒立的不稳定平衡点上。整个系统的状态可以简化为几个关键变量:摆体的角度、角速度,以及飞轮的角速度。

2.2 硬件系统总览与选型逻辑

为了实现上述控制,硬件系统需要精心选型。整个系统的核心是一个闭环控制系统:传感器测量摆体状态,微控制器运行控制算法计算出所需的控制扭矩,电机驱动器驱动电机产生精确的扭矩,进而通过飞轮影响摆体。

  1. 执行机构(电机与飞轮):我选择了一款无刷直流电机,额定扭矩50mNm,电流2A。选择BLDC电机而非有刷电机,主要看中其高效率、高功率密度、长寿命和低维护需求。飞轮直接耦合在电机轴上,其转动惯量是关键参数。转动惯量越大,产生相同反作用扭矩所需的角加速度越小,对电机瞬时扭矩要求越低,但系统的响应速度也会变慢。这是一个需要权衡的设计点。我最终采用3D打印轮毂搭配金属配重环的方案,在保证足够转动惯量的同时,控制了重量和成本。

  2. 感知系统(IMU):要估计摆体的姿态,我采用了惯性测量单元的组合:一个三轴加速度计和一个单轴陀螺仪。加速度计测量包含重力加速度在内的比力,在静态或低速时可用来估算倾角,但对振动非常敏感;陀螺仪测量角速度,积分可得角度,但存在漂移。因此,必须通过传感器融合算法(如卡尔曼滤波)来结合两者优点,获得稳定、准确的状态估计。这是整个项目软件层面的核心挑战之一。

  3. 大脑与神经(微控制器):我选择了Microchip的dsPIC系列单片机。原因在于其兼具MCU的易用性和DSP的强大运算能力。控制算法中的矩阵运算和滤波器更新需要一定的计算性能,dsPIC的硬件乘加单元能很好地满足实时性要求。同时,它丰富的外设(PWM、ADC、UART)也便于连接电机驱动器和传感器。

  4. 能源与动力(电源系统):为了实现自包含,一块7.4V、450mAh的2S锂聚合物电池是心脏。其30C的放电倍率意味着它能提供高达13.5A的瞬时电流,足以满足电机峰值需求。整个电源架构包含一个开关稳压器,将电池电压转换为电机驱动和数字电路所需的各种电压,确保高效、稳定的能源供应。

注意:电机、电池和飞轮的选型需要协同考虑。电机的峰值扭矩和转速必须能满足快速平衡和抗扰动的需求;电池的放电能力要能支撑电机的峰值电流;飞轮的转动惯量则决定了扭矩与角加速度之间的转换关系。在项目初期,通过简单的动力学仿真来估算这些参数范围至关重要,可以避免硬件上的反复。

3. 电子系统设计与实现细节

3.1 电机驱动电路:从电流指令到精确扭矩

无刷直流电机的控制核心是驱动板。我围绕L6235芯片构建了驱动电路。这款芯片是一个集成了三相桥式驱动器和部分保护功能的驱动器,它有一个关键特性:可以通过模拟电压输入来设定相电流参考值。这对于控制至关重要。

在BLDC电机中,产生的电磁扭矩与相电流成正比(在磁场恒定的情况下)。因此,控制扭矩本质上就是控制电流。我的控制算法最终输出的是一个“扭矩指令”,这个指令被转换为一个对应的“电流参考值”电压,送入L6235。驱动器内部的电流检测和PWM调制回路会努力使电机相电流跟踪这个参考值,从而产生精确的扭矩。这种电流环控制模式,将复杂的电机换相和电流控制问题交给了专用芯片,微控制器只需提供高层的扭矩指令,大大简化了软件设计。

此外,L6235还能输出由电机霍尔传感器解码得到的速度信号。这个速度信号不仅用于监控飞轮转速(这是系统的一个关键状态量),在某些高级控制策略中也可以用于构建转速闭环。

3.2 传感器接口与数据采集优化

IMU的数据采集是状态估计的基础,需要保证准确和及时。

  • ADXL345加速度计:通过I2C接口通信。我将其配置为±4g量程,输出数据速率设为800Hz。在读取时,需要注意消除由于电机振动引起的高频噪声。在硬件上,确保传感器被牢固安装,并在电源处添加去耦电容;在软件上,后续的卡尔曼滤波器会处理这些噪声。
  • ISZ-2510陀螺仪:这是一个模拟输出的陀螺仪。我使用dsPIC的ADC模块进行采样。ADC的采样率设置为与控制周期同步(例如1kHz)。关键点在于对ADC值进行校准,包括零偏(静止时的输出值)和比例因子(电压与角速度的转换系数)。零偏会随温度漂移,因此在系统上电静止时进行短暂的自动零偏校准,能有效改善精度。

所有传感器的数据采集必须在严格的时间间隔内完成,并与控制算法的执行周期同步。我使用dsPIC的定时器产生一个固定频率的中断(如500Hz或1kHz),在这个中断服务程序中,依次读取所有传感器数据,然后执行控制算法。这种时间确定性是实时控制系统稳定性的保障。

3.3 电源管理设计:高效与紧凑的平衡

在一个封闭空间内集成电机驱动和数字电路,电源设计面临散热和噪声挑战。我的方案是一个两级电源架构:

  1. 电池直接为电机驱动桥供电。
  2. 一个高效的开关稳压器从电池取电,产生一个稳定的5V或3.3V电压,为单片机、传感器和驱动芯片的逻辑部分供电。

关键挑战是电机驱动产生的大的瞬态电流会在电源网络上造成电压跌落和噪声,可能干扰敏感的模拟电路和数字逻辑。为此,我采取了以下措施:

  • 布局隔离:在PCB布局上,将大电流的电机驱动路径与敏感的模拟/数字信号路径严格分开,避免共地线阻抗耦合噪声。
  • 星型接地:为模拟地、数字地、电机功率地设计单独的走线,最后在电池负极单点连接。
  • 充分的去耦:在电机驱动芯片、单片机、传感器的电源引脚附近,就近放置不同容值的去耦电容(如10uF钽电容并联0.1uF陶瓷电容),为瞬态电流提供局部储能,滤除高频噪声。

4. 控制算法:从仿真到嵌入式实现

4.1 系统建模与LQR控制器设计

控制的第一步是为物理系统建立数学模型。我将倒立摆系统线性化 around the upright equilibrium point (around the upright equilibrium point)。状态变量通常选择为:摆体角度θ、摆体角速度θ_dot、飞轮角速度φ_dot。控制输入u是电机扭矩。

通过牛顿-欧拉方程或拉格朗日力学,可以推导出系统的状态空间方程:dx/dt = A*x + B*u。其中A和B是系统矩阵。有了这个模型,就可以在Matlab/Simulink中进行仿真,验证模型的正确性,并设计控制器。

我选择了线性二次型调节器作为控制方法。LQR的核心思想是找到一个状态反馈控制律u = -K*x,使得一个综合了状态误差和控制能量的二次型性能指标最小化。在Matlab中,使用lqr(A, B, Q, R)函数可以轻松计算出最优反馈增益矩阵K。其中Q和R是设计者选择的权重矩阵,它们决定了控制器是更关注快速消除状态偏差(增大Q),还是更关注节省控制能量、避免过大扭矩(增大R)。通过调整Q和R,我可以在仿真中观察系统对不同扰动的响应,权衡响应速度、超调量和控制量大小,直到获得满意的性能。

4.2 卡尔曼滤波器:从噪声数据中估计状态

在真实系统中,我们无法直接测量所有状态。我们只能获得带有噪声的传感器数据:加速度计输出(包含重力分量和运动加速度)和陀螺仪输出。卡尔曼滤波器的任务就是融合这些有噪声、不完整的测量值,最优地估计出系统的全部状态。

我为系统设计了一个扩展卡尔曼滤波器。过程模型基于上述的物理模型,并加入了过程噪声(建模不确定性)。测量模型则描述了传感器输出与状态之间的关系。例如,当摆体倾斜角度为θ时,重力在加速度计敏感轴上的投影为g*sin(θ),但任何线加速度都会污染这个信号。EKF通过预测和更新两个步骤递归运行:

  1. 预测:根据上一时刻的状态估计和控制输入,利用物理模型预测当前时刻的状态和误差协方差。
  2. 更新:获取当前时刻的传感器测量值,与预测的测量值进行比较。根据预测的不确定性(协方差)和传感器噪声的大小,计算一个最优的“卡尔曼增益”,用它来修正预测的状态,得到更准确的最终估计。

在dsPIC上实现EKF需要注意计算效率和数值稳定性。矩阵运算需要仔细编码,避免浮点数溢出。通常需要利用矩阵的稀疏性或对称性来简化计算。

4.3 控制律的离散化与代码实现

在Matlab中设计好的连续时间LQR增益K和连续时间EKF,必须被离散化,以适应微控制器的离散时间运行。我采用零阶保持法对系统进行离散化,得到离散时间的系统矩阵A_d和B_d,然后重新计算离散时间的LQR增益K_d。同样,EKF也需要转换为离散时间形式。

在代码中,控制循环的结构如下:

void ControlInterruptServiceRoutine(void) { // 1. 读取传感器数据 (ADC, I2C) read_imu(&accel, &gyro); // 2. 执行卡尔曼滤波预测步(基于上次的扭矩指令) ekf_predict(last_torque_command, dt); // 3. 用新传感器数据执行卡尔曼滤波更新步 ekf_update(accel, gyro); // 4. 从EKF获取状态估计值 get_estimated_state(&theta, &theta_dot, &phi_dot); // 5. 计算LQR控制量: torque = -K * [theta; theta_dot; phi_dot] torque_command = - (K1*theta + K2*theta_dot + K3*phi_dot); // 6. 将扭矩指令转换为电机驱动器的电流参考值(考虑电机扭矩常数) current_ref = torque_command / Kt; set_motor_current(current_ref); // 7. 记录或发送遥测数据(用于调试) send_telemetry(theta, torque_command, ...); }

这个中断服务程序必须尽可能高效,确保能在规定周期内完成所有计算,否则会破坏系统的实时性。

5. 机械结构设计与装配心得

5.1 外壳的3D打印:精度与强度的权衡

外壳需要容纳所有电子部件、电池和电机,并作为摆体的主体,其设计至关重要。我使用SolidWorks进行建模,并交由专业的3D打印服务商制作。材料选择了强度较好的尼龙(PA12)进行选择性激光烧结。

设计时主要考虑以下几点:

  • 重心位置:系统的整体重心应尽可能低,以降低平衡所需的控制能量。因此,较重的电池和电机被布置在三角形的底部区域。
  • 内部布局:PCB、电池、电机之间需要留有清晰的走线和装配空间。我设计了卡槽和支柱来固定PCB和电池,避免使用胶水,方便拆卸维修。
  • 电机安装:电机需要被非常牢固地固定,任何微小的晃动都会引入额外的扰动。外壳的电机座设计了加强筋,并使用紧配合和螺丝双重固定。
  • 轴系对齐:飞轮需要精确地与电机轴同轴,否则旋转时会产生振动。我在电机轴和3D打印的飞轮轮毂之间设计了一个D型轴孔配合,确保无相对转动,同时用一颗顶丝进行轴向固定。

实操心得:第一次打印的外壳在电机高速启动时发生了共振,产生令人不安的噪音。问题在于某些面板的厚度不足,形成了“鼓膜”。在第二次迭代中,我对关键受力区域进行了加厚,并增加了内部肋条,显著提高了结构刚度,消除了共振。3D打印并非一蹴而就,预留迭代预算和时间非常必要。

5.2 飞轮的制作:转动惯量的简易实现

飞轮是储存角动量的部件。为了获得足够的转动惯量,质量应尽可能分布在远离转轴的位置。最经济的实现方式是“轮毂+配重环”的结构。

  1. 我用3D打印了一个轻质的塑料轮毂,中心与电机轴连接,外围设计了一个凹槽。
  2. 从市场上购买了一个标准尺寸的不锈钢垫圈或开口环,其内径与轮毂凹槽外径紧配合。
  3. 将金属环压入塑料轮毂的凹槽中。依靠过盈配合,无需胶水即可牢固固定。

这种方法的优点是转动惯量大、成本低、易于加工和平衡。在装配前,可以将飞轮粗略地放在一个平板上滚动,观察其停止位置是否随机,以检查静平衡。对于这个转速级别的应用,简单的静平衡已足够。

5.3 总装与配平

整个系统仅用9颗螺丝组装,体现了模块化设计的思路。装配顺序很重要:

  1. 首先将电机固定到外壳上。
  2. 将飞轮安装到电机轴上并锁紧。
  3. 将焊好元件的PCB板安装到外壳的卡槽内。
  4. 连接电机到驱动板的三相线,以及霍尔传感器线。
  5. 连接IMU传感器(如果它是分立的)。
  6. 放入电池并连接电源插头。
  7. 盖上并固定另一侧的外壳面板。

装配完成后,一个重要的步骤是静态配平。在电机不通电的情况下,将摆体放在刀刃或棱边上,观察它是否倾向于倒向某一侧。理想情况下,它应该是不稳定的,但任何明显的静态偏向都意味着重心没有精确落在支点所在的棱边上。可以通过在外壳内部微量移动电池的位置,或粘贴配重块来进行调整。良好的静态配平可以显著降低控制器维持平衡的稳态负担。

6. 上位机控制站:校准、监控与调试的生命线

一个功能完善的上位机软件对于此类项目的开发调试不可或缺。我用C#编写了一个Windows控制站程序,通过USB转串口与倒立摆通信。

6.1 通信协议设计

为了保证通信的可靠性,我设计了一个简单的帧结构协议:

[帧头 0xAA] [命令字] [数据长度N] [数据...] [校验和]

dsPIC端的固件持续解析串口数据,识别出完整的帧后,根据命令字执行相应操作,如校准、设置参数、返回数据等。

6.2 核心功能模块

  1. 传感器校准:这是上位机最重要的功能之一。通过发送命令,让摆体保持在不同已知姿态(如水平放置、垂直悬挂),然后采集加速度计和陀螺仪的数据,自动计算零偏和比例因子,并下发给单片机存储。这取代了繁琐的手动计算和固件烧写。
  2. 参数配置与调参:可以将Matlab计算好的LQR增益矩阵K、EKF的噪声协方差矩阵Q和R等参数,通过上位机方便地发送给单片机。在调试时,可以实时修改某个增益,观察系统响应,极大地提升了调参效率。
  3. 实时数据监控与绘图:单片机以固定频率向上位机发送状态数据包(如估计角度、真实角速度、控制扭矩、电机电流等)。上位机软件以波形图的形式实时显示这些数据,帮助直观理解系统动态。所有数据同时被记录到日志文件中,供事后分析。
  4. 命令控制:可以手动发送指令,如“启动平衡”、“停止”、“急停”、“设定目标角度”等,进行功能性测试。

6.3 调试实战:如何利用控制站解决问题

在首次尝试平衡时,摆体剧烈振荡后倒下。通过上位机观察数据,我发现了问题:

  • 现象:波形显示估计角度严重滞后于真实运动趋势。
  • 分析:检查EKF的预测模型,发现我错误地将电机扭矩对摆体角加速度的影响系数设置得过小。这导致EKF过于依赖缓慢的加速度计数据,而对快速的陀螺仪数据信任不足,造成估计延迟。
  • 解决:通过上位机,我减小了EKF中陀螺仪测量噪声的协方差设置(增加对其信任),并重新校准了模型中的扭矩系数。重新下发参数后,角度估计变得灵敏,控制器得以提前动作,成功实现了稳定。

这个经历凸显了可视化工具在调试复杂动态系统中的巨大价值。没有上位机,这种问题就像在黑暗中摸索。

7. 系统集成、测试与性能优化

7.1 从开环测试到闭环稳定

在尝试全状态反馈平衡之前,必须进行一系列循序渐进的测试:

  1. 开环测试:确保所有硬件基本工作正常。包括:电机能正反转、电流控制环能跟踪指令、传感器数据读取正确、通信畅通。
  2. 状态估计测试:在平衡控制环路不介入的情况下,手持摆体缓慢晃动,通过上位机观察卡尔曼滤波器估计的角度是否平滑、准确地跟随真实运动。对比纯陀螺仪积分(会漂移)和纯加速度计计算(噪声大)的结果,验证EKF融合效果。
  3. 定点平衡测试:这是最激动人心的时刻。用手将摆体扶到接近直立位置,然后使能平衡控制器。观察它能否自己站稳。初始几次几乎必然失败。需要结合上位机数据,仔细调整LQR的权重矩阵Q和R。通常先保守一些,增大控制权重R,减小扭矩,避免剧烈振荡导致机械损坏。待能勉强站稳后,再逐步提高响应速度。

7.2 抗扰动测试与性能提升

当摆体能够稳定站立后,就可以进行抗扰动测试,评估控制器的鲁棒性。

  • 轻推测试:用手指轻轻推一下摆体,观察它能否快速恢复平衡。如果恢复缓慢或振荡,可能需要增加状态反馈中角度和角速度的增益(调整Q矩阵)。
  • 持续干扰:在摆体一侧贴上一个小质量块,模拟重心偏移。一个好的控制器应该能通过调整飞轮转速产生的稳态扭矩来抵消这个持续的重力矩,使摆体依然保持直立。
  • 带宽测试:通过上位机发送一个小的正弦角度指令,观察系统跟踪能力。这可以评估控制系统的带宽。

在优化过程中,一个常见的矛盾是性能与鲁棒性的权衡。更高的增益带来更快的响应,但也使系统对模型误差、传感器噪声和延迟更敏感,容易失稳。我采用的方法是:先在仿真中找到一个性能较好的参数集,然后在实物上以该参数为起点微调。在实物上调参时,优先保证在各种小扰动下稳定,再逐步追求响应速度。

7.3 功耗管理与续航考量

作为一个电池供电的设备,功耗是需要关注的实际问题。主要耗电部件是电机和微控制器。

  • 电机功耗:在平衡状态下,电机主要用来输出一个很小的稳态扭矩以抵消各种不对称性(如重心偏差、轴承摩擦)。平均电流通常很低。但在抵抗扰动或进行“起摆”动作时,会有瞬时的大电流。电池的放电能力必须满足这个峰值需求。
  • 电子系统功耗:dsPIC和传感器在全速运行下的功耗约为几十毫瓦。可以通过优化代码,在空闲时让单片机进入低功耗模式来进一步节省电能。
  • 续航估算:以450mAh电池为例,如果平均工作电流为200mA(这是一个较高的估计),理论续航时间约为2.25小时。实际测试中,在平稳站立状态下,续航可以轻松超过1.5小时,完全满足演示和实验需求。

8. 常见问题与故障排查实录

在开发过程中,我遇到了各种各样的问题,以下是一些典型问题及其解决方法,希望能为你扫清障碍。

问题现象可能原因排查步骤与解决方案
上电后电机不转,或抖动一下即停1. 电机相序接错。
2. 霍尔传感器接线错误或损坏。
3. 驱动器电流限制设置过低或过流保护触发。
4. 电源电压不足。
1. 任意交换两相电机线,看是否正常。
2. 用示波器检查三个霍尔信号在上电转动时是否有规律方波输出。
3. 检查驱动器电流检测电阻配置,并暂时提高电流限制值测试。
4. 测量电池电压,确保在负载下不低于电机最低工作电压。
摆体角度估计值漂移严重1. 陀螺仪零偏未校准或温漂大。
2. 加速度计在振动环境下噪声过大,污染了EKF更新。
3. EKF中的过程噪声或测量噪声协方差矩阵设置不当。
1. 执行严格的陀螺仪零偏校准(静止平均)。
2. 检查机械结构是否牢固,尝试在软件中对加速度计数据进行低通滤波(但需谨慎,会引入延迟)。
3. 在EKF中适当增大加速度计的测量噪声协方差,降低其对状态估计的权重。
控制器启用后,摆体剧烈振荡后倒下1. 控制增益过高(特别是微分增益)。
2. 状态估计延迟过大。
3. 传感器与执行器之间存在相位滞后(如软件计算耗时过长)。
1. 大幅降低LQR增益,特别是角速度反馈增益K2,先求稳定。
2. 检查EKF估计的角度是否滞后于真实运动。优化EKF代码,减少计算时间。
3. 测量从传感器采样到电机PWM更新的总时间延迟。确保控制频率足够高(>200Hz),并优化中断服务程序。
平衡时电机发出高频啸叫1. 电机电流环的PWM频率处于人耳可听范围(通常为几kHz到十几kHz)。
2. 机械共振。
1. 尝试提高电机驱动器的PWM频率(如从16kHz提高到20kHz以上),超出人耳听觉范围。
2. 用手触摸外壳不同位置,找到共振点。加固结构或粘贴阻尼材料。
通信时好时坏,数据包错乱1. 串口波特率不匹配。
2. 电源噪声导致单片机复位或逻辑错误。
3. 缓冲区溢出。
1. 确认双方波特率、数据位、停止位、校验位完全一致。
2. 用示波器观察单片机电源电压,在电机启动时是否有大幅跌落。加强电源去耦。
3. 检查上位机发送频率是否过高,或单片机接收中断处理是否及时清除了缓冲区。
电池续航远低于预期1. 存在短路或异常大电流消耗。
2. 电机长期工作在大电流状态。
3. 控制频率过高,单片机持续高负荷运行。
1. 断开电机,测量系统静态电流,应在几十mA级别。
2. 观察平衡时平均电流。如果持续很高,检查重心是否严重偏离,导致需要很大稳态扭矩补偿。
3. 在不影响性能的前提下,尝试降低控制循环频率。

这个项目从一块空白的PCB到一个能够自主对抗重力稳定站立的智能体,整个过程充满了挑战与乐趣。它几乎涵盖了嵌入式控制系统开发的全部环节:机械设计、电子硬件、固件编程、算法仿真与实现、上位机软件以及系统集成调试。对我而言,最大的收获不是最终让它立起来的那一瞬间,而是在解决每一个具体问题(无论是传感器噪声、机械共振,还是滤波器发散)的过程中,对理论如何映射到实践有了更深刻的理解。如果你也打算尝试,我的建议是:耐心做好仿真,重视数据可视化,并且永远为硬件迭代留出预算和时间。当你的造物违背直觉稳稳立住时,你会觉得所有付出都是值得的。

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

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

立即咨询