PD控制器的本质与应用(一)

PD控制器的本质与应用(一)

关于这个系列

在参加2018年DJI的robomaster高中生夏令营之后就想写一些给高中生和准大学生看的机器学相关内容, 这个系列的文章将先对高中的知识加以扩充, 侧重理论分析,来介绍机器人学中的:

  • 运动学
  • 动力学
  • 控制学

之后加上丰富的例子, 帮助我们把理论在机器人比赛或者其他的项目上实现.

关于这篇文章

在2018年DJI的robomaster高中生夏令营的期间, 大部分的营员都将控制学当作一门玄学来看待. 大部分控制器是用在3508电机的闭环控制上面, 但是没有考虑3508电机所驱动的系统, 只是简单的用一个位置PID控制器然后进行调参, 遇到较复杂的非线性系统(下面会举例), 控制效果很差, 也有营员用串级PID控制, 还总结出了在某些情况用位置串速度环的控制效果好, 某些情况只用位置环更好等让人哭笑不得的结论; 组委会给的例程中控制部分也有一处错误和一处不妥, 因此我在夏令营刚结束就开始着手写这一篇文章, 将涉及:

  • 微分方程(Differential equation)
  • 控制目标与误差空间(Control goal and error space)
  • 线性控制(Linear control)
  • 基于模型的非线性控制(一) (Model-based nonlinear control)

下一篇文章:

  • 控制规律分解(Control-law partitioning)
  • 基于模型的非线性控制(二) (Model-based nonlinear control)
  • 轨迹生成(Trajectory generation)
  • 轨迹跟踪控制(Trajectory following control)

许多内容都是修改自《机器人学导论》(Introduction to Robotics: Mechanics and Control)中的第九章: 操作臂的线性控制(Linear control of manipulators) 和第十章: 操作臂的非线性控制(Nonlinear control of manipulators).








背景知识

对于高中生:

受限与文章篇幅和高中生知识储备及作者的姿势水平, 这个文章只是简单地介绍非常经典的控制器, 不会涉及到控制学中的高级理论, 状态空间、拉普拉斯变换这些现代控制理论或技巧.

  • 基本的微分方程的概念, 不需要会求解:
