重卡自动泊车路径规划演示

Hybrid A* Path Planning · Articulated Vehicle

← 返回重卡泊车主页

速度 2.0×
牵引车朝向 θ₁
挂车朝向 θ₂
铰接角 β
搜索节点
车速
调整次数

直线倒车入月台

乘用车

重卡

算法技术说明

本演示采用改进型 Hybrid A* 算法规划铰接式车辆(牵引车+挂车)的泊车轨迹。所有场景使用同一套规划器,无逐场景手工调参。以下逐层展开算法实现细节。

1. 铰接车辆运动学模型

采用自行车模型(Bicycle Model)建模牵引车-挂车系统。状态量为 4 维:

q = (x, y, θ₁, θ₂)

其中 (x, y) 为铰接点(第五轮)位置,θ₁ 为牵引车纵轴航向角,θ₂ 为挂车纵轴航向角。铰接角 β = θ₁ − θ₂。

挂车 Trailer (L₂=8.0m) 牵引车 Tractor (L₁=3.5m) 铰接点 (x, y) 挂车后轴 δ (转向角) θ₂ θ₁ x β = θ₁−θ₂ v (倒车方向)

连续时间运动学方程(v 为速度,δ 为前轮转向角):

ẋ = v·cos(θ₁)
ẏ = v·sin(θ₁)
θ̇₁ = v·tan(δ) / L₁
θ̇₂ = v·sin(θ₁ − θ₂) / L₂

数值积分采用前向欧拉法,步长 dt = 0.05s。倒车时 v < 0,铰接角 β 的变化率取决于 sin(β)——当 β ≈ 0 时挂车航向几乎不变,这正是倒车精修阶段的难点。

参数牵引车挂车乘用车
轴距L₁ = 3.5mL₂ = 8.0mL = 2.8m
最大转向角δ_max = 0.40 rad (22.9°)0.55 rad (31.5°)
车宽2.5m1.8m
状态维度4D (x, y, θ₁, θ₂)3D (x, y, θ)

2. Hybrid A* 搜索

Hybrid A* 在连续状态空间中搜索,同时用离散网格进行节点去重。每个搜索节点的状态 (x, y, θ₁, θ₂) 是连续值,但用网格键进行量化以避免无限扩展:

key = (⌊x / g_xy⌋, ⌊y / g_xy⌋, ⌊θ₁ / g_θ⌋, ⌊norm(θ₁−θ₂) / g_β⌉)

其中 g_xy = 0.4m, g_θ = 4°, g_β = 4°。closed set 记录每个网格键的最优代价 g,新节点仅在 g 更优时入队。

每次节点扩展时,对所有可用的 (转向角 δ, 方向 v) 组合执行一段运动基元(motion primitive):以固定 δ 和 v 积分 seg = 0.7m 距离,生成子节点。代价函数:

g(n) = g(parent) + seg + λ₁·𝟙[v<0] + λ₂·|δ − δ_prev| + λ₃·f(β)

其中倒车惩罚 λ₁ = 0.1,转向变化惩罚 λ₂ = 0.2,大铰接角惩罚 λ₃ 在 |β| > 15° 时线性增加。这些惩罚项引导搜索优先选择平稳的前进轨迹,避免不必要的折叠。

启发式函数 h(n) 采用两种策略的较大值:

3. 配置相关转向限制(核心改进)

铰接车辆倒车时的折叠效应(jackknife)是最大的安全约束。当 |β| 过大时,继续错误方向的转向会导致挂车与牵引车折叠,造成不可逆的危险姿态。

关键公式——中性转向角 δ_neutral 将舵角空间分为"增大 β"和"减小 β"两个半平面:

δ_neutral = atan((L₁ / L₂) · sin(β))

分级限制策略:

铰接角范围转向限制说明
|β| < 20° (BETA_WARN)全范围 [−δ_max, +δ_max]安全区间,系统稳定
20° ≤ |β| < 35°仅允许 β 减小方向的半区间限制到 δ_neutral 的安全侧
|β| ≥ 35° (BETA_MAX)节点直接拒绝硬限制,防止折叠
倒车时舵角范围 vs 铰接角 β 全范围(安全) |β| < 20° β 减小半区 禁止 20° ≤ |β| < 35° 节点拒绝 δ_neutral

这一改进基于 Cao et al. (2025) 的工作。相比固定转向集,配置相关限制在搜索过程中动态裁剪不安全分支,大幅减少了因折叠导致的无效扩展和回溯。

4. 解析展开(Analytical Expansion)

Hybrid A* 的网格分辨率(g_θ = 4°)限制了可达到的终态角度精度。为达到亚度级精度,算法在搜索过程中周期性尝试连续弧线连接——从当前节点出发,用固定 (δ, v) 积分一条连续轨迹,检查是否直达目标。

def _try_analytical(self, state, goal): # 21 个舵角 × 双向 × 100 步(5m) dmax = self.p['maxSteer'] steers = [-dmax + 2*dmax*i/20 for i in range(21)] for v in [-1, 1]: # 倒车 + 前进 for delta in steers: # 21 个舵角值 traj = integrate(state, delta, v, max_steps=100) if at_goal(traj[-1], goal, precise=True): return traj, delta, v # 0.5° 精确连接 return None

