
干AGV运动控制这几年要说哪个算法我用的顺手次数最多纯跟踪Pure Pursuit绝对排在第一位。不是因为它多么高深而是它把“路径跟踪”这件事变成了一套非常直观的几何逻辑而且差速轮、舵轮、甚至阿克曼底盘都能统一套用。很多刚接触移动机器人的朋友一上来就盯着MPC、LQR这类现代控制方法结果模型没建明白、参数调不出来最后绕了一圈还是回到纯跟踪。这篇文章就围绕差速轮和舵轮这两种最常见的AGV底盘把纯跟踪算法的原理、推导、落地实现、参数整定讲透。你有ROS基础或者写过单片机控制看完就能直接往自己项目里移植。没有基础也没关系我会把每一个公式的来历和代码对应的物理含义都解释清楚。1. 先分清底盘差速轮与舵轮的运动学差异1.1 差速轮靠两侧轮速差转弯差速轮底盘是AGV里最普遍的结构两个驱动轮对称安装在车体左右两侧前后通常各配一个万向从动轮或滚珠支撑轮。它的运动学模型极其简洁( v (v_R v_L) / 2 )( \omega (v_R - v_L) / L )其中 ( v_R ) 、( v_L ) 是左右轮的线速度( L ) 是左右轮之间的轮距。也就是说想让车转多大弯本质上就是控制左右轮的转速差。如果左右轮速度完全相等车就直线走速度差越大转弯半径越小极端情况下就是原地旋转。这套模型的好处是控制量跟执行器直接对应你算出目标线速度 ( v ) 和目标角速度 ( \omega ) 之后反解出左右轮速度发下去就能动。而且差速轮底盘结构简单、成本低、负载能力合理室内仓储、搬运机器人很多都选它。但差速轮的问题也很明显驱动轮和地面之间靠摩擦力传递动力重载或者地面湿滑的时候轮胎打滑会直接导致里程计解算漂移跟踪误差会累积。另一点是它的负载都压在两个驱动轮上电机选型和减速比设计要留有余量不然启动和刹车瞬间容易过流。1.2 舵轮转向和驱动合体的复合运动单元舵轮模块把驱动电机和转向电机集成在同一个轮组里轮子既能自身旋转驱动又能整体绕垂直轴转动来改变方向。一个完整的舵轮模组包括驱动电机、转向电机、减速器、编码器以及转向角度传感器。按照安装方式舵轮AGV又分单舵轮加从动轮、双舵轮前后布置、四舵轮四轮转向等。单舵轮的成本最低但车体灵活性一般转弯半径受结构限制双舵轮可以做原地转向和斜行运动控制有趣但也有挑战四舵轮重载和全向灵活性最好但控制难度和成本都上去了。舵轮底盘的运动学比差速轮复杂关键在于舵轮相对于车体有一个安装位置转向角变化时车体的瞬时旋转中心就变了。比如舵轮安装在车体前方正中间当舵轮转角为 ( \delta ) 时驱动轮沿着转向方向出力车体会绕后方轴线上某一点做圆弧运动。这个“偏移效应”在做纯跟踪的时候必须考虑。值得说一句的是舵轮不只是AGV在用现在很多智能电动轮椅、移动护理设备也在用类似结构靠一个舵轮加两个从动轮就能实现灵活转向本质运动学模型和单舵轮AGV是一致的所以下面讲的舵轮解算思路换个场景同样能复用。1.3 两种底盘给运动控制出了什么难题差速轮的控制量是 ( (v, \omega) ) 车的朝向就是当前运动方向纯跟踪算法计算出一个期望圆弧曲率之后直接换算成角速度就能执行链路很顺。舵轮的控制量是 ( (v, \delta) ) 车体朝向和运动方向并不总是同一个方向。而且舵轮的转向有个物理极限角转向电机从 ( 0^\circ ) 转到 ( 45^\circ ) 需要几十毫秒如果只按当前时刻的期望转角下发很容易出现“转不过弯”的情况。所以纯跟踪算法能在这种差异下通吃靠的正是它把问题抽象成了“几何上选一个圆让车沿圆弧到达目标点”剩下的底盘差异都在运动学解算那一步消化掉。这个解耦思路是整套方案的核心接下来展开讲。2. 纯跟踪算法的核心思想与几何推导2.1 追着前方一个目标点跑纯跟踪算法名字里的“Pure”指的是它的纯粹机器人每一帧都在全局路径上找一个离自己前方距离为 ( L_d ) 的预瞄点然后计算一条圆弧让车从当前位置沿着圆弧走到那个预瞄点。整个过程不需要复杂的路径平滑、不需要算横向误差积分只需要一个几何关系。这里有一个关键的直觉任何时候给定平面上两个点以及起点处的切线方向车头朝向总存在唯一一个圆弧既能通过起点和终点又能在起点处与给定的切线方向相切。当然这里会有方向上的符号问题但工程上通过角度归一化把角度限定在 ( -\pi ) 到 ( \pi ) 就能处理。理解了这一点纯跟踪就变得非常“朴素”了每一帧都做一个“几何选择题”选中一个圆弧然后控制车按照这个圆弧走。当车不断前进预瞄点不断向前移动车就会像磁铁一样被拽着沿路径走。2.2 一个正弦定理推导出核心公式下面把这套几何关系严格推一遍因为后面代码里核心就这一行必须把每个符号都弄清楚。假设当前机器人位置为 ( P ) 航向角为 ( \theta ) 预瞄点在路径上距离机器人 ( L_d ) 的位置记为 ( G ) 。从前轮或者说车体几何中心具体看你用什么参考点到预瞄点的连线与车体朝向形成的夹角记为 ( \alpha ) 。车的几何尺寸会影响问题吗对这个推导来说不需要。我们在当前点到预瞄点之间拟合成一个圆弧圆弧半径 ( R ) 那么圆弧的弦长就是 ( L_d ) 。以车辆参考点为圆心在车体坐标系里观察这个几何关系会发现预瞄点与车体纵轴的夹角就是 ( \alpha ) 。根据圆上弦切角等于圆心角一半这个几何性质再加上正弦定理可以推出[ \frac{L_d}{\sin(2\alpha)} \frac{R}{\sin(\frac{\pi}{2} - \alpha)} ]化简后得到 ( R \frac{L_d}{2\sin\alpha} ) 于是圆弧曲率[ \kappa \frac{2\sin\alpha}{L_d} ]这个式子就是纯跟踪最核心的公式。曲率 ( \kappa ) 的正负数含义很直观 ( \alpha ) 为正说明预瞄点在左侧需要左转 ( \alpha ) 为负需要右转 ( \alpha 0 ) 说明车头正好对着预瞄点直行即可。然后根据运动学关系期望角速度 ( \omega v \cdot \kappa ) 。如果已知底盘当前行驶速度 ( v ) 就能把目标角速度算出来。差速轮直接把 ( (v, \omega) ) 反解成左右轮速就可以执行。2.3 为什么它比Stanley和MPC更“能打”不少人会问纯跟踪在控制理论里算不算“过时”了我的看法是工具没有过时只有合不合适。Stanley控制器是另一类经典路径跟踪方法它通过车辆前轮到目标路径的横向误差直接计算出一个前轮转角公式大概长这样 ( \delta \phi_e \arctan(k \cdot e / v) ) 。它最大优势是对横向误差的收敛非常快切回路径的能力强适合在结构化道路和野外路径上跑。缺点是对路径连续性要求高如果路径点很稀疏或者存在锯齿Stanley容易抖。MPC模型预测控制能做到多步优化既考虑跟踪误差又考虑执行器约束比如舵轮转角限位可以说上限最高。但MPC需要精确的底盘模型而且每一步要解一个优化问题对算力有要求在低成本AGV控制器比如单片机上跑就不太现实。纯跟踪的优势就在“低速场景下的皮实”。AGV室内运行速度普遍在0.3到1.5米每秒之间这个速度区间里纯跟踪的预测误差完全在可接受范围内。加上它计算量几乎为零代码实现不超过二十行调试时只需要调一个前视距离 ( L_d ) 这在现场交付的时候价值太大——生产环境的工程师要的是“稳、快、好调”不是算法论文里的理论最优。3. 差速轮底盘上的纯跟踪实现细节3.1 路径预处理A*算出来的路径不能直接用先泼一盆冷水很多新手把A*搜出来的栅格路径直接扔给纯跟踪结果控制出来车一路蛇形走位然后开始怀疑算法有问题。实际上问题几乎都出在路径本身。A*输出的是栅格中心点序列路径里会有大量45度折线和锯齿。纯跟踪是基于圆弧拟合的它在每一个控制周期只关心当前预瞄点如果路径上存在连续的尖锐转折预瞄点会在拐角处迅速跳变导致 ( \alpha ) 角突变控制量自然跟着震荡。所以在喂给纯跟踪之前路径至少要经过两步处理降采样把栅格地图输出密集点抽稀成步长一致的点列。平滑用B样条插值、梯形速度平滑或者简单的滑动平均把拐角“抹圆”。在实际项目里我推荐用B样条或者五次多项式插值因为它们在数学上能保证 ( C^2 ) 连续曲率连续这样纯跟踪在拐弯时计算出的曲率变化是渐变的不会突变。这个细节对最终跟踪平滑度影响巨大。3.2 预瞄点搜索的工程实现预瞄点就是路径上距离当前位置恰好等于 ( L_d ) 的那个点。最粗暴的方法每帧遍历全部路径点找距离最近等于 ( L_d ) 的点但路径可能有几千个点控制频率几十赫兹这么搞在低性能控制器上会浪费很多算力。工程上推荐用“窗口搜索法”维护一个全局下标变量 ( idx ) 从上一帧的预瞄点下标附近开始往后搜索直到找到第一个距离大于等于 ( L_d ) 的点作为当前预瞄点。这样做有两个好处一是搜索范围缩小到很小的窗口计算量低二是预瞄点永远不会往回跳跟踪过程天然具有单调性不容易产生震荡。边界情况也要处理如果预瞄点已经搜索到路径末端都没找到满足距离条件的点那说明车已经接近终点这时直接把最后一个路径点当作预瞄点同时进入减速停止流程。否则车会在终点附近反复画圈这个问题我在现场调试遇到过很多次。3.3 差速轮的参考代码实现下面给一个完整的纯跟踪核心代码适用于差速轮底盘输入是当前位姿、路径点数组和前视距离输出是期望线速度与角速度import math def find_lookahead_index(path, robot_pos, lookahead_dist, search_idx): for i in range(search_idx, len(path)): dist math.hypot(path[i][0] - robot_pos[0], path[i][1] - robot_pos[1]) if dist lookahead_dist: return i return len(path) - 1 def pure_pursuit_diff(robot_pos, robot_yaw, path, lookahead_dist, search_idx): idx find_lookahead_index(path, robot_pos, lookahead_dist, search_idx) target path[idx] dx target[0] - robot_pos[0] dy target[1] - robot_pos[1] alpha math.atan2(dy, dx) - robot_yaw # 角度归一化到 [-pi, pi] while alpha math.pi: alpha - 2.0 * math.pi while alpha -math.pi: alpha 2.0 * math.pi dist math.hypot(dx, dy) curvature 2.0 * math.sin(alpha) / max(dist, 1e-3) v_cmd 0.5 # 这里可以换成更复杂的速度规划 omega_cmd v_cmd * curvature return v_cmd, omega_cmd, idx把 ( \omega ) 换算到左右轮速度就是wheel_base 0.5 def diff_kinematics(v, omega, half_basewheel_base / 2.0): v_r v omega * half_base v_l v - omega * half_base return v_r, v_l在代码里有个小细节( \alpha ) 必须做角度归一化否则当车从 ( 170^\circ ) 转到 ( -170^\circ ) 这种穿越 ( \pi ) 边界的情况计算出的 ( \alpha ) 会异常地大导致曲率跳变车会猛打方向。3.4 速度限幅和防滑处理在差速轮上做跟踪除了核心几何解算最影响现场效果的是速度规划。很多AGV用的轮毂电机没有内置加速限制如果控制周期里 ( v ) 和 ( \omega ) 发生阶跃变化电机会瞬间输出很大的扭矩轻则车体抖动重则打滑。我常用的方法是把加速度限幅和角加速度限幅做在控制循环里def limit_accel(cmd, prev, max_accel, dt): diff cmd - prev max_step max_accel * dt if diff max_step: return prev max_step elif diff -max_step: return prev - max_step else: return cmd另外差速轮在重载和急转时会因为内侧轮负载转移而打滑。一个经验是把期望角速度上限限制在每秒 ( 45^\circ ) 到 ( 60^\circ ) 之间除非是原地旋转需求否则不要让角速度太大。这样虽然理论上的转弯能力变弱了但实际路径跟踪的稳定性和定位一致性会好很多。4. 舵轮底盘上的纯跟踪解算实战4.1 从曲率到舵轮转角舵轮底盘的纯跟踪在“选圆弧”这一步和差速轮完全一样区别在于有了期望曲率 ( \kappa ) 之后怎么把几何量变成舵轮转角。以单舵轮为例假设舵轮安装在车体纵轴线上、距离旋转参考点通常取车体几何中心距离为 ( L_f ) 。当舵轮转角为 ( \delta ) 驱动速度为 ( v_f ) 时车体的瞬时运动关系满足[ \omega \frac{v_f \cdot \sin\delta}{L_f} ]这个公式来自刚体运动学中瞬时旋转中心位于车体轴线与舵轮速度方向垂线的交点。舵轮转角越大车体角速度越大舵轮转角为零时车直线走。那么已知期望车体角速度 ( \omega_{ref} v_{cmd} \cdot \kappa ) 舵轮线速度近似等于车体线速度 ( v_f \approx v_{cmd} ) 就可以反解[ \delta_{ref} \arcsin\left(\frac{\omega_{ref} \cdot L_f}{v_{cmd}}\right) ]在工程实现上我一般不用 ( \arcsin ) 而是用 ( \arctan ) 的变体因为当转向角接近极限时 ( \arcsin ) 的导数趋近无穷大控制量容易爆炸。所以实际代码里用的是delta_ref math.atan2(omega_ref * L_f, v_cmd)在低速状态下两者精度差距忽略不计但 ( \arctan ) 天然对极限值有“软饱和”效果控制更稳。4.2 单舵轮的参考代码实现def pure_pursuit_steer(robot_pos, robot_yaw, path, lookahead_dist, search_idx, L_f, v_cmd): idx find_lookahead_index(path, robot_pos, lookahead_dist, search_idx) target path[idx] dx target[0] - robot_pos[0] dy target[1] - robot_pos[1] alpha math.atan2(dy, dx) - robot_yaw while alpha math.pi: alpha - 2.0 * math.pi while alpha -math.pi: alpha 2.0 * math.pi dist math.hypot(dx, dy) curvature 2.0 * math.sin(alpha) / max(dist, 1e-3) omega_ref v_cmd * curvature delta_ref math.atan2(omega_ref * L_f, v_cmd) # 限幅到舵轮机械转角范围比如正负60度 max_steer math.radians(60) delta_ref max(-max_steer, min(max_steer, delta_ref)) return v_cmd, delta_ref, idx这里面 ( L_f ) 的选取直接影响舵轮转角大小和跟踪响应。 ( L_f ) 取车体几何中心到舵轮的投影距离需要根据实际机械图纸确认。注意如果你的车体坐标系原点不在几何中心或者舵轮安装位置偏离中轴线那么运动学公式就不是上面这么简单了需要在车体坐标系里做一次坐标变换算出舵轮在旋转参考系中的位置投影。4.3 双舵轮车怎么分配转角双舵轮AGV前方舵轮1后方舵轮2比单舵轮更灵活但控制也复杂一个量级。核心要求是两个舵轮在任意时刻的转向中心必须重合否则左右轮之间会互相“打架”造成轮胎磨损、电机过流、甚至机械结构损坏。给定车体期望角速度 ( \omega ) 和线速度 ( v ) 可以算出车体瞬时旋转中心相对车体的位置。然后前后舵轮分别根据自己到旋转中心的连线和速度方向求解转角。理想状态下前后舵轮满足“阿克曼转向关系”[ \tan\delta_1 \frac{L_f \cdot \omega}{v} ] [ \tan\delta_2 \frac{L_r \cdot \omega}{v} ]在实际运行中还要考虑前后舵轮的载荷转移和路面附着力差异建议给两个舵轮的驱动速度做差速补偿。简单说就是转弯的时候外侧舵轮速度略大、内侧略小具体补偿系数需要根据实车标定。这块没有万能公式我自己的习惯是先让两个舵轮分别独立跑一次直线和固定半径圆弧记录输出误差再做线性查表补偿。4.4 舵轮转向角速度限制与跟踪超前补偿舵轮电机有减速比转向惯性大。如果你在控制循环里计算出一个大的转角目标然后直接发给转向驱动器转向电机从当前角以最大速度转过去需要时间而车体还在继续前进这就相当于“转弯执行滞后”。纯跟踪只按当前几何计算期望转角没有预测转向延迟所以当AGV速度较高或者转向频繁时会看到明显的切弯过度或者弯道外侧漂移。解决问题有两种常用办法。第一种是限制AGV线速度和转向角速度上限让执行延迟相对控制周期足够小。第二种是对舵轮转角做“微分先行”处理在目标转角上叠加一项基于期望曲率变化率的补偿量[ \delta_{cmd} \delta_{ref} K_{lead} \cdot \frac{d\delta_{ref}}{dt} ]这个 ( K_{lead} ) 从零开始慢慢往上加观察弯道跟踪的横向误差变化找到一个不引起震荡的临界值。实际调参的时候我会在车上贴一条测量误差的胶带把车开到1米每秒的速度跑S弯目标是无超调地贴线过弯。5. 前视距离Ld决定跟踪精度的“命门”参数5.1 前视距离给得太小会怎样前视距离 ( L_d ) 是纯跟踪算法里唯一关键控制器参数它对系统的影响类似PID里的比例增益。 ( L_d ) 越小控制器对路径的“注意力”越集中跟踪的横向误差越小但系统闭环增益越高容易引起振荡。特别是当 ( L_d ) 小于车辆最小转弯半径对应的弦长时车在弯道里会一路“左右横跳”看起来非常挣扎。我做过一个系列测试差速轮AGV以0.5米每秒速度走半径1米的圆形路径 ( L_d 0.3 ) 米时横向误差峰值大约只有2厘米但车体航向角在弯道里持续抖动 ( L_d 0.8 ) 米时横向误差峰值增大到8厘米但航向角平滑很多。所以前视距离本质上是一个“鲁棒性和精度”之间的权衡。低速高精度场景比如AGV对接充电桩、进电梯用小前视距离中速行走场景比如仓储通道运输用大前视距离保证稳定。5.2 前视距离给得太大会怎样前视距离过大的后果就是“切弯”。因为车会提前瞄准很远的路径点在弯道里它不会沿着弯道走而是直接切向弯道内部。最直观的例子是走一个直角弯。如果 ( L_d ) 接近弯道边长的长度车会在离弯道还有很大一段距离的时候就提前转弯直接冲进弯道内侧路径跟踪的横向误差可能会达到二三十厘米。在窄通道里这非常危险。AGV一旦切弯切到内测就可能撞到货架或者护栏。所以在大前视距离和中前视距离之间我建议宁小勿大尤其是在通道宽度有限的环境里。5.3 动态前视距离的工程实现固定前视距离应对平直路径可以但实际AGV的作业场景往往包含直道、直角弯、U型弯和S弯单一 ( L_d ) 很难全部满足。工程上一般用动态前视距离[ L_d K \cdot v L_{min} ]即前视距离随车速线性增大。速度高时看得远提前规划转向速度低时看得近精细跟线。常见的参数范围是 ( K ) 取0.5到1.0 ( L_{min} ) 取0.2到0.4米。另外还可以根据路径曲率动态调整。因为前视距离本质上影响的是车辆在弯道里的“预测跨度”。路径曲率大的地方前视距离应该相应减小直道上则可以把前视距离放宽。实现时可以预先计算路径每个点的曲率在搜索预瞄点时对距离阈值做加权def adaptive_lookahead(v, path_curvature, k_v0.8, k_curv0.3, base0.3): Ld base k_v * v if path_curvature 0.1: # 弯道 Ld max(base, Ld - k_curv * path_curvature) return Ld这个方案的调参顺序我建议是先把速度固定在最低安全值调好基础 ( L_{min} ) 然后逐步提高速度根据弯道跟踪效果调整 ( K ) 最后处理特殊弯道问题。5.4 前视距离与控制器周期的匹配还有一个经常被忽略的点控制周期。纯跟踪是离散执行的一个控制周期内车辆行驶的距离是 ( v \cdot T ) 。如果前视距离和这个距离不在一个量级会导致预瞄点更新太快或者太慢。一般来说AGV以0.8米每秒速度运行、控制周期50毫秒时每帧前进4厘米这时前视距离取0.5米左右比较合适。如果控制器频率很低比如10Hz车每帧前进8厘米前视距离至少要大于这个距离的两倍不然后一帧预瞄点落在前一帧预瞄点后面跟踪会“抽风”。现场判断方法很简单把前视距离改到不同的值用上位机记录每一帧的 ( \alpha ) 角如果 ( \alpha ) 在正负50度之间来回跳说明前视距离太小或者控制周期太慢。6. 调试实录我在AGV上踩过的坑6.1 常见问题速查表这里整理了我自己在差速轮和舵轮AGV调试过程中遇到频率最高的问题、原因和解决办法现象可能原因排查方法路径跟踪蛇形走位前视距离过小、控制频率低、路径有锯齿增大前视距离平滑路径提高控制频率弯道明显切内弯前视距离过大缩小前视距离按路径曲率动态调整舵轮转向迟缓入弯晚转向角速度限制太紧转向执行滞后限制线速度增加转角微分先行补偿车走斜线直道也偏舵轮零点未校准或左右驱动轮轮径不一致重新做舵轮零点校准标定轮径比例低速正常高速抖振前视距离没随速度线性增大用动态前视距离 ( L_d K v L_{min} )停车位置偏离目标预瞄点越过终点后没有停机逻辑终点段触发减速并锁定预瞄点为终点差速轮重载打滑失控加速度过大、速度差突变限制加速度和角加速度降低急转指令6.2 舵轮零点漂移的校准技巧舵轮零点漂移是最容易“白折腾”的事——算法写了半天最后发现车走斜是因为舵轮机械零点偏了。每台舵轮模组在安装时都会存在或多或少的零点偏差哪怕只是偏了1度车沿着30米直线走完就会偏出去半米。我常用的校准方法是“画圆法”把车放在开阔场地手动下发恒定舵轮转角驱动车绕圈走用上位机记录实际圆弧的圆心位置和半径。由于舵轮转角误差和实际圆弧半径之间存在确定关系可以通过比较理论圆弧和实际圆弧反推出零点偏差然后写入舵轮驱动器的参数里。如果没有上位机也可以用简单的“正方形测试”让车走一个4米乘4米的正方形路径如果终点回到起点时横向偏差恒定在一个方向基本可以确定是舵轮零点偏了。把偏差算出来修正舵轮编码器零点即可。6.3 差速轮轮径标定的土办法差速轮还有一个非常常见的坑左右轮实际直径不一致。走直线时虽然给左右轮的速度指令一样但实际线速度不一样车就会慢慢偏转。哪怕轮径差只有0.5%走50米也会偏出二十多厘米。处理办法不是找游标卡尺去量轮胎直径而是做“前进对比测试”在车体上固定一个高精度里程计或者用激光测距让车以恒定速度直线行驶一段已知距离记录左右轮编码器累计脉冲数。两个轮子的脉冲数之差就是轮径误差的比例系数。得到一个补偿系数后在运动学输出左右轮速度之前乘上补偿系数就可以消除这种偏差。这个系数在不同负载下会有变化重载时轮胎形变变大系数需要重新标定。6.4 预瞄点搜索的性能优化当路径点数量很大比如激光SLAM生成的全地图路径有数万点时每帧线性扫描会占用不少CPU时间。我用的方法是维护一个局部索引每次搜索不是从头开始而是从上一帧的预瞄点下标附近开始这个技巧可以降低搜索时间到原来的几十分之一。但要注意一个陷阱如果AGV发生了侧滑或者被外力推了一下当前位置大幅偏离路径预瞄点可能“退回去”了而你的搜索窗口还在往后扫就会永远找不到合适的预瞄点。所以搜索函数需要对当前位置和预瞄点的距离做检查如果上一帧预瞄点已经远远落在车后方就要全图重新搜索并重置索引。这个边界情况在实车调试中确实会发生尤其差速轮在斜坡上停车后溜坡或者舵轮在充电路段被机械限位挡住产生滑移。代码里加一个简单的“回退检测”逻辑比任何复杂的鲁棒控制都有效。6.5 终点减速和停止位精度最后讲一个纯跟踪经常被忽略的问题停车精度。很多AGV用固定距离减速但纯跟踪自己在接近终点时不关心刹车距离如果你不主动降速车会以高速冲过终点再急刹停车位置偏差大还容易让货物晃动。我建议在距离终点大于两倍前视距离时保持巡航速度进入两倍前视距离之后切换到梯形减速曲线到距离终点一个车长时把速度限制在每秒0.05米以下然后等待编码器脉冲或者激光定位确认到位。这个方法在对接举升站、充电桩的场景下非常实用可以把重复停车精度控制在正负1厘米以内。最后的实操体会从差速轮的小型搬运机器人到双舵轮的重载AGV纯跟踪算法这套几何逻辑我算是用熟了。它确实不复杂计算量小、调试点少但你真要去现场把它调明白会发现在论文里根本没人告诉你的细节比算法本身多得多。前视距离怎么动态变、路径要不要平滑、舵轮执行延迟怎么补偿、差速轮打滑怎么防这些才是决定AGV好不好用的关键。如果让我给一个初始建议新项目上手时先把线速度压到0.3米每秒以下前视距离按 ( L_d 0.5 ) 米固定跑直线确认底盘运动学和控制闭环没问题再逐项加动态前视距离、弯道减速、执行延迟补偿这些优化。别一上来就追求高端控制算法先把纯跟踪跑稳你就能在大部分AGV项目里站稳脚了。后面要是觉得效果不够再上Stanley做横向误差快速收敛或者上MPC做多约束优化但底层那套几何直觉始终是理解这些算法的地基。