微分方程是一种方程, 不同与高中接触到的方程, 它的解是满足这个方程的函数, 举个例子:
微分方程: y’(t) = y(t) 的解是: y(t)=ce^{t} , y(t) 就是一个关于 t (通常是时间) 的函数, c 是由初始值决定( t 为某个值) 的参数 如:
\left\{ \begin{array}{**lr**} y'(t) = y(t) \\ y(0) = 1 & \end{array} \right. 的解是 y(t)=e^{t}
文章中为了简便会不写 t , 函数名 y 也可以换用不同字母, 求导将在字母顶上加点 如: ax''+bx = 0a\theta''+b\theta = 0a\theta(t)''+b\theta(t) = 0a\ddot \theta+b\theta = 0
在数学上面的意义都是一样的.
微分方程的一大作用就是用来连接动力学运动学, 我们可以根据物体的受力情况来建立微分方程, 而微分方程的解就是那个物体的运动轨迹!
  • 基本力矩及转动惯量的概念(在某些例子会用到)

对于大学生(非必须):


控制目标与误差空间

控制目标
我们的控制目标是什么???对于位置环, 我们想让控制对象的位置快速而又准确地到达期望位置, 对于速度环, 我们想让控制对象的速度快速而又平缓地到达期望速度...换言之, 我们想让控制对象(位置或速度)的实际值快速而又平缓地到达期望值, 换言之我们想让期望值与实际值的差值即误差, 快速又平缓地到达0.

定义: err =x_d - x ,其中 err 是误差, x_d 是控制对象的期望值, x 是实际值. 我们的目标就是无论 err 的初始值是多少, 它都能快速而又平缓地到达0.

误差随着时间的变化需要大概长这样(蓝红线分别是初始误差为1与-10)

误差空间

仔细想想, 现实中是否存在某个系统, 它的某个量会满足我们的期望的那样: 无论初始值是多少, 多会快速地到达0而不发生震荡?

考虑这样一个物块: 它系着一根线性弹簧(受到的力与伸长量或压缩量成正比), 同时与地面有阻尼(收到的力与速度成正比).

弹簧阻尼模型

结合生活常识, 我们可以知道, 当质量 m , 弹性系数 k , 阻尼系数 b 满足一定关系时, 无论物块的初始位置在哪里, 它都会快速而平缓地到达平衡点.

物块的运动轨迹大概长这样(假设平衡状态时 x=0, 红蓝线分别为初始位置为5和-3,初始速度为0的轨迹, )

对物块进行受力分析,根据牛顿第二定律:

ma + bv +kx = 0 \Leftrightarrow m\ddot x +b \dot x + kx = 0 (不考虑正负的问题)

那么m , k , b 这三个参数具体是如何影响误差的在误差空间中轨迹的? 我们只需要解m\ddot x +b \dot x + kx = 0 这个微分方程, 就可以得到误差的轨迹函数, 一共有三种类型的解, 下面我们不考虑怎么解, 只讨论解的形式是什么样的, 如果有兴趣的话可以看上文提到的strang爷爷的公开课.

微分方程的特征方程为: ms^2 +bs +k = 0 ,

特征方程的根为 :s_1 = -\frac{b}{2m}+\frac{\sqrt{b^2-4mk}}{2m}s_2 = -\frac{b}{2m}-\frac{\sqrt{b^2-4mk}}{2m}

  • b^2>4mk 时, 特征方程有两个不等的实数根, 系统主要受摩擦力影响, 会缓慢回到平衡点而不发生震荡, 微分方程的解是: x(t) = c_1 e^{s_1t}+c_2 e^{s_2t} , 系数通过两个附加条件可以算出( 通常是初始位置和初始速度), 图片及Matlab程序(可以更改各个参数及初始位置试试):

当m=1, b=5, k=6, 初始位置为-1时, 初速度为0时 物块被释放的轨迹

%set parameter
m = 1;
b = 5;
k = 6;

%set the initial pos
x0 = -1;

%calculate the s1 s2
s1 = -b/2*m + sqrt(b^2 - 4*m*k)/2*m;
s2 = -b/2*m - sqrt(b^2 - 4*m*k)/2*m;

%set the po and calculate the c1 c2 from inital pos 
c1 = x0*s2/(s2-s1);
c2 = x0*s1/(s1-s2);

t = 0:0.1:3;
x = c1*exp(s1*t)+c2*exp(s2*t);

plot(t,x);
xlabel('t','FontSize',16);
ylabel('x(t)','FontSize',16);
  • b^2<4mk 时, 特征方程有两个不等的复根, 系统主受到弹性力的影响, 会出现震荡, 微分方程的解也是是: x(t) = c_1 e^{s_1t}+c_2 e^{s_2t} , 但是因为包含虚数, 比较复杂, 经过一系列(欧拉公式)的变换后, 可以得到 x(t) = re^{\lambda t}cos(\mu t-\delta) , 其中 r = \sqrt{c_1^2+c_2^2}, \delta=Atan2(c_2,c_1) , 由于情况比较复杂, 而且不是我们要讨论的重点, 所以省略了很多东西, 轨迹图像和Matlab代码(只算了一下m=1, b=1, k=1的情况):

m=1, b=1, k=1初始位置为-0.6时物块被释放的轨迹

t = 0:0.1:20;
x = 2*sqrt(3)/3*exp(-t/2).*cos(sqrt(3)/2*t - 2*pi/3);
plot (t,x);
xlabel('t','FontSize',16);
ylabel('x(t)','FontSize',16);
  • b^2=4mk 时, 特征方程有两个相等的实数根, 将以最短的时间回到平衡位置,这时系统处于临界阻尼状态, 微分方程的解是: x(t) = (c_1+c_2t) e^{\frac{-b}{2m}t} , 图像和Matlab代码(可以调整参数试试):

当m=1, b=1, k=1, 初始位置为-0.6, 初速度为0被释放的轨迹

%set the fixed parameter
m = 1;
b = 4;
k = b^2/(4*m);

%set the intial pos and calculate the c1 c2 from inital pos 
x0 = -0.6;
c1 = x0;
c2 = x0;

t = 0:0.1:5;
x = (c1+c2*t).*exp(-b*t/2*m);

plot(t,x);
xlabel('t','FontSize',16);
ylabel('x','FontSize',16);

第三种情况( b^2=4mk ) 通常为期望情况, 系统将在最短时间内从非零的初始位置迅速回到平衡位置而不发生任何震荡.

重点来了!!!

敲黑板!!!

敲黑板!!!

敲黑板!!!

如果我们把物块的位置 x 换成误差 err , 现在我们得到了:

 m\ddot {err} +b \dot {err} + kerr =0

它在数学上意义等同于那个上文所说的物块的微分方程, 类比一下, 它在误差空间里面运动, 选取合适的 m , k , b , 误差 ( err ) 就会和木块 ( x ) 的位置一样, 快速而平稳地到达稳定状态, 即0.我们的控制目标就变成了:

“设计一个控制器, 使整个系统在任何时刻满足微分方程 m\ddot {err} +b \dot {err} + kerr =0, 而且 b^2=4mk, 这样无论初始误差等于多少, 它都会以最快的速度到达0, 而不发生震荡.

物体在误差空间运动

基于模型的线性控制

明确了控制目标之后, 我们来看几个例子, 然后与我们平时使用的PD控制器(先不讨论PID控制器)什么联系, 从这里开始, 误差函 err(t) 简写为 e(t) , 上文不这么写是因为会和微分方程的解中的自然对数的底数 e\approx2.7182 混淆.

最简单的质点

考虑一个物块, 把它当作一个质点, 除了我们的控制输出不受到任何力(包括重力, 摩擦力等)

根据牛顿第二定律建立微分方程: m\ddot x = F , 其中 F 为我们控制的输出, 这时我们需要设计一个控制器, 想一想, 当 F=? 时, 整个系统会满足  m\ddot {e} +b \dot {e} + ke =0 这个微分方程?

答案是: F = m\ddot x_d + b(\dot x_d-\dot x) + k(x_d - x) (如果理解不了, 可以代回到方程里面算一下), 其中  \ddot x_d , \dot x_d , x_d 分别为期望加速度, 期望速度, 期望位置, 在非轨迹跟踪控制时, 都取 0 ; \dot x,x 分别为实际速度, 实际位置; 这时候式子变成了: F = b\dot {e} + ke ,细心的同学发现, 这个式子和 F = k_p{e}+k_d\dot {e} 的意义是一样的啊! 不就是我们常用的最简单的PD控制器吗? 我们根据经验或者直接计算来调整 k_p,k_v (即是 m,b,k ,他们的意义是一样)的值, 使得 b^2=4mk , 这时候, 物块就会以最快的速度到达期望位置 x_d 而且不发生震荡.

1D四轴飞行器

考虑一个只在Z轴飞行的四轴飞行器飞行器, 只受到重力和控制器的输出推力, 而我们要控制它的高度

图源自宾大的公开课Robotics: Aerial Robotics(这个也很好鸭, 大一大二的同学可以一看)

根据牛顿第二定律建立微分方程: m\ddot h + mg = F , 我们需要一个控制器 F=? 使得整个系统会满足  m\ddot {e} +b \dot {e} + ke =0 这个微分方程.

答案是: F = m\ddot h_d + b(\dot h_d-\dot h) + k(h_d - h) +mg\Leftrightarrow F= k_pe+k_v\dot e+mg , 注意到这个式子和上一个模型的控制器 F = m\ddot x_d + b(\dot x_d-\dot x) + k(x_d - x) 的区别其实只是加了一个项: mg ,在夏令营的时候不少队伍的升降机构的模型和这个模型是相似的, 使用 F = k_p{e}+k_d\dot {e} 的控制效果会比较差, 不过由于积木块和升降机构的质量大小没有很大, 所以还是可以将就的.

二阶线性系统(弹簧阻尼系统)

再考虑一下之前提到的弹簧阻尼系统, 根据牛顿第二定律建立微分方程: m\ddot x +b \dot x + kx = F 其中 F 是控制器的输出.

为了控制它的位置, 我们需要设计一个控制器 F=? 使得整个系统满足  m\ddot {e} +b \dot {e} + ke =0 .

答案是: F = m\ddot x_d + b\dot x_d + kx_d \Leftrightarrow F = k_p{e} .

为了更方便地让系统满足 b^2=4mk 加上了一个 b' (也就是误差空间的阻尼系数)

答案依旧是: F = m\ddot x_d + b'(\dot x_d-\dot x) + k(x_d - x)\Leftrightarrow F = k_p{e}+k_d\dot {e}

可见, 对于较简单的二阶线性系统来说, 直接使用 F = k_p{e}+k_d\dot {e} 作为控制器, 后无脑调参就能得到不错的控制效果, 但是对于复杂的非线性系统来说, 这种控制器的效果将会很差.

基于模型的非线性控制

对于非线性系统, 需要把它线性化, 不过也有不同的线性化方式, 这篇文章将先介绍局部线性化的方法, 下一篇讲介绍使用控制规律分解将整个系统分解为伺服部分(servo porion)和模型部分(model-based portion), 控制规律分解较为常用且效果较好.

局部线性化

考虑一个平面上的四轴飞行器, u_1 是推力, u_2 是旋转的扭矩.

平面内的四轴飞行器, 图源自公开课Robotics: Aerial Robotics的作业文档

根据动力学我们可以建立三个有关的微分方程, 分别是(好想用的方式表达啊 逃2333~):

\ddot y = -u_1\frac{1}{m}sin(\phi)

\ddot z = -g + u_1\frac{1}{m} cos(\phi)

\ddot \phi = u_2\frac{1}{I}

它们描述了飞行器的三个自由度与控制器输出( u_1, u_2 )的关系, 可以看到除了第三个方程外, 其他两个方程都是非线性的, 它们没有相互耦合, 可以分开讨论.

先看倾角, 当 u_2 = I\ddot \phi_p +b(\dot \phi_p-\phi)+k(\phi_d-\phi) \Leftrightarrow u_2 = k_p e + k_v\dot e 时, 系统满足 I\ddot \phi + b\dot \phi+k\phi = 0 , 令 b^2 = 4bI , 可以算出最佳参数使得倾角最快到达期望值.

现在我们来讨论两个非线性的微分方程, 我们可以用局部线性化来导出线性模型, 在工作点用他的线性近似来代表非线性方程, 对于四轴飞行器, 大部分情况下 \phi 都在0附近(悬浮时), 所以在 \phi =0时 sin(\phi)\approx\phi , cos(\phi)\approx1 , 因此两个微分方程中的三角函数可以被线性化, 两个微分方程变为:

\ddot y = -g\phi , \ddot z=-g + \frac{u_1}{m} , 然后我们就能按照之前的思路, 找到 u_1 = m\ddot z_d + b(\dot z_d-\dot z) + k(z_d - z) +mg\Leftrightarrow F= k_pe+k_v\dot e+mg 另 整个系统满足  m\ddot {e} +b \dot {e} + ke =0 .

参考文献

中英文版的机器人学导论:

Craig, John J. 机器人学导论. China Machine Press, 2005.

Craig, J. J. (2005).Introduction to robotics: mechanics and control(Vol. 3, pp. 48-70). Upper Saddle River, NJ, USA:: Pearson/Prentice Hall.

Coursera Robotics: Aerial Robotics 的部分课程

预告

下篇文章是引入控制规律分离, 和与之相对应的线性化方法, 然后介绍轨迹生成算法, 得以构造一个光滑可导的关于时间的函数, 再介绍轨迹跟踪控制, 可以让控制量和控制量的导数和控制量的二阶导数都跟着轨迹生成器提供的值, 举个例子: 轨迹生成函数生成电机在每个时刻的位置, 速度, 加速度, 之后轨迹跟踪控制器可以根据生成器给的三个值确定输出量, 从而使电机沿着某个轨迹运动.

晒一2018年robomaster高中生夏令营我们组的全自动小车的底盘:




自动小车底盘https://www.zhihu.com/video/1018597116473614336

编辑于 2019-06-28

文章被以下专栏收录