JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

从路径到平滑、带时间的运动

一串路点还不是运动——把它变成轨迹,意味着加入时间、进行平滑,并尊重机器人实际能够运动的方式。

一条路线还不是一段运动

想象你刚向规划器要了一条穿过杂乱房间的路线,它递回给你一串整齐的路点:先到这里,再到这里,然后到那里,最后到门口。这串列表就是一条路径——一条纯几何的路线,是穿过空间的曲线,没有附带任何时钟。它告诉机器人去*哪里*,却对*何时*只字未提。路径与真实运动之间的区别正是本篇的核心,这个术语叫做路径与轨迹之分

轨迹则是给同一条路线装上了速度和时钟:此刻在这里、以这个速度运动,零点一秒后到那里。路径回答的是“经过哪些点?”;轨迹回答的是“在哪个瞬间到哪个点、有多快?”只有轨迹才能交给电机,因为电机需要知道*每一个时间刻度*的目标,而不只是一串目的地。

时间为什么如此重要?设想这样开车:以全速从一个路点瞬间跳到下一个路点,机器人会猛地颠簸、急刹停下,把货物甩翻。解法是平滑地滑过这些路点——平稳加速、保持舒适的巡航速度,再缓缓停下。给路径加上这个时钟、并把速度抹平的这一步叫做时间参数化,正是它把一条光秃秃的路径变成真实机器能够跟随的东西。

把路径弯成一条好轨迹

规划器的原始输出往往很毛糙——充满尖锐的拐角和来回的曲折,因为规划器只在乎避开障碍,并不在乎平顺。轨迹优化就是把这条粗糙路线弯成一条平滑、低代价曲线的技艺。你把“好”的含义写成一个代价函数——惩罚急促的变化、惩罚贴近墙壁、惩罚浪费时间——然后让优化器一点点微调曲线,直到代价尽可能地低。

关键在于,优化器并非可以为所欲为。它要在硬性限制下工作:最高速度、最大加速度,往往还有对加加速度的上限(加速度的变化率——就是你感到的那种突然的顿挫)。这些限制来自电机和机械结构,一条好轨迹会尊重其中的每一条,同时仍能到达目的地。可以把它想成新手手忙脚乱地猛踩踏板,与老司机在车流中行云流水之间的差别。

这个思路还有一个更古老、却非常直观的“近亲”值得认识:人工势场法。把目标想象成一块磁铁,把机器人往自己这边拉;把每个障碍想象成一座小山,把机器人往外推。机器人只需沿着合力一路“下坡”,滑向目标,同时被墙壁排斥开。它便宜又优雅,不过有时会卡在一个其实并非目标的山谷里——所谓的局部极小值——这也是为什么常常要在它之上再叠加优化和采样方法。

为什么汽车不能横着滑

许多聪明的路径正是在这里悄无声息地“夭折”。并不是每个机器人都能朝它所指向的任意方向移动。这个区别就是完整运动与非完整运动之分。完整型机器人无论自己朝向何方,都能即刻向任意方向移动——想想装有特殊轮子的全向驱动平台,它能直接横向挪动,根本无需先转身。非完整型机器人则做不到。

汽车是典型的非完整例子,而你早已对它了如指掌。汽车没法直直地横向滑进一个平行车位——它必须前后挪动、摆动车头,因为前轮只能转向,不能像螃蟹那样横行。这种转向几何有个名字,叫阿克曼转向,它禁止侧向滑移。一个更简单的、采用差速驱动的两轮机器人同样是非完整的:它能原地旋转,却无法不先转身就横向平移。

这一约束重新塑造了哪些路径在物理上是可行的。一个无视它的规划器,可能会兴高采烈地画出一个直角急转弯或一次横向轻挪——几何上成立,对汽车而言却物理上不可能。而一个考虑约束的规划器,会给出车辆真正能描出的曲线:带有最小转弯半径的平缓弧线,以及需要倒车时的换挡。路径不再是一张随意的草图,而成了车轮能够老老实实执行的东西。

当一条聪明的路径仍然开不出来

把这些拼在一起,一个发人深省的事实浮现出来:一条路径可以在几何上完美无缺——最短、最通畅、最优雅——却依然开不出来。也许它要求一次汽车做不到的横向滑动;也许它的拐角对转弯半径来说太尖;也许它需要电机给不出的加速度,或者需要一次急到没有任何平滑轨迹能够满足的速度变化。地图说行,机器却说不行。

这正是为什么真实系统会把工作拆分开来:一个负责找出粗略全局路线的规划器,和一个把它转化为可行、带时间运动的局部层——这种拆分被称为全局规划器与局部规划器之分。全局规划器在地图上勾勒出长程路线;而更贴近硬件的局部规划器,则把每一小段重新塑造成机器人真正能执行的轨迹,时刻尊重它的运动约束和电机极限。

于是本篇的旅程,正是一次出行的旅程:规划器递给你一条路径,你给它裹上时钟、抹成一条轨迹,再把这条轨迹弯到尊重速度与加速度限制,最后反复核对它是否服从机器人被允许的运动方式。只有当这一切都成立,那串点才终于变成运动——成为车轮能够稳稳当当执行、毫不踉跄的东西。