3、数学基础回顾:马尔可夫决策过程(MDP)、状态空间、动作空间、奖励函数设计

好,咱们进入正题。轨迹跟踪这个难题,说白了就是让机器人「跟着一条线走」。但怎么让机器人学会自己跟着走?这就得靠马尔可夫决策过程(MDP)来建模了。我个人觉得,MDP 是整个强化学习的骨架,你把这个骨架搭好了,后面填肉(算法)就顺了。

3.1 马尔可夫决策过程(MDP)—— 机器人的「世界观」

MDP 是什么?别被名字吓到。它就是一个数学框架,用来描述机器人跟环境之间的互动。我习惯把它拆成五个要素:(S, A, P, R, γ)。

  • S:状态空间 —— 机器人能看到什么
  • A:动作空间 —— 机器人能做什么
  • P:状态转移概率 —— 做了动作后,世界会变成什么样
  • R:奖励函数 —— 做得好不好,给个分数
  • γ:折扣因子 —— 未来的奖励,今天打多少折扣

你想想看,机器人每走一步,都遵循这个流程:
当前状态 → 选动作 → 环境反馈新状态 + 奖励 → 再选动作 → ……

这里有个关键点:马尔可夫性。意思是,未来的状态只取决于当前状态和当前动作,跟过去的历史无关。嗯,这个假设在实际中不一定完全成立,但大部分情况下够用了。我在项目中遇到过,如果状态设计得不好,马尔可夫性就会被破坏,导致训练怎么都不收敛。

核心公式(贝尔曼方程):

V(s) = max_a [ R(s,a) + γ * Σ P(s'|s,a) * V(s') ]

这个公式告诉你:当前状态的价值 = 立即奖励 + 未来奖励的折现总和。说白了,就是「吃眼前的饭,也要想着明天的粮」。

3.2 状态空间设计 —— 给机器人一双「眼睛」

状态空间,就是机器人感知世界的维度。在轨迹跟踪里,状态通常包括:

  • 位置误差:机器人当前位置与目标轨迹的横向偏差
  • 航向误差:机器人当前朝向与轨迹切线方向的夹角
  • 速度:当前线速度、角速度
  • 曲率:前方轨迹的弯曲程度(这个我强烈建议加上)

我曾经踩过一个坑:只用了位置误差和航向误差,结果机器人在直道上跑得挺好,一到弯道就「放飞自我」了。后来加了曲率信息,才稳定下来。所以状态设计一定要覆盖「未来趋势」,不能只看眼前。

我的经验:状态维度不是越多越好。太多维度会导致「维度灾难」,训练慢得像蜗牛。我一般控制在 4~8 维,够用就行。如果状态是图像(比如摄像头画面),那就得用 CNN 来提取特征了。

3.3 动作空间设计 —— 给机器人一双「手」

动作空间,就是机器人能执行的操作。在轨迹跟踪里,常见的有两种:

类型 描述 示例
离散动作空间 从有限个动作里选一个 左转30°、直行、右转30°
连续动作空间 输出一个连续值 方向盘转角 -30° ~ +30°

我个人更倾向于连续动作空间,因为机器人控制本身就是连续的。但连续空间对算法要求更高,比如 DDPG、SAC 这些算法就是专门处理连续动作的。

这里有个避坑指南:动作范围一定要归一化。我曾经直接把原始角度(比如 -30° ~ +30°)丢给网络,结果训练时梯度爆炸了。后来统一归一化到 [-1, 1],问题就解决了。

注意:动作空间的分辨率也很重要。如果离散动作的步长太大,机器人会「抖动」;步长太小,又学得慢。我一般先用粗粒度训练,再 fine-tune 细粒度。

3.4 奖励函数设计 —— 机器人的「胡萝卜加大棒」

奖励函数,是强化学习里最「艺术」的部分。它决定了机器人学成什么样。在轨迹跟踪里,我常用的奖励设计思路是:

  • 距离奖励:离目标轨迹越近,奖励越高。可以用高斯函数:R = exp(-d² / σ²)
  • 航向奖励:朝向与轨迹切线一致时给正奖励
  • 速度奖励:鼓励机器人保持目标速度
  • 惩罚项:碰撞、偏离太远、急转弯等都要扣分

我刚开始做的时候,奖励函数写得特别复杂,结果机器人学会了「钻空子」—— 它发现原地转圈也能拿到不少奖励。后来我简化了奖励,只保留核心项,反而效果更好。

一个经典的奖励函数示例(伪代码):

def compute_reward(state, action):
    lateral_error = state.lateral_error   # 横向误差
    heading_error = state.heading_error   # 航向误差
    speed = state.speed                   # 当前速度
    
    # 距离奖励:误差越小越好
    reward_distance = exp(-lateral_error² / 0.5²)
    
    # 航向奖励:角度偏差越小越好
    reward_heading = exp(-heading_error² / 0.3²)
    
    # 速度惩罚:偏离目标速度要扣分
    target_speed = 1.0
    penalty_speed = -abs(speed - target_speed) * 0.1
    
    # 动作平滑惩罚:防止急转弯
    penalty_jerk = -abs(action.steering) * 0.05
    
    total_reward = reward_distance * 0.6 + reward_heading * 0.3 + penalty_speed + penalty_jerk
    return total_reward

你可能会问:这些权重怎么调?说实话,没有标准答案。我一般先设成等权重,然后观察机器人的行为,再根据问题调整。比如发现机器人老是偏离轨迹,就加大距离奖励的权重。

3.5 知识体系总览

下面这张图,是我自己总结的 MDP 在轨迹跟踪中的应用框架。你看一眼,就能把整个逻辑串起来。

MDP 在轨迹跟踪中的应用框架 环境 (Environment) 目标轨迹、物理约束 状态 S 位置误差、航向误差、速度 动作 A 转向角、加速度 奖励 R 距离奖励 + 航向奖励 + 惩罚 智能体 (Agent) 策略网络、价值网络 观测 输入 输出 反馈 更新策略 折扣因子 γ 平衡短期与长期奖励

这张图里,环境提供状态和奖励,智能体根据状态选动作,动作又反过来影响环境。循环往复,直到机器人学会完美跟踪轨迹。说白了,这就是一个「观察-决策-行动-反馈」的闭环。

一个小技巧:刚开始训练时,可以把折扣因子 γ 设小一点(比如 0.9),让机器人更关注眼前的奖励。等它学会了基本跟踪,再慢慢增大 γ(比如 0.99),让它学会长远规划。

好了,MDP 的基础就聊到这儿。记住,状态空间决定了机器人「看什么」,动作空间决定了「做什么」,奖励函数决定了「学成什么样」。这三者设计好了,后面的算法才能发挥威力。

可可精品资料库