|
楼主 |
发表于 2013-4-25 20:23:41
|
显示全部楼层
第八章 进一步理解电机
你可以使用一些额外的电机指令,来更精确地控制电机。在本章中,我们将讨论他们: ResetTachoCount,Coast(Float),OnFwdReg,OnRevReg,OnFwdSync,OnRevSync,RotateMotor,RotateMotorEx和基本的PID概念。
平稳停止
当你使用Off()命令时,伺服电机会立即停止,抱住传动轴并保持位置。使用刹车停止外,也可以让电机以平稳的方式停止。对于这种方式我们一般使用Float()或Coast()命令,它们只是简单地切断电机的供电。下面是一个例子。首先,机器人使用刹车停止;然后不采用刹车停止。请注意其中的差别。其实,对这个特殊机器人来说其差异是非常小的。但是,对其他的机器人来说会有很大的差异。
图8-1 刹车停止及滑行停止
高级命令
命令OnFwd()和OnRev()是移动电机最简单的例程。
NXT伺服电机有一个内置的编码器,可以让你精确控制传动轴的位置和速度。
NXT硬件通过使用编码器作为反馈执行PID(比例积分微分)闭环控制器来控制电机的位置和速度。
如果你想让机器人笔直前进,你可以使用同步功能,它能使选定的一对电机同时运动,当其中之一速度变缓甚至受阻时,另一方会等待对方;以同样的方式,你可以设置一对电机以一定的转向比例同步运行,来完成左转、右转或原地打转,但始终保持同步。有很多命令可以充分发挥伺服电机的功能!
OnFwdReg('ports','speed','regmode’)运用调节模式OUT_REGMODE_IDLE,OUT_REGMODE_SPEED或OUT_REGMODE_SYNC以指定“速度”的功率驱动指定“端口”的电机前进。如果选择IDLE模式,将不采用PID调节模块;如果选择SPEED模式,即使电机的负载有变化,NXT调节单个电机以得到一个恒定的速度;最后,如果选择SYNC模式,就如上述介绍的指定端口中的一对电机将同步运行。
OnRevReg()运行方式同上述命令,只是改变了一下方向。
图8-2 OnFwdReg举例
该程序显示了当你尝试停止你手中机器人的轮子时,各种不同调节模式的不同点:首先使用IDLE模式,停止一个轮子,你不会注意到任何变化;然后使用SPEED模式,尝试降低一个轮子的速度,你将会看到NXT会提高电机功率,以克服你的阻力来努力保持恒定速度,最后使用SYNC模式,停止一个轮子会导致另外一个轮子也停下来,来等待被阻止的轮子运转。
OnFwdSync('ports','speed','turnpct’)与OnFwdReg()命令在同步模式下是一样的,但现在你可以指定转向百分比“turnpct”(从-100到100)。
OnRevSync()同上述命令一样,只不过改变了电机的方向。下面的程序显示了这些命令:尝试改变转向数字,来看看它的行为:
.
图8-3 OnFwdSync和OnRevSync举例
最后,电机也可以设置为转动有限的度数(记住,一整圈为360°).
对下面的两种命令,你可以通过给速度或者角度数一个符号让电机改变方向:因此,如果速度和角度具有相同的符号,电机向前运行,如果他们具有相反的符号,电机向后运行。
RotateMotor('ports','speed','degree')对指定端口(port)的电机以指定速度(Speed)及功率值(在0-100范围内)旋转电机轴转过一定的角度数(degree)。
图8-4 RotateMotor举例
RotateMotorEx('port','speed’,'degrees','turnpct','sync','stop')是上述命令的一个扩展,它可以让你按指定的转向百分比“turnpct”(从-100到100)和一个布尔标志“sync”(可以设置为true或false)来同步两个电机(例如OUT_AC)。它也可以通过布尔标志”stop”让你指定在电机完成转动的角度后是否采取刹车停止。
图8-5 RotateMotorEx举例
PID控制
NXT硬件通过数字PID(比例积分微分)控制器来精确调节伺服电机的位置和速度。此类控制器是一个最简单但最有效的闭环反馈控制,称为自动化,经常被使用。
简单说来,它的工作原理如下(我将讨论离散时间控制器的位置调整):
你的程序给了控制器一个要达到的设置值R(t),它用一个命令U(t)来驱动电机,使用其内置的编码器测量其位置Y(t)并计算误差E(t)= R(t) - Y(t):这就是为什么它被称为“闭环控制”,因为输出位置Y(t)返回给控制器作为输入以计算误差。控制器再将误差E(t)转换为命令U(t),因此:
U(t) = P(t) + I(t) + D(t), 其中
P(t) = KP•E(t),
I(t) = KI•(I(t–1) + E(t))
及D(t) = KD•(E(t) – E(t–1)).
对于一个新手来说这可能看起来相当复杂,但我会尽我所能来解释这个机制。
该命令是三个部分之和,比例部分P(t),积分部分I(t)和微分部分D(t)。
P(t)能使控制器快速响应,但它并不保证在平衡状态没有错误。
I(t)给控制器“记忆”,在这个意义上,它跟踪累积误差,并补偿它们,并确保在平衡状态下零误差。
D(t)给控制器“未来预测”(如同数学上的微分),提高反应时间。
相比于对这些参数用整本学术专著来进行介绍,我知道上述解释仍然很混乱!但我们仍然可以用我们的NXT智能积木块在线尝试一下!使用内存解决问题的简单程序如下所示。
图8-6 一个简单的PID程序
命令RotateMotorPID(port, speed, angle, Pgain, Igain, Dgain)允许设置默认值以外的PID增益来移动电机。尝试设置以下数值:
(50, 0, 0):电机不能准确转动180°,因为存在不能补偿的错误。
(0, X, X):没有比例部分,这是一个非常大的错误
(40, 40, 0):存在过冲现象,也就是说电机轴转动超出设定值后,然后再返回。
(40, 40, 90):精度良好,但增加了时间(到达设定点的时间)。
(40, 40, 200):电机轴来回振荡,因为微分增益太高。
请尝试其他的值,来观察这些增益值如何影响电机的性能。
小结
在本章中,你学到了可用于电机的高级命令:Float(),Coast()平稳的停止电机;OnXxxReg()和OnXxxSync(),允许反馈控制电机的速度和同步;RotateMotor()和RotateMotorEx()用精确度数来转动电机轴。你也学到了关于PID控制一些内容,但并没有一个详尽的解释,也许我已经在你心里引起了一些好奇心:上网搜索有关内容! |
|