# AMR 非结构化道路轨迹规划技术路线（面向 Agent）

## 1. 项目目标

开发一套面向非结构化道路四舵轮 AMR 的轨迹规划系统。

第一阶段采用车式运动模型，具体边界如下：

- 支持前进、倒车和换向；
- 暂不支持蟹行、纯横移和原地旋转；
- 车体航向始终表示车头朝向；
- 规划结果必须满足完整车体无碰撞、最大曲率约束和目标位姿要求；
- 最终输出可供底盘控制器跟踪的带时间轨迹。

整体技术路线分为四个主要阶段：

```mermaid
flowchart LR
    A[输入与地图构建] --> B[Hybrid A* 粗路径规划]
    B --> C[路径平滑与可行性处理]
    C --> D[SQP 轨迹优化]
    D --> E[输出可跟踪轨迹]
```

---

## 2. 总体模块划分

```text
Module 1：输入与地图构建
Module 2：Hybrid A* 粗路径规划
Module 3：路径平滑与可行性处理
Module 4：SQP 轨迹优化
Module 5：轨迹输出与底盘接口
```

各模块必须通过明确的数据结构传递结果，不允许后级模块直接读取前级模块内部状态。

---

# 3. Module 1：输入与地图构建

## 3.1 模块目标

根据起点、终点、车辆参数和环境障碍物信息，构建一张供全局搜索使用的任务级二维栅格地图。

地图范围至少覆盖：

- AMR 起点；
- 目标位置；
- 起点与目标之间的规划区域；
- 周围必要的安全边界。

当前阶段继续使用已有 `GridMapData` 作为地图数据来源，并通过适配器转换为 Hybrid A* 使用的规划地图。

---

## 3.2 输入数据

### 3.2.1 起点位姿

```text
StartPose:
    X
    Y
    Heading
    StartDirection
    StartVehicleCurvature
```

字段定义：

- `X、Y`：AMR 几何中心在世界坐标系中的位置；
- `Heading`：车头航向；
- `StartDirection`：`Forward`、`Reverse` 或 `Both`；
- `StartVehicleCurvature`：车辆当前转向曲率，未提供时默认为 0。

---

### 3.2.2 终点位姿

```text
GoalPose:
    X
    Y
    Heading
    GoalDirectionConstraint
```

目标进入方向约束：

```text
Any
Forward
Reverse
```

其中：

- `GoalHeading` 始终表示目标车头朝向；
- `GoalDirectionConstraint` 只约束最后一个连续运动段的运动方向。

---

### 3.2.3 车辆参数

```text
VehicleParameters:
    VehicleLength
    VehicleWidth
    MaxVehicleCurvature
    MinTurningRadius
```

第一阶段车辆参考点统一采用 AMR 几何中心。

---

### 3.2.4 环境障碍物

当前已接入：

```text
TwoLegDetect 两腿检测结果
```

后续扩展：

```text
点云障碍物
激光雷达障碍物
静态障碍物
动态障碍物
禁行区域
```

---

### 3.2.5 地图配置

```text
MapConfiguration:
    GridResolution
    MapMarginX
    MapMarginY
    ObstacleInflation
    MaximumCellCount
```

---

## 3.3 当前地图构建逻辑

```mermaid
flowchart TD
    A[读取 AMR 位姿与车身尺寸] --> B[读取目标位置与地图参数]
    B --> C[计算任务级地图边界]
    C --> D[创建 GridMapData]
    D --> E[读取 TwoLegDetect 障碍物]
    E --> F[车体系坐标转世界坐标]
    F --> G[圆形障碍物栅格化]
    G --> H[输出环境占据栅格]
```

当前地图边界由起点与目标位置共同决定：

```text
XMin = min(StartX, GoalX) - MapMarginX
XMax = max(StartX, GoalX) + MapMarginX

YMin = min(StartY, GoalY) - MapMarginY
YMax = max(StartY, GoalY) + MapMarginY
```

