嘿!您似乎在 United States,您想使用我们的 English 网站吗?
Switch to English site
Skip to main content

给您的机器人装上真正的火星探测器上使用的移动控制:第 1 部分

机器人,尤其是轮式机器人,可分为两种:一种完全通过感应并躲避障碍物行驶,另一种通过内部电子地图沿着既定路线行驶。多数“业余”移动机器人基本仅凭借障碍物感应进行移动。这是一种有些过于简单化的应用,如此设计的原因是认为四处移动、躲避事物比沿着预定路线行驶有趣得多(同时也简单得多)!

移动控制

一个“专业”机器人,例如火星探测器 Curiosity,则需要精准导航,同时还要躲避大型石块和小型凹坑。

Mars_rover1_6cf614bb787b064157b411df30c3f60a33383cde.jpg

如需了解移动控制硬件/软件可能达到的复杂程度,请阅读这篇介绍 Curiosity 的前款探测器所使用的移动系统的论文《火星探险漫游者的机遇与精神》。论文第 3 页中的图 2 以方框的形式描述了基本导航系统:本文以及下一篇文章将介绍方框重点标注的 MOT 中的内容,以及基于 PID 算法的导航功能用于地球上行驶的机器人的方法以及可用的原因。

PID 控制

PID 控制的基本原理简单易懂,并可用于任何内含机电执行器(例如电机),并且需要以设定速度行驶或移动至准确位置的系统。所需的额外硬件包括一个可探测实际速度或执行器位置的传感器,以及一个可运行控制算法的处理器单元。处理器将对比理想机械输出(设定值)和感测的实际值,然后生成修正控制信号来消除任何差异(误差)。尽管如此,这种算法并不仅限于移动系统:它还完全适用于工业化学过程中的精确温度控制,或确保水槽中的液体保持在特定的液位。这里我只涉及电机的控制。

我的小型机器人为何需要移动控制呢?

业余机器人经常采用“轻量小车”的式样,底盘两侧各有一只独立驱动的轮子,并且在一端或两端装有脚轮。考虑这种最基本的要求:这种机器人需要沿着绝对直线行驶一段距离。听起来相当容易,不是吗?然而为实现这一点,必须满足两点要求:

  1. 两只轮子转动的速度必须完全相等,并且
  2. 两只轮子上必须都装有传感器,用于提供已行驶距离数据

满足要求 (1) 并不容易,因为两台看似相同的电机在输入相等的情况下,转动速度将稍有不同。如果是这样,您的机器人将沿渐变弧线行驶,而非直线。这就是为什么我们需要闭环控制的车轮转动传感器提供反馈的原因。对于我们的小车来说,每个轮子都需要独立的闭环。幸运的是,装在轮子上的传感器还能提供相关信息,支持各车轮行驶距离的计算,从而满足要求 (2)。

PID 控制理论

PID 表示比例、积分、微分,分别代表用于闭环控制系统的误差反馈信号的三种计算方法,从而得出消除误差所需的系数。让我们来看看该算法的微分/积分方程:

PID_blog_2_b76b5cf1bf8d4f3fe24b3cf187f54756dadf95e0.png

其中第一项为比例反馈分量,第二项为积分分量,第三项是微分分量。e(t) 是理想输出(设定值)与实际输出之间偏差。c(t) 是校正后的执行器控制输出。

使用全部三项的闭环控制系统如图所示 ( 1):

PID_blog_11_32080f6d05e05ec5ab9d7d53fe229585b8fe0934.png

就我的移动机器人而言,执行器是连续转动伺服电机,而传感器则是反射式红外线感应装置,利用车轮的割缝进行工作。这类传感器通常称为转速计,能通过变量脉冲序列反馈出实际的车轮转速数据:转速越高,脉冲频率越快。控制程序代码将对比实际转速和理想值(设定值),两者之差即为 PID 算法中的误差输入 e(t)。结果是控制输出 c(t) 推动电机使误差缩小至零(最终)。三个常数 KP、KI 和 KD 通常先给定估值(猜测值),然后在模拟程序或实际系统硬件上进行优化,此过程称为“调校”。

PID 控制实际操作

好了,我相信大家并不期待进行实时运行的积分和微分编程。幸运的是,大家无需惊慌,因为以上公式适用于连续时间,而“数字”应用意味着我们处理的是离散时间采样数据。更棒的是,根据所需的控制“精度”,可以省去 I 和 D 项中的一个或两个!为了确定特定任务所需的完整 PID 算法控制项数量,必须先了解各控制项的作用。

比例(或增益)控制项

P 项是必须使用的,也是最容易理解和实施的控制项:它的作用是使控制信号与测定误差形成比例关系,比例大小由 KP 决定。因此 KP < 1。那么为何不使 KP= 1,从而立即消除所有误差呢?原因是电子装置可将误差信息转换为校正后的控制信息,且速度远超机械系统的响应速度。结果可能造成持续振荡,电机先加速再减速。这也是为什么每个周期间隔内都要反馈一定比例的误差,使速度缓慢达到设定值的原因。另一方面,如果反馈值太小,那么从启动到达到一定速度需要花费很长的时间。因此对于离散时间系统:

