​本文转载自微信公众号ROBOTICS 上一篇文章CC简单讲了“什么是控制“的问题,不知道有没有让你稍微窥见到控制之美呢?即使你没有完整学过控制理论,只要初步了解它的概念(而我认为控制理论的概念是任何人都很容易懂的,毕竟“大道若简”),加上良好的物理直觉,理解机械臂的控制是没有什么问题的。 不过,当我们讨论机械臂的控制,我们讨论的控制目标、对象和方法很可能大相径庭——曾经CC觉得这些非常混乱。我写这篇文章,也是为了大家在深入了解每一种控制方法之前先对大的框架有一个比较清晰的认识。

控制目标和控制对象

 


  机械臂控制的复杂度主要在于可直接控制对象和最终控制目标的多样性。对机械臂而言,大部分时候我们最终关心的都是末端执行器:往汽车外壳喷涂油漆,我们需要控制末端的运动轨迹(Motion Trajectory),即每一时刻的位置/姿态、速度、加速度(Position / Orientation, Velocity, Acceleration);给金属工件做抛光,我们需要控制末端在特定方向的力/力矩(Force / Torque);让操作人员拖着末端做拖拽示教,我们可以采取控制末端阻抗或导纳(Impedance / Admittance)的方式。末端的运动轨迹、力/力矩、阻抗/导纳,这三者是我们控制机械臂的最终目标,目标的选择由不同的应用场景决定。(对这三者,我们之后简称位置或者运动、力、和阻抗)。 在机械臂上,我们无法直接操控末端,而只能通过控制机械臂上的每一个关节去改变末端的运动和施力情况。在每一个关节上,我们同样有运动轨迹、扭矩和阻抗这三个控制对象的选项。能够分别对每一个关节的运动轨迹、扭矩或者阻抗进行控制,是控制末端执行器的基本要求。 然而串联机械臂的每一个关节并不是完全独立的,通过前面对机械臂动力学模型的分析我们知道,每一个关节的运动和输出的力都可能对其它关节的运动和受力产生影响,也就是动力学耦合(Dynamic Coupling)现象。如果对每一个关节单独进行控制,动力学耦合的存在会大大降低每个控制器的控制性能(响应速度、频宽等等)。 如果我们把所有关节的状态(运动或扭矩)看作一体,在“关节空间”(Joint Space)上进行控制,那么我们就有可能把机械臂的动力学模型加入我们的控制回路中,实现“解耦”(decoupling),从而提升机械臂控制器的动态性能。 闭环控制必然需要传感器。在机械臂上,最常见的传感器是关节位置传感器关节扭矩传感器、以及末端的力/力矩传感器。末端的实际位置/姿态只有外部传感器才有可能直接测量,其更新速率通常无法用来做闭环控制;但通过运动学计算,也可以比较准确地从关节位置得到末端位置。阻抗表述的是力与位置的动态关系,只能由力传感器和位置传感器间接测定。 下面这幅图标出了在关节和末端上我们可以控制的目标,加粗字体表明这个量能够用传感器直接测量输出。 干货1

控制的“路径”

 


  根据控制目标和对象的不同,机械臂的控制有许多种不同的方法、形成了许多条从控制对象到控制目标的“路径”。比如说,控制末端的位置(控制目标),我们既可以通过控制关节的位置(控制对象)来实现,也可以通过控制关节的力矩(控制对象)来实现;控制末端的阻抗同样也能通过关节位置或者关节力矩来实现。形形色色的机械臂控制路径使机械臂控制成了一个看起来复杂而庞大的问题——弄清楚每一种路径的对象与目标,可以帮助我们从宏观角度掌握机械臂控制方法。 关节控制是末端控制的基础,在接下来的文章中,我们首先会讲单关节的控制,包括 单关节位置控制 单关节力矩控制 单关节阻抗控制 接着我们会讲如何在关节空间进行关节的控制,从而实现关节空间的动力学解耦: 关节空间位置控制 关节空间扭矩控制 关节空间阻抗控制 单关节控制与在关节空间进行关节控制的区别在于,你是把每一个关节当作一个个独立的个体分别控制,还是把所有关节当作一个整体同时来控制。 在关节控制的基础上,我们可以讨论末端的控制,也即在笛卡尔空间的控制。简单粗暴地做一个排列组合(其中有些太过罕见我就不放进去啦),我们会有 基于关节位置的末端位置控制 基于关节力矩的末端位置控制 基于关节位置的末端力控制 基于关节力矩的末端力控制 基于关节位置的末端阻抗控制 基于关节力矩的末端阻抗控制 这些内容足够让你对机械臂控制有一个系统全面的了解。你可能还听过柔顺控制(compliance control)、力/位置混合控制(hybrid force/position control)、操作空间控制(operational space control)等等概念,这其中有的最终走的还是上面所讲的一种或多种路径、有的则是在前述基础上更进一步,我们在写完基础内容之后会来讨论这些概念。