栅格尺寸：

```text
Cols = ceil((XMax - XMin) / Resolution)
Rows = ceil((YMax - YMin) / Resolution)
```

---

## 3.4 当前地图适配要求

现有地图格式为：

```text
单位：mm
数组：Cells[row, col]
状态：0 = 未标记占据，1 = Occupied
```

Hybrid A* 内部统一使用：

```text
单位：m
角度：rad
曲率：1/m
```

因此需要增加：

```text
PlanningMapAdapter
```

适配流程：

```mermaid
flowchart TD
    A[GridMapData] --> B[校验边界、尺寸与分辨率]
    B --> C[深拷贝 Occupancy]
    C --> D[毫米转换为米]
    D --> E[生成障碍物距离场]
    E --> F[输出 PlanningGridMap]
```

---

## 3.5 地图构建阶段的关键规则

### 3.5.1 规划地图不得包含 AMR 自身占据层

AMR 自身不能写入环境占据地图，否则 Hybrid A* 起点会直接被判定为碰撞。

正确关系：

```text
环境地图：
    只包含外部障碍物

AMR 自身：
    通过 VehiclePose、VehicleLength、VehicleWidth 单独描述
```

---

### 3.5.2 障碍物膨胀量必须明确

建议将：

```text
SafetyMarginMm
```

改为：

```text
ObstacleInflationMm
```

其唯一含义是：

> 障碍物写入地图前向外膨胀的距离。

必须避免：

```text
障碍物已经膨胀
+
车辆碰撞矩形再次增加同样余量
```

---

### 3.5.3 区分地图创建成功与地图可用于规划

```text
Succeeded：
    地图数据结构是否创建成功

PlanningReady：
    当前地图是否满足规划输入要求

PlanningBlockReason：
    地图为何不能用于规划
```

例如：

```text
TwoLegDetect 正常：
    Succeeded = true
    PlanningReady = true

TwoLegDetect 无结果：
    Succeeded = true
    PlanningReady = false
```

---

## 3.6 地图输出

```text
PlanningGridMap:
    XMin
    XMax
    YMin
    YMax
    Resolution
    Rows
    Cols
    Occupancy[row, col]
    ObstacleDistance[row, col]
    ObstacleInflation
    InputSource
    PlanningReady
    MapVersion
```

当前第一版状态定义：

```text
Occupancy = 0：
    当前地图层未标记为占据

Occupancy = 1：
    占据

地图外部：
    按占据处理
```

---

# 4. Module 2：Hybrid A* 粗路径规划

## 4.1 模块目标

在任务级栅格地图中搜索一条：

- 从起点到目标附近；
- 完整车体无碰撞；
- 满足最大曲率限制；
- 支持前进、倒车和换向；
- 具有正确绕障拓扑；
- 可作为后续平滑和 SQP 优化初值；

的空间粗路径。

Hybrid A* 负责决定：

```text
从哪里走
绕障碍物哪一侧走
什么时候前进
什么时候倒车
在哪里换向
以什么车头航向接近目标
```

Hybrid A* 不负责：

```text
速度
加速度
角速度
时间戳
舵轮角度
轮速
```

---

## 4.2 搜索状态

连续状态：

```text
State:
    x
    y
    theta
    direction
    curvatureIndex
```

字段定义：

- `x、y`：AMR 几何中心位置；
- `theta`：车头航向；
- `direction`：`Forward` 或 `Reverse`；
- `curvatureIndex`：当前离散车辆曲率等级。

Closed Set 键：

```text
GridKey:
    ix
    iy
    iHeading
    direction
    curvatureIndex
```

---

## 4.3 运动模型

定义：

```text
directionSign = +1：Forward
directionSign = -1：Reverse
```

运动积分：

```text
dx/ds = directionSign × cos(theta)
dy/ds = directionSign × sin(theta)
dtheta/ds = directionSign × VehicleCurvature
```

其中：

```text
Heading：
    始终表示车头朝向

ArcLength：
    始终非负并单调增加
```

