APF 人工势场:把“走向目标”和“远离障碍”写成一组力 📅 发布时间:2026/9/15 8:43:52 👁 浏览次数: APF 人工势场把“走向目标”和“远离障碍”写成一组力摘要本文介绍人工势场法在移动机器人局部规划中的基本思想结合 MATLAB 实现解析吸引力、排斥力、目标点选择、速度控制与运动学更新并讨论局部极小和参数敏感性等实际问题。前言全局规划解决的是“从起点到终点大体应该走哪条路”局部规划更关心机器人下一时刻应该怎么动。人工势场法Artificial Potential FieldAPF就是一种非常直观的局部规划思想把目标点看成一个持续吸引机器人的“引力源”把障碍物看成会推开机器人的“斥力源”机器人最终沿着合力方向不断运动。这种方法的优势是结构简单、计算量小而且和“避障”这件事的直觉非常一致。它也有明显短板例如局部极小、目标附近障碍引起的振荡以及参数对轨迹形态影响较大。理解这些优缺点以后再看 DWA、RPP 等算法会更容易明白为什么后续局部规划方法需要引入速度空间、曲率约束或预测模型。原理讲解1. 吸引势场与吸引力设机器人当前位置为局部目标点为最简单的吸引势函数可以写成其中 为吸引增益。对势函数取负梯度就得到指向目标的吸引力当前实现没有直接使用距离大小而是先把方向向量归一化attr_force tgt_pos - cur_pos; if ~all(attr_force 0) attr_force attr_force ./ norm(attr_force); end这样做意味着吸引项主要提供“方向”而不是让距离越远、吸力越大。2. 排斥力设机器人到某个障碍点的距离为 障碍影响半径为 。经典人工势场常使用相应排斥力大小与有关。代码中的getRepulsiveForce正是按照这一形式计算所有障碍点贡献只保留影响半径d_0内的障碍再把各方向排斥力求和并归一化。最终合力写成当前参数为zeta 1.0; eta 0.8; d_0 1.5;这意味着吸引项权重略高于排斥项障碍物只有进入 1.5 个地图距离单位以内才会产生排斥作用。3. 为什么还需要全局路径这份 APF 实现并不是直接始终把最终 goal 当作唯一吸引源而是读取全局规划器输出的path再沿路径向前寻找一个局部目标点。代码使用p_window 0.5;当当前路径点距离机器人已经小于窗口范围时plan_idx会继续向前移动直到找到一个更合适的跟踪点。这样做很重要因为纯 APF 如果只看最终终点遇到大型障碍时很容易被障碍势场带入不理想区域引入全局路径后局部控制只需要在全局路线附近完成跟踪和避障。4. 从“力”转换成速度方向合力不是直接当作控制量而是先和机器人当前速度矢量相加随后归一化并限制到最大线速度max_v 0.4;再通过得到期望朝向。因此 APF 实际上完成的是“给出下一步应该朝哪个方向走”而最终的线速度、角速度仍由两个简单控制器生成。代码详解1. 输入接口函数接口为function [pose, traj, flag] apf_plan(start, goal, varargin)其中start、goal不只是二维坐标而是包含姿态角的三维状态[x, y, theta]额外参数需要提供path, global_path map, grid_map这里的path来自全局规划map用于提取障碍物。2. 障碍物坐标提取代码通过obs_index find(map2);找到障碍栅格再转换成二维坐标集合obstacle。后续排斥力并不是针对障碍轮廓计算而是对所有障碍栅格中心计算距离。这会带来一个实际影响障碍物越大附近参与排斥力叠加的栅格点越多因此障碍几何尺寸本身会间接影响排斥方向。3. 速度控制并不是完整 PID虽然linearController和angularController都写出了 P、I、D 三项但当前参数中线速度控制实际为k_v_p 1.00; k_v_i 0.00; k_v_d 0.00;因此线速度部分本质上是比例控制。角速度部分为k_w_p 1.00; k_w_i 0.00; k_w_d 0.01;只有很小的微分项。这说明 APF 决定的是“运动方向”低层速度跟踪只是相对简单的辅助控制。4. 大角度误差时先原地转向如果abs(theta_d - robot.theta) pi / 2机器人不会继续向前而是u [0, w];先原地旋转。这一逻辑可以避免机器人在朝向误差过大时一边快速前进一边急转从而减小明显的横向偏离。5. 运动学模型代码采用差速/独轮车式二维运动模型因此控制器最终输出始终是u [v, w]即线速度与角速度。完整 MATLAB 实现说明对应源码文件为local_planner/apf_plan.m核心函数包括apf_plan ├─ getAttractiveForce ├─ getRepulsiveForce ├─ linearController ├─ angularController └─ f阅读时建议重点关注getRepulsiveForce、局部路径点选择逻辑以及从合力到theta_d的转换过程。本文说明依据当前apf_plan.m的实际实现展开。总结与思考APF 最大的优点是直觉清楚目标负责“拉”障碍负责“推”最终方向由合力决定。它也说明了局部规划的一个基本问题——机器人不是只要知道路径就够了还必须在当前姿态、障碍分布和速度限制下不断生成下一步控制量。但人工势场并不天然保证全局收敛。吸引力和排斥力可能在某些位置相互抵消形成局部极小在狭窄通道或目标附近有障碍时也可能出现往复振荡。因此 APF 更适合作为理解局部避障的起点而不是所有场景下的万能方案。