单关节位置控制

 


  在关节空间对每一个关节进行位置控制,是控制机械臂的一种很常见的思路。在许多DIY机器人项目或者玩具机械臂上,关节会采用舵机:由于减速装置(齿轮)和位置控制回路都已经集成在舵机里了,所以它的输出直接就是关节位置,我们只需发送对应的PWM信号(从我们的角度看,这是一个开环控制)就可以了;有时候也会用步进电机,这时可以通过我们发送的步进序列指令去算出关节位置(这也是一种开环控制)。 干货2 使用普通的舵机,我们通常无法控制它的运动速度;使用步进电机,取决于步进指令的发送速度,在步进电机能够承担的负载下,我们可以控制它以特定速度运行。不过对于工业上的应用,这样的开环控制都是不够用的。工业上用的机械臂通常会采用直流电机,经过减速传动装置控制关节运动。这个时候要控制关节的位置,我们就需要通过调节电机输出的扭矩来实现。回想我们上一篇文章中方块弹簧的例子,类似的,电机就是其中的“拉力发生器”,关节则是那个“方块“,(减速装置其实也具备弹簧+阻尼的性质,但我们这里忽略不计);我们知道,这时候闭环控制必不可少。电机运动的原理是通电导线在磁场中受到力而运动:这个力的大小和电流的大小和该处磁场的大小和方向有关(复习一下安培力)。无论是有刷电机还是无刷电机,电机输出的转矩与输入它的电流是成正比的,它们的比叫电机的torque constant(转矩常数kt): 干货3 因此,通过控制电机的电流,我们就能控制电机输出端的扭矩(这也是一个开环控制,但是是一个比较不会有误差的开环控制)。由于市场上有许多封装好的驱动帮你隐藏了这些细节,可能你很少需要关注到电流控制这个层面。对无刷电机而言,电流控制并不像说起来那么简单——驱动器需要控制每个相的电流按照一定的规律变化才能让电机转起来并且输出与指令一致的扭矩。关于无刷电机的控制我们以后再聊。 电机输出的扭矩经过减速装置放大后使关节产生运动,编码器则反馈关节位置给控制器以生成合适的电机扭矩/电流指令——我们把这个控制回路套到我们前面讲的控制框图里(θ是关节位置): 干货4 注意图中关节位置的反馈是直接从减速机构之后的关节端来的,为了得到更高分辨率的位置反馈,我们也可以选择用减速机构前的位置传感器来做关节位置反馈,此时减速装置对最终关节位置产生的影响则被忽略了。另外,图中把速度控制的部分也省掉了——需要注意的是,我们一直说的“位置控制”,更准确地说应该是“运动控制”,关节的位置、速度、加速度都应在控制范围之内。 弄清楚了这个控制回路以后,控制器可以根据需要选择。我们用一个简单的PD控制器来举例,则有: 干货5 简单地分析一下这个控制回路,把关节的动力学方程写出来(先不考虑重力和库伦摩擦力): 干货6 可以看到,关节的动力学方程由正比于加速度的惯性力和正比于速度的粘滞阻力组成。 结合控制器的输出与系统的动力学方程,我们可以写出这个控制回路的时域方程: 干货7 可以看出这个控制回路即是一个典型的二阶系统,可以用二阶系统相关的控制理论去分析调试。控制回路中控制器的选择、调节和系统分析等等属于控制论的内容,这里就不再详细讲解了。 下面几篇我会按照上述的列表继续写各种不同的机械臂控制器(不一定会按顺序)。机械臂的控制方法非常多也非常杂,我希望尽可能提炼出一个大的框架——如果有错漏还请大家指正。