---

## 4.4 运动原语

第一版离散曲率集合：

```text
-kappaMax
-0.5 × kappaMax
0
+0.5 × kappaMax
+kappaMax
```

每个曲率均支持：

```text
Forward
Reverse
```

第一版建议参数：

```text
PrimitiveLength = 0.50 m
IntegrationStep = 0.05 m
```

每条原语按 0.05 m 步长积分，并在每个内部积分点执行完整车体碰撞检测。

---

## 4.5 搜索约束

每个候选原语必须检查：

```text
地图边界
Occupied 栅格
完整车辆矩形碰撞
安全净空
最大车辆曲率
允许的运动方向
曲率等级切换规则
目标进入方向
```

第一阶段暂不直接约束：

```text
速度
加速度
曲率时间变化率
舵轮转向速度
```

但需要通过代价项减少极端曲率跳变。

---

## 4.6 搜索代价

```text
g =
    路径长度代价
  + 倒车代价
  + 换向代价
  + 曲率代价
  + 曲率变化代价
  + 障碍物距离代价
```

启发函数：

```text
h = max(h2D, hRS)
```

其中：

```text
h2D：
    基于二维 Dijkstra 的绕障距离

hRS：
    基于 Reeds–Shepp 模型的非完整约束距离
```

节点排序：

```text
f = g + HeuristicWeight × h
```

---

## 4.7 终点附近 Reeds–Shepp 连接

```mermaid
flowchart TD
    A[当前节点接近目标] --> B[生成 Reeds-Shepp 候选]
    B --> C[按 0.05 m 采样]
    C --> D[完整车体碰撞检查]
    D --> E[最大曲率与目标方向检查]
    E -->|成功| F[精确连接目标]
    E -->|失败| G[继续 Hybrid A* 搜索]
```

支持模式：

```text
Disabled
Opportunistic
RequiredNearGoal
```

停车、钻入和精确泊入任务优先使用：

```text
RequiredNearGoal
```

---

## 4.8 Hybrid A* 输出

```text
CoarsePathPoint:
    X
    Y
    Heading
    UnwrappedHeading
    ArcLength
    Direction
    VehicleCurvature
    GeometricCurvature
    BodyClearance
    IsGearSwitchPoint
    Source
```

路径按运动方向拆分：

```text
PathSegment:
    SegmentIndex
    Direction
    StartIndex
    EndIndex
    StartsAtGearSwitch
    EndsAtGearSwitch
```

---

# 5. Module 3：路径平滑与可行性处理

## 5.1 模块目标

消除 Hybrid A* 粗路径中的离散折线和不连续曲率，生成更平滑的空间参考路径。

该阶段只优化几何形状，不进行时间参数化。

不得改变：

```text
绕障侧
前进与倒车顺序
换向次数
方向段拓扑
目标进入方向
```

---

## 5.2 处理流程

```mermaid
flowchart TD
    A[Hybrid A* 稠密粗路径] --> B[删除重复点]
    B --> C[按 Forward/Reverse 分段]
    C --> D[保留关键点]
    D --> E[按弧长重采样]
    E --> F[几何平滑]
    F --> G[完整可行性检查]
    G --> H[平滑空间路径]
```

---

## 5.3 必须保留的关键点

```text
起点
终点
换向点
曲率等级切换点
直线与弯道切换点
Reeds–Shepp 连接点
局部最小净空点
明显航向变化点
```

禁止跨换向点进行单条曲线拟合。

---

## 5.4 平滑方法

### 5.4.1 贝塞尔曲线

适用于：

```text
局部短转角
折线拐点快速平滑
局部连接
```

特点：

```text
实现简单
计算速度快
局部形状易控制
```

---

### 5.4.2 五次多项式

适用于：

```text
末端短距离连接
具有明确起终点位置、航向和曲率的局部段
```

特点：

```text
可同时约束位置、航向和曲率
适合末端姿态调整
```

