基于动态规划的路径规划和速度规划 参考apollo+的dp路径规划和速度规划

停车场里遇到直角弯道怎么过?高速上突然窜出的小动物如何避让?这些场景背后都藏着路径规划与速度规划的玄机。今天咱们撕开Apollo自动驾驶系统的冰山一角,看看动态规划(DP)这个老算法如何在现代自动驾驶里玩出花活。

先看路径规划里的横向位移计算。在Apollo的dppolypath_optimizer里,工程师们用横向偏移量构建状态空间,就像在停车场里用粉笔画出多个候选车位:

def sample_lateral_offset(self, curr_s):
    lateral_bounds = self.road_graph.get_lateral_bounds(curr_s)
    return np.linspace(lateral_bounds[0], lateral_basing_bounds[1], num=5)

这5个采样点可不是随便选的——横向0.3米间隔保证车辆不会骑线行驶,五次多项式连接则让转向更顺滑(相比三次多项式,五次能保证加速度连续)。实际跑起来,规划器会给每个候选路径打分:离障碍物太近扣分,频繁转向扣分,像极了驾校教练拿着评分表在旁边盯着。

速度规划更有意思。工程师把时间-距离图切成网格,每个网格藏着速度密码。来看这段代价计算的核心逻辑:

double SpeedCost::Calculate(const STPoint& point) const {
    double obstacle_cost = obstacle_map_->GetObstacleCost(point);
    double accel_cost = std::abs(CalculateAcceleration(point)); 
    return 0.6*obstacle_cost + 0.3*accel_cost + 0.1*CalculateJerkCost(point);
}

这里0.6的权重系数暴露了安全至上的原则——遇到障碍物宁可急刹也别硬闯。实际调试时,工程师们发现加速度权重超过0.35就会让乘客晕车,这参数可是用成百上千次实车测试换来的经验值。

动态规划最怕维度爆炸。Apollo的应对很聪明:路径规划里用横向偏移量代替笛卡尔坐标,把二维问题压成一维;速度规划里用滑动窗口只计算最近3秒的数据。就像用望远镜看星空,只聚焦关键区域。

但DP也不是万金油。去年有个案例:某测试车在施工路段突然蛇形走位。事后分析发现是动态规划的状态采样间隔太大,漏掉了突然出现的锥桶。后来团队在采样策略里加入环境复杂度自适应机制——车流密集时采样点自动加密,这才解决问题。

这种老算法的新玩法启示我们:自动驾驶不是科幻片的炫技,而是把基础算法打磨到极致的工匠活。就像用算盘也能解微积分,关键看打算盘的手有多巧。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