共计 1898 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点
传统人工势场法 (APF) 在机器人路径规划中存在两个典型问题:

- 局部最小值陷阱:当障碍物产生的斥力与目标点引力平衡时,机器人会陷入静止状态。比如 U 型障碍物场景下,传统 APF 大概率会卡在凹槽处
- 动态障碍物失效:固定参数的势场无法适应突然出现的移动障碍物,常导致路径震荡或碰撞
技术对比
| 方法 | 收敛速度 | 路径平滑度 | 计算开销 | 动态适应性 |
|---|---|---|---|---|
| 纯 APF | 快 | 中等 | 低 | 差 |
| APF+ Q 学习 | 中 | 优 | 中 | 良 |
| RRT* | 慢 | 优 | 高 | 中 |
核心实现
伪代码逻辑
# 混合势场计算
function hybrid_potential(state, goal, obstacles):
att = ζ * (state - goal) # 引力场
rep = Σ η/(d_obs)^2 * (1/d_obs - 1/d_safe) # 斥力场
return att + rep * α # α 由 Q 网络动态调整
# Q-Learning 更新
for episode in episodes:
state = env.reset()
while not done:
action = ε_greedy(Q_table, state)
α = decode_action(action) # 将离散动作映射到参数 α
next_state, reward = env.step(hybrid_potential(α))
Q_table[state][action] += lr*(reward + γ*max(Q[next_state]) - Q[state][action])
Python 实现关键代码
class PotentialField:
def __init__(self, zeta: float = 1.0, eta: float = 1.0, d_safe: float = 2.0):
self.zeta = zeta # 引力系数
self.eta = eta # 斥力系数
self.d_safe = d_safe
def attraction(self, q: np.ndarray, q_goal: np.ndarray) -> np.ndarray:
return self.zeta * (q_goal - q)
def repulsion(self, q: np.ndarray, obstacles: List[np.ndarray]) -> np.ndarray:
total_rep = np.zeros_like(q)
for obs in obstacles:
d = np.linalg.norm(q - obs)
if d < self.d_safe:
total_rep += self.eta * (1/d - 1/self.d_safe) * (q - obs) / d**3
return total_rep
class QLearningAgent:
def __init__(self, n_states: int, n_actions: int, lr: float = 0.1, gamma: float = 0.9):
self.q_table = np.zeros((n_states, n_actions))
self.lr = lr
self.gamma = gamma
self.epsilon = 0.9
def act(self, state: int) -> int:
if random.random() < self.epsilon: # ε-greedy
return random.randint(0, len(self.q_table[state])-1)
return np.argmax(self.q_table[state])
性能考量
- 学习率影响:
- lr=0.01 时收敛稳定但慢
- lr>0.5 可能导致 Q 值震荡
-
推荐使用自适应学习率:
lr = initial_lr / (1 + episode*decay_rate) -
状态空间离散化:
- 将机器人位置 (x,y) 各离散为 20 格时,Q 表大小 =400
- 每增加 1 个状态维度(如速度),内存消耗呈指数增长
- 建议优先离散关键区域(如靠近障碍物的位置)
避坑指南
- 奖励函数设计:
- 避免只给终点正奖励:应设置渐进式奖励(如距离减少 Δd 给予 +0.1)
-
碰撞惩罚需大于最大步数惩罚(如 -10 vs -1)
-
线程安全方案:
from threading import Lock class SafeQLearning(QLearningAgent): def __init__(self): self.lock = Lock() def update_q(self, state, action, reward, next_state): with self.lock: # 更新 Q 值
扩展思考
如何将 DDPG 算法应用于本场景?关键改进点:
1. 用 Actor 网络代替离散动作选择
2. Critic 网络直接评估连续参数 α 的价值
3. 使用 OU 噪声替代 ε -greedy 探索
完整实现代码见:[GitHub 仓库链接](此处应为实际项目链接)
正文完