---

### 5.4.3 B 样条

适用于：

```text
较长的普通路径段
多点连续平滑
降低局部折线感
```

建议采用三次 B 样条作为第一版普通路径段的主平滑方法。

---

## 5.5 可行性检查

平滑后的路径必须重新检查：

```text
完整车体碰撞
地图边界
Unknown / Occupied
最小安全净空
最大车辆曲率
路径位置连续性
路径切线连续性
换向结构
目标进入方向
```

若平滑失败：

```text
局部重新调整
    ↓
局部 QP 兜底
    ↓
仍失败则回退原始可行粗路径
```

---

## 5.6 输出

```text
SmoothedPathPoint:
    X
    Y
    Heading
    ArcLength
    Direction
    VehicleCurvature
    GeometricCurvature
    BodyClearance
    Source
```

该输出仍然不包含：

```text
速度
加速度
时间戳
```

---

# 6. Module 4：SQP 轨迹优化

## 6.1 模块目标

以平滑空间路径作为参考线，通过 Frenet 坐标系和 SQP 优化，联合完成：

- 横向几何调整；
- 曲率优化；
- 纵向速度规划；
- 加速度约束；
- 换向停车约束；
- 终点精确收敛；
- 时间参数化。

最终生成可供车辆控制器跟踪的带时间轨迹。

---

## 6.2 Frenet 坐标转换

将平滑路径作为参考线，建立 Frenet 坐标系：

```text
s：
    沿参考线的累计弧长

l：
    相对于参考线的横向偏移
```

转换后，将原二维路径问题分解为：

```text
横向 l-s 问题
纵向 s-t 问题
```

---

## 6.3 横向 l-s 优化

主要优化变量：

```text
横向偏移 l
横向一阶导数 dl/ds
横向二阶导数 d²l/ds²
曲率
曲率变化
```

优化目标：

```text
尽量贴近参考线
避开障碍物
保持曲率平滑
满足最大曲率
满足安全走廊约束
精确到达目标横向位置
```

---

## 6.4 纵向 s-t 优化

主要优化变量：

```text
s(t)
速度 v(t)
加速度 a(t)
加加速度 jerk(t)
```

优化目标：

```text
满足速度上限
满足加速度约束
满足减速度约束
提高运动平顺性
减少总时间
在换向点停车
在终点停车
```

---

## 6.5 SQP 联合优化

SQP 负责迭代求解：

```text
路径位置
航向
曲率
速度
加速度
角速度
时间戳
```

约束至少包括：

```text
障碍物安全约束
车辆曲率约束
速度约束
加速度约束
角速度约束
换向点速度为 0
终点位置约束
终点航向约束
终点速度约束
```

SQP 不负责：

```text
重新决定绕障侧
凭空新增换向
改变 Hybrid A* 已确定的拓扑结构
```

---

## 6.6 SQP 输出

```text
TrajectoryPoint:
    X
    Y
    Heading
    Time
    ArcLength
    Direction
    Velocity
    Acceleration
    AngularVelocity
    VehicleCurvature
    GeometricCurvature
```

该轨迹可以直接提供给后续底盘控制与轨迹跟踪模块。

---

# 7. Module 5：轨迹输出与底盘接口

## 7.1 输出内容

```text
TrajectoryResult:
    PlanningStatus
    GoalReachType
    PathProcessingResult
    TrajectoryPoints
    DirectionSegments
    Diagnostics
```

---

## 7.2 底盘控制前的处理

轨迹规划器不直接输出四轮舵角和轮速。

底盘控制层负责：

```text
轨迹点
    ↓
车辆状态误差计算
    ↓
轨迹跟踪控制
    ↓
底盘运动学逆解
    ↓
四轮舵角与轮速
```

---

# 8. Agent 开发顺序

## 阶段 M0：数据结构与公共工具

实现：

```text
Pose2D
VehicleParameters
GoalPose
GridMapData Adapter
角度归一化
坐标变换
单位转换
```

