免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

第188篇 状态空间表示——现代控制的起点

第188篇 状态空间表示——现代控制的起点 上一篇聊了串级PID位置环套速度环双环控制把跟踪精度拉上来了。但你有没有想过一个问题PID本质上就是拿误差来算控制量它根本不知道系统内部到底发生了什么。打个比方PID就像一个只看后视镜开车的司机——只盯着偏差不管引擎转速、轮胎抓地力、车身姿态这些内部状态。这在简单系统上没问题。但当你面对六足机器人、四旋翼无人机、有柔性关节的机械臂呢这些系统多输入多输出内部状态互相耦合PID就开始力不从心了。这时候你就需要一套更强大的语言来描述系统——状态空间表示。现代控制理论的所有东西LQR、MPC、观测器、自适应控制全都建立在这个基础上。面试时状态空间是必考内容不会这个后面全白搭。什么是状态为什么叫状态先说状态这个词。你想想要完整描述一个系统的未来行为你需要知道什么一个在平面上运动的小车你需要知道它的位置(x, y)和速度(vx, vy)。这四个量就是系统的状态。只要知道了这四个量再加上未来的输入加速度你就能推算出小车未来的所有运动轨迹。说白了状态就是描述系统所需的最小信息集合。少了它你推不动未来多了它又浪费。用一个更直觉的说法状态就是系统的记忆。知道了现在的状态过去发生了什么就不重要了——系统未来的行为只取决于当前状态和未来输入。这个性质叫马尔可夫性面试的时候偶尔会问到。状态空间方程两个方程打天下状态空间表示的核心就是两个方程dx/dt A*x B*u 状态方程 y C*x D*u 输出方程别被矩阵符号吓到。说白了就两句话状态方程描述的是系统内部状态怎么随时间变化。变化率等于当前状态的线性组合A矩阵加上控制输入的影响B矩阵。输出方程描述的是你能观测到什么。观测量是状态的线性组合C矩阵可能还有输入的直接馈通D矩阵。大多数物理系统D是零矩阵因为输入不会瞬间出现在输出上。拿之前那个小车举例。假设状态向量x [位置, 速度]^T输入u是加速度输出y是位置。那import numpy as np # 小车模型状态 [位置, 速度] # dx/dt A*x B*u A np.array([[0, 1], # 位置的变化率 速度 [0, 0]]) # 速度的变化率 0由输入决定 B np.array([[0], [1]]) # 加速度直接影响速度变化率 C np.array([[1, 0]]) # 只能观测到位置 D np.array([[0]]) # 输入不直接出现在输出 # 离散化采样时间dt0.01s dt 0.01 Ad np.eye(2) A * dt # 近似离散化 Bd B * dt print(离散状态转移矩阵Ad:) print(Ad) print(离散输入矩阵Bd:) print(Bd)运行出来Ad就是[[1, 0.01], [0, 1]]Bd就是[[0], [0.01]]。物理意义很直白下一步的位置 当前位置 速度0.01下一步的速度 当前速度 加速度0.01。从传递函数到状态空间为什么要换一种描述学过经典控制的同学肯定熟悉传递函数。一个SISO系统用传递函数G(s) Y(s)/U(s)就能描述。为什么还要搞状态空间三个原因每个都很致命。第一传递函数只能描述单输入单输出系统。你做个四旋翼四个电机转速是输入六自由度位姿是输出4输入6输出传递函数矩阵写出来能让人崩溃。状态空间天然支持MIMO系统多输入多输出写出来形式完全一样就是矩阵变大而已。第二传递函数只描述输入输出关系丢掉了内部信息。同一个传递函数可能对应不同的内部结构。比如两个子系统并联和串联可能得到相同的传递函数但内部状态完全不同。状态空间保留了系统的全部内部结构信息。第三传递函数处理不了非零初始条件。传递函数默认零初始条件。但机器人启动时可能有初始速度、姿态偏差这些在传递函数框架下很难处理。状态空间方程天然包含初始状态x(0)。面试的时候面试官问为什么要用状态空间你就从这三个角度回答MIMO能力、内部信息完整性、初始条件处理。这三点答出来面试官就知道你是真懂的。状态空间不唯一同一个系统可以有不同表示同一个系统状态空间的表示不是唯一的。你选不同的状态变量就得到不同的A、B、C、D矩阵。比如那个小车系统你可以选[位置, 速度]做状态也可以选[位置, 位置速度]做状态A矩阵完全不同。不同表示之间通过线性变换转换。状态x做变换z TxT可逆系统矩阵变成A_new TAinv(T)B_new TBC_new C*inv(T)D不变。面试特别爱考这个状态空间不唯一那系统的固有特性跟什么有关答案是特征值——线性变换不改变矩阵的特征值而特征值决定了系统的稳定性。后面讲极点配置时还会详细聊。还有一种特别有用的标准型叫可控标准型把A矩阵变成友矩阵的形式直接就能看出系统能不能控制后面讲能控性的时候会展开。连续和离散计算机只能处理离散系统实际写代码的时候你面对的都是离散系统。微分方程dx/dt Ax Bu要变成差分方程x[k1] Adx[k] Bdu[k]。最简单的离散化方法是前向欧拉Ad I AdtBd Bdt。但这个方法精度不高dt大了会不稳定。更精确的方法是零阶保持ZOH离散化用矩阵指数from scipy.linalg import expm # 精确离散化零阶保持 M expm(np.vstack([np.hstack([A, B]), np.zeros((1, 3))]) * dt) Ad M[:2, :2] Bd M[:2, 2:]工程上有个经验法则采样频率至少是系统最高频率的10倍。比如电机控制环路带宽100Hz采样频率至少1kHz。低于这个频率离散化误差大控制器性能明显下降。面试被问到连续系统怎么离散化至少说得出前向欧拉和ZOH两种方法再说采样频率的经验法则就够了。能提到双线性变换Tustin方法面试官会觉得你的基础非常扎实。面试实战状态空间相关的常见问题我整理几个面试高频问题你对照看看自己能不能答上来Q状态变量的物理意义是什么A状态变量是描述系统内部行为的最小变量集合。最小意味着少了不够、多了浪费。最小还意味着这些变量之间是线性无关的。QA矩阵的特征值代表什么A特征值就是系统的极点。特征值的实部决定稳定性实部为负则稳定虚部决定振荡频率。这是连接状态空间和经典控制理论的桥梁。Q状态空间模型和传递函数怎么互相转换A状态空间转传递函数G(s) C*(sI-A)^(-1)*B D。传递函数转状态空间可写成可控标准型或可观测标准型但不唯一。Q非线性系统能不能用状态空间表示A当然能。非线性状态空间就是dx/dt f(x, u)y h(x, u)。只是分析手段从矩阵运算变成了Lyapunov方法。这个我们后面第199篇会详细讲。讲真状态空间这个知识点很多候选人背了公式但理解不深。面试时能举一个实际机器人的例子来解释A、B、C、D矩阵的物理意义面试官对你的印象会完全不一样。小结今天聊了状态空间表示现代控制理论的基石。核心就两件事状态方程描述系统内部怎么演化输出方程描述你能观测到什么。从PID到状态空间本质上是从只看误差到理解系统内部的跨越。有了状态空间后面才能聊能控性能观性、状态反馈、观测器、LQR、MPC。下一篇我们聊能控性和能观性——你的系统到底能不能被控制、能不能被观测这两个性质决定了你能不能设计控制器是现代控制理论里最基础也最重要的判定。如果这篇文章对你有帮助欢迎点赞、在看、转发三连。 你的支持是我持续更新的最大动力。「机器人软件开发面试·从入门到精通」连载系列上一篇第187篇 串级PID——位置环速度环的双环控制设计下一篇预告第189篇 能控性与能观性——系统能不能控制/观测的判定任何疑问都欢迎评论区留言讨论我会尽量逐一回复。
返回列表