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 在轨迹跟踪中的应用框架。你看一眼,就能把整个逻辑串起来。
这张图里,环境提供状态和奖励,智能体根据状态选动作,动作又反过来影响环境。循环往复,直到机器人学会完美跟踪轨迹。说白了,这就是一个「观察-决策-行动-反馈」的闭环。
一个小技巧:刚开始训练时,可以把折扣因子 γ 设小一点(比如 0.9),让机器人更关注眼前的奖励。等它学会了基本跟踪,再慢慢增大 γ(比如 0.99),让它学会长远规划。
好了,MDP 的基础就聊到这儿。记住,状态空间决定了机器人「看什么」,动作空间决定了「做什么」,奖励函数决定了「学成什么样」。这三者设计好了,后面的算法才能发挥威力。