完成标准：

```text
单元测试通过
毫米与米转换无误
航向角定义统一
```

---

## 阶段 M1：地图适配与碰撞检测

实现：

```text
PlanningMapAdapter
PlanningGridMap
距离场
旋转矩形碰撞检测
地图边界检测
```

完成标准：

```text
AMR 自身不会出现在环境占据图中
不同航向下完整车体碰撞检测正确
```

---

## 阶段 M2：最小 Hybrid A*

实现：

```text
只前进
无障碍
恒曲率运动原语
基础启发函数
```

完成标准：

```text
稳定从起点搜索到目标
```

---

## 阶段 M3：障碍物、倒车和换向

实现：

```text
Dijkstra 启发
Forward / Reverse
换向代价
方向分段
```

完成标准：

```text
单障碍绕行成功
需要倒车的场景成功
换向点正确输出
```

---

## 阶段 M4：目标终止与 Reeds–Shepp

实现：

```text
目标位置容差
目标航向容差
目标进入方向
Reeds–Shepp 三种模式
```

完成标准：

```text
普通目标和狭窄目标场景均能正确终止
```

---

## 阶段 M5：路径后处理

实现：

```text
父节点回溯
内部积分点恢复
关键点保留
弧长重采样
```

完成标准：

```text
路径无断点
换向结构明确
方向段正确
```

---

## 阶段 M6：平滑与可行性检查

实现：

```text
B 样条
贝塞尔曲线
五次多项式
完整碰撞复核
失败回退
```

完成标准：

```text
路径曲率明显改善
不改变原有拓扑
平滑失败可回退
```

---

## 阶段 M7：SQP 轨迹优化

实现：

```text
Frenet 坐标转换
l-s 优化
s-t 优化
速度和加速度约束
换向停车约束
终点精确约束
```

完成标准：

```text
输出带时间的可跟踪轨迹
终点位置与航向满足要求
换向点速度为 0
```

---

## 阶段 M8：性能优化

在前述流程完整跑通后再开展：

```text
性能剖析
Open List 优化
Closed Set 优化
节点内存优化
地图裁剪
预计算运动原语
预计算碰撞模板
启发图复用
路径热启动
增量规划
```

---

# 9. 核心技术边界

## Hybrid A* 负责

```text
拓扑
绕障侧
前进与倒车结构
换向位置
基本运动学可行性
粗目标位姿接近
```

## 路径平滑负责

```text
消除折线
改善局部曲率
保持拓扑不变
输出连续空间参考路径
```

## SQP 负责

```text
终点精确收敛
速度规划
加速度规划
角速度规划
时间参数化
动态可跟踪性
```

## 底盘控制负责

```text
四轮舵角
四轮轮速
轨迹跟踪
执行器控制
```

---

# 10. 最终技术路线总结

```text
起点位姿 + 目标位姿 + 车辆参数 + 障碍物数据
        ↓
构建任务级环境占据地图
        ↓
通过 PlanningMapAdapter 转换为规划地图
        ↓
Hybrid A* 搜索满足运动学约束的粗路径
        ↓
Reeds–Shepp 处理终点位姿连接
        ↓
回溯、重采样和路径方向分段
        ↓
B 样条 / 贝塞尔 / 五次多项式进行几何平滑
        ↓
重新执行完整车体碰撞和曲率检查
        ↓
建立 Frenet 参考坐标系
        ↓
横向 l-s 优化路径形状和曲率
        ↓
纵向 s-t 优化速度、加速度和停车决策
        ↓
SQP 联合求解可跟踪轨迹
        ↓
输出位置、航向、速度、加速度、角速度和时间戳
        ↓
底盘控制器进行四轮舵角和轮速逆解
```

该技术路线的核心原则是：

> Hybrid A* 解决“怎么走”，路径平滑解决“走得是否顺”，SQP 解决“以什么速度和时间走”，底盘控制解决“四个舵轮和车轮如何执行”。