双级目标判定(at_goal)策略:

当网格搜索到达松容差目标时,先尝试一次解析展开。如果找到精确连接,使用连续轨迹(亚度级精度);否则接受网格节点(由 endgame 精修)。

5. Endgame 精修

当 A* 到达目标区域但角度精度不足时,进入 endgame 阶段。这是一个多阶段闭环控制流程:

Phase 1
倒车 PD 控制
δ = −(K₁·e_θ₁ + K₂·e_θ₂)
K₁=8.0, K₂=−12.0, v=−0.15 m/s
Phase 2
前进 Shunt(迭代≤3轮)
前向创造反向 β,
打破 θ₁/θ₂ 耦合
Phase 3
Final Trim
全局扫描末尾 100 点,
取 combined_err 最小点

为什么需要 Shunt? 当 β ≈ 0 时,θ̇₂ = v·sin(0)/L₂ ≈ 0——挂车航向被"冻结"。无论怎么调整 δ,都无法改变 θ₂。前进 shunt 创造一个非零 β,使 θ₂ 重新可控,然后 Phase 1 的 PD 利用这个 β 修正角度。

combined_err 用于评估路径质量(位置误差 + 加权角度误差):

combined_err = pos_err + 30·|β| + 30·|e_θ₁| + 30·|e_θ₂|

6. 碰撞检测

车辆几何体建模为有向边界框(OBB),障碍物为轴对齐边界框(AABB)。碰撞检测使用分离轴定理(Separating Axis Theorem):

牵引车和挂车分别检查碰撞(各自独立的 OBB)。在运动基元积分中每 2 步检测一次碰撞(每 0.1m)。

7. 精度与性能

场景搜索节点θ₁误差θ₂误差β终态位置误差耗时
直线倒车2,3490.48°0.26°0.22°0.25m1s
偏角倒车115,4000.34°0.17°0.17°0.21m61s
对比-重卡90,4000.25°0.06°0.19°0.21m49s
垂直入库-重卡110,3300.29°0.06°0.36°0.18m155s
窄通道-重卡 ★CasADi/IPOPT0.00°0.00°0.00°0.00m11s

所有卡车场景终态:θ₁、θ₂、β 均 < 0.5°,位置误差 < 0.25m。窄通道场景使用 CasADi/IPOPT 直接最优控制,精度达机器零。规划为离线执行,结果序列化为 JSON 内嵌于页面,浏览器端仅负责动画播放。

8. CasADi/IPOPT 直接最优控制(窄通道场景)

12 米窄通道 90° 入库是 Hybrid A* 的物理极限场景:A* 能在 300 秒内收敛角度(θ₂ 误差 < 2°),但位置偏差锁定在 11+ 米——因为离散搜索无法发现需要先向东行驶 14m 再折返的轨迹拓扑。

窄通道场景改用 CasADi/IPOPT 直接最优控制:将完整轨迹参数化为 N=120 步连续控制序列,用非线性规划求解器同时优化所有控制输入。

问题建模:

决策变量:X = [x, y, θ₁, θ₂]₀..N,U = [δ, v]₀..N₋₁
最小化:J = 0.01·Σδ²ₖ + 0.01·Σv²ₖ + 1.0·Σ(δₖ − δₖ₋₁)² + 0.5·Σ(vₖ − vₖ₋₁)²
约束:
  • 运动学方程(RK4 积分,dt = 0.35s)
  • |δ| ≤ 0.40 rad,|v| ≤ 2.0 m/s
  • y ≤ 4.5(墙约束)
  • 碰撞硬约束:max(d_left, d_right, d_below, d_above) ≥ 0 ∀ truck corners
  • 终态:(x, y, θ₁, θ₂) = (0, −6, π/2, π/2)

权重设计:转向平滑项权重(1.0)远大于转向幅值项(0.01),目标是优先保证方向盘变化平缓(乘客舒适),而非追求最短路径。速度平滑权重 0.5 次之,避免急刹急冲。

碰撞约束实现:对每个时间步,检查牵引车和挂车的 12 个关键点(4 个牵引车角点 + 沿挂车 4 个截面的左右边沿)。每个点必须位于所有障碍物 AABB 之外(含 0.4m 安全裕度)。使用 CasADi 的 fmax 算子表达析取约束(disjunctive constraint),IPOPT 在非光滑点处自动处理。

求解过程:IPOPT(Interior Point OPTimizer)使用内点法在 ~100 次迭代内收敛,总耗时 ~11 秒。初始猜测为 5 段线性插值(前向→调转→倒车→对齐→入位),IPOPT 从粗略猜测出发自动优化出最优轨迹。

关键发现:最优解为两段式轨迹——卡车先前向大弧行驶至 (14, 4) 完成方向调转(70 步),再直线倒车入位(50 步),仅 1 次方向切换。这解释了 A* 失败的原因:离散搜索在前向大弧阶段因网格分辨率不足而无法发现这条路径。

9. 参考文献