没有力的几何——以及它的局限
想象一台机械臂被定格在一张照片里。你可以测量每个关节角度,再用正向运动学精确算出夹爪在空间中的位置。运动学是运动的几何学:它只用角度、长度和形状来回答“在哪里”以及“各部件如何对齐”。它从不追问真实的电机能否真的保持那个姿态,也不问你要多用力才能到达那里。
现在让照片动起来。关掉电机,机械臂就会瘫软——在自身重量下向地面下垂。几何并没有任何改变;运动学描述的那些关节角度依然完全成立。改变的是:重力这个力,终于被允许发挥作用了。这一下垂,正是运动学无言以对、而动力学登场的时刻。
动力学研究的是物体为何以及如何运动——力与它所引起的运动之间的关系。对机器人来说,我们通常把每一段连杆建模为刚体,也就是一块不弯曲、不变形的物质,并研究它的刚体动力学:它的质量如何对推力与拉力作出反应。运动学画出了地图;动力学则告诉你穿越其上每一段旅程的代价。
登场角色:质量、力、力矩、动量
动力学的角色不多,先认识一遍,后面整条学习路径就会轻松许多。第一位是质量:一个物体含有多少物质,因而它有多“顽固”地抗拒速度的改变。装满货物的购物车比空车更难推动——也更难停下。这种顽固就是惯性,而质量正是衡量它的那个数字。
接下来是力:一种推或拉,比如重力把机械臂往下拽,或你的手推开一扇门。沿直线施加的力,会改变物体沿那条线运动的快慢。但机器人主要在关节处旋转,而力在旋转世界里的“表亲”就是力矩——一种扭转的努力。在靠近门轴处推门,几乎纹丝不动;在门把手处推,门就轻松转开。同样的力,更大的力矩,因为力矩取决于你离转轴有多远。
力矩是机器人动力学的主角,因为它正是关节电机实际输出的东西。每个电机为驱动其关节而必须提供的扭转努力,就是关节力矩,而几乎每一项动力学计算最终都在回答同一个问题:需要多大的关节力矩?太小,机械臂就会下垂或卡死;电机的上限,就是它的驱动力预算。
最后一位角色是动量:大致就是质量乘以速度——一个运动物体携带了多少“运动量”。这就是为什么又快又重的物体既危险又难以停下。机器人会同时追踪线动量与角动量:移动底座所携带的直线动量,以及挥动机械臂所储存的旋转动量。动量是机器人启动时必须积累、停止时必须卸去的东西——而骤然卸去它,正是快速机器人会猛地一顿的原因。
动力学在哪里大显身手
如果一台机器人无限缓慢地移动、且什么都不搬运,你几乎可以忽略动力学,只规划几何就行。真实的机器人没那么客气。有三种情形迫使你必须建模力,而它们涵盖了机器人难题中的大部分。
- 快速运动。当某个关节快速加速时,一段摆动的连杆会把其他连杆甩来甩去——这种鞭子般的效应由科里奥利项与离心项来刻画。速度越快,这些由速度驱动的力就越大;忽略它们的控制器会冲过头或晃动。
- 沉重负载。拎起一整桶油漆,你整条手臂的发力立刻不一样。机器人必须不断提供力矩,只为对抗重力维持住位置——这项工作叫重力补偿——负载越重,每个电机就有越多的力气花在对抗重量上,而不是用于运动。
- 轻柔接触。把插销插入孔中,或与人握手,意味着机器人接触到了世界,必须调控它压得有多用力。接触点处交换的力就是接触动力学,处理不当就会刮花表面或捏碎鸡蛋。在这里你不能只规划位置——你必须对力进行推理。
还有一个更安静的反派,在和每个电机作对:摩擦。齿轮与轴承内部的摩擦——关节摩擦——会在你发出的力矩到达连杆之前,悄悄吃掉其中一部分。它很小、很杂乱、很难精确建模,但忽略它会让机器人在低速时迟钝又不精确。
本学习路径要搭建的那个方程
上面这一切,都可以收拢进一句简洁的陈述里,而本学习路径之后会把它一块块拆开来讲:机器人运动方程。它是一本记账总账,对每个关节、每一瞬间都说明:你提供的力矩,必须刚好用来让机械臂加速、在高速下把它甩动、以及对抗重力把它撑住。
tau = M(q) * q_ddot + C(q, q_dot) * q_dot + g(q)
| | | |
torque inertia x velocity x gravity
you send acceleration velocity holding
(push the mass) (whip / Coriolis) term第一块 M(q) 是质量(惯性)矩阵:它刻画机械臂在当前姿态下有多重、质量摊得有多开,从而决定给定的加速度要花多少力矩。对单个物体而言,它的基本构件是惯性张量,描述那个物体的质量是如何围绕其各轴分布的。中间那一项汇集了科里奥利与离心效应,而最后一项 g(q),正是我们前面遇到的对抗重力维持位置的努力。
把这个方程从两个方向来读,你就得到了机器人动力学的两大问题。从左往右读——给定力矩,会产生什么运动?——这就是正向动力学,每个物理模拟器的核心。从右往左读——给定我想要的运动,我必须发出什么力矩?——这就是逆向动力学,每个高性能控制器的核心。本学习路径之后会教你如何填入、计算并运用每一项。