CP(n) = KP x E(n)

请注意,控制信号与误差将同时减小至零,在一定程度上会弄巧成拙。有两种方法可以解决这个问题。第一种是通过“开环”运行硬件,找出理想设定速度所需的控制输入量,然后在以上方程式中以常数形式加入此“参考”值。第二种选择是加入以下描述的积分项,该控制项将自动达到目标值。

积分(或复位)控制项

误差信号的积分在时间间隔 t 内的累积误差上增加一个数值。在没有上述控制参考输入的情况下,其数值应从启动后开始增大,直到稳定在设定值。通常,它的作用是补偿传感器测量中的固定误差(稳态误差)。如果 KI 太大,会造成系统失稳。在离散时间系统中,该项算法简化为简单加法,或者更确切的说,简化为累积求和:

A(n) = A(n-1) + E(n)     这里 A(n) = 累积误差

CI(n) = KI x A(n)

微分(或变化率)控制项

该项非必要组成,可完全根据需要选择。它可在 KP 和/或 KI 数值较大时通过减弱瞬态振荡或“振铃”现象来改善系统性能。该项可测出输出变化率,并在输出接近设定值时减小控制信号。当 KD 值适当时,可防止超调和过度纠正。因此,当突然出现较大的瞬态变化时,我们将获得较大的初始控制响应,然后随着误差接近于零而逐渐减小。D 控制项可在一定情况下改善系统响应,例如在设定值出现急剧改变时。但是可能会因为反馈信息对噪声较为灵敏而出现问题。实际操作中,看起来很复杂的微分项可变为简单的减法,即从原来的误差中减去当前误差:

CD(n) = KD x (E(n-1) – E(n))

换句话说,该控制项在误差增大时为正数,增强 P 和 I 控制项的作用。而当测出的输出值超过设定值时,D 项将变为负数,减小总控制输入,直到误差再次减小为止。

PI D 控制项的不同组合

PID 控制算法并不一定要完整使用。设计师必须根据待控制系统的特点确定三个控制项的使用组合。这里必须考虑两点:

  1. 在初始启动和设定值变化时(例如下达操纵指令时),系统必须以多快的速度响应误差的骤然增大。这是“瞬时”响应。
  2. 系统输出相对设定值的波动程度。这是“稳态”响应。

一些常用的 P、I、D 控制项组合的性能曲线如 2 所示。每种组合中的蓝色曲线即为实际输出状态(速度、位置、温度等),与理想设定值(红色虚线)形成对比。让我们假设曲线代表的是电机随时间 t 的转速变化,启动时间 t = 0。

PID_blog_31_d1022596fd8b6254fefa6601287570e552980c51.png

(a) 比例控制和固定控制参数的组合。参数为估值或通过实验得出的数值。采用较大的 KP 系数,可确保上升速度快于其它情况,但缺点是出现严重超调和“振铃”现象。如果参数估值存在误差,也会造成稳态速度低于要求的设定值。

(b) 比例和积分控制的组合。保持 KP 值不变,但将固定参数替换为积分控制项。这样可以帮助我们最终达到设定值,但起初会出现更为严重的超调。

(c) 比例、积分和微分控制的组合。理论上说,只要 KD 值适当,就会出现“神奇”的现象:振铃几乎完全消除,并可在极短的时间内达到稳态。

回环调校

计算方法很简单,而且可在低成本微控制器(例如 Arduino)上运行移动机器人的基础控制程序。这里要注意的是 K 系数数值的选择。 当进行“手动”调校时,调试人员的经验起到很大作用。有时可对系统进行“开环”运行,并切断反馈,以此了解系统的特点。此外还可以运行模拟,结合经验和试错,获得较满意的数值。市面上也可以买到精密的调校程序。实际操作中,像这样的小型电机控制,只需一点预测,再加上一些小改动,就能得到满意的结果。

后期预告

为验证本文内容,我在我的忠实小伙伴 Parallax BoE-Bot 机器人上安装了转速计以及 Arduino 格式的 dsPIC33 微芯处理器(可提供处理能力)。dsPIC 等现代微控制单元内含特殊硬件,例如“输出比较”、“输入捕捉”和“正交编码”单元,适用于电机控制和感应。我将进一步探讨使用 Forth 语言、FORTHdsPIC 和“裸机式”汇编代码驱动程序编写的 PID 算法在电机控制和转速计传感器中的应用情况。

如果您暂时想不出做什么,可以关注我在 Twitter 上发布的文章。我会贴出关于新的电子产品和相关技术的文章链接,也会转发我读到的关于机器人、空间探索以及其它话题的文章

Engineer, PhD, lecturer, freelance technical writer, blogger & tweeter interested in robots, AI, planetary explorers and all things electronic. STEM ambassador. Designed, built and programmed my first microcomputer in 1976. Still learning, still building, still coding today.