13kg级两轮自平衡机器人抗扰LQR控制器优化设计问询:解决外力扰动下无前后漂移的平衡与停止问题
嘿,我太懂你这种“能站稳但飘不停”的头疼了——我之前做12kg的自平衡机器人时也踩过一模一样的坑!咱们一步步拆解问题,给你捋清楚最优的解决思路:
你的纯LQR目前只解决了姿态平衡(theta稳定),但完全没约束位置/速度的稳态误差。两轮自平衡机器人是欠驱动系统,x和theta强耦合,再加上外力扰动、地面摩擦这类未建模因素,纯状态反馈的LQR根本没法消除位置漂移的稳态误差——这就是为什么机器人能站稳,但会一直前后滑。
方案1:全零参考+整定K
你纠结的x和theta增益符号问题,本质是系统的耦合特性:
- 假设theta定义为前倾为正,当机器人向前漂移(x变大),需要让机器人前倾(theta正),这样轮子会向后转动拉回位置;而当机器人前倾(theta正),控制器需要让轮子向前转维持平衡。所以LQR增益里,x和theta的系数符号应该相反。
但只靠整定纯LQR的K很难解决漂移:如果把x的权重拉得极高,虽然能抑制漂移,但会牺牲平衡的鲁棒性(被踢后容易翻);权重太低又挡不住漂移。而且纯状态反馈天生没法消除稳态误差,外力扰动后必然会有位置偏移。
方案2:启发式规则+LQR
你用的“x_dot向前则theta向后倾”规则,本质是试图用前馈修正位置,但这个规则太粗暴了——它和LQR的反馈回路直接冲突,导致系统动态响应混乱,被踢后自然会振荡跌倒。这种独立于反馈的启发式,除非做非常精细的动态匹配,否则只会添乱。
不用纠结复杂启发式,也不用死磕纯LQR的参数,给LQR加入针对位置x的积分环节是解决这个问题的标准且高效的方案:
具体怎么做?
构建增广状态空间模型
原状态向量是[x, x_dot, theta, theta_dot],加入积分状态xi = ∫(x - x_ref)dt(x_ref设为0即可),那么xi的导数就是x - x_ref。把这个增广后的状态(共5维)代入原机器人动力学方程,得到新的状态矩阵A和输入矩阵B。重新设计LQR权重Q和R
在Q矩阵里给积分状态xi设置合适的权重:- 先把xi的权重设为x权重的1/10~1/5,避免积分项太激进导致振荡;
- 同时适当提高x_dot的权重,让控制器更关注速度的稳定。
计算增广系统的LQR增益
用MATLAB的lqr函数计算新的增益K,这时候K会包含对应xi的项——这就是积分控制器的增益,能自动消除位置的稳态误差。
为什么这招管用?
当机器人被踢后,x会偏离0点,积分项xi会持续累积,直到控制器输出足够的力矩:先通过调整theta维持平衡,同时慢慢把x_dot降到0,最终让机器人停止移动,不会再持续漂移。
如果实在不想改状态模型,也可以优化启发式规则,但要和LQR融合而不是独立:
- 不要直接硬设theta的参考值,而是微调theta参考:
theta_ref = -k * x_dot,其中k是很小的比例系数(比如0.01~0.05)。这样当x_dot向前,theta_ref稍微向后倾,让轮子产生平滑的反向加速度,不会和LQR的反馈冲突; - 同时在纯LQR的Q矩阵里大幅提高x和x_dot的权重,让控制器更关注位置和速度的稳定。
优先选带x积分的ILQR,这是解决自平衡机器人漂移+抗扰动问题的工业级方案,比整定纯LQR参数或者折腾复杂启发式靠谱得多。亲测我当年用这个方案后,机器人被踢后能在2~3秒内站稳并停止漂移,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Luca Mannini

