news 2026/2/25 21:34:00

从零学自动驾驶lattice规划(上)--参考线,frenet标架,多项式拟合 算法详细文档说...

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从零学自动驾驶lattice规划(上)--参考线,frenet标架,多项式拟合 算法详细文档说...

从零学自动驾驶lattice规划(上)--参考线,frenet标架,多项式拟合 算法详细文档说明。 2种代码实现:matlab和c++

刚摸自动驾驶那会儿总被轨迹规划绕得头疼,直到遇见Lattice算法——这货居然能把复杂的路径拆成纵向横向两个维度来思考。今天咱们先搞明白前置知识:参考线怎么生成、Frenet坐标系究竟香在哪、多项式凭什么能拟合轨迹。手撸Matlab和C++两版代码,带你在坐标系转换的坑里爬出来。


一、参考线:车道线的灵魂骨架

没有参考线的规划就像没画线的马路,车子根本不知道往哪靠。实际项目中参考线通常由高精地图的车道中心线点序列生成,但咱们自己玩可以用三次样条插值:

Matlab暴力美学版

% 随便扔几个离散点 raw_points = [0,0; 2,1; 5,2; 7,0]; x = raw_points(:,1); y = raw_points(:,2); % 三次样条直接出平滑曲线 t = 1:0.1:length(x); ref_line = spline(x, y, t);

spline函数自动生成C2连续(加速度连续)的曲线,这对规划模块的舒适性至关重要。

C++实战版

#include <tk_spline.h> // 第三方库 vector<Point2d> raw_points = {{0,0}, {2,1}, {5,2}, {7,0}}; tk::spline s; s.set_points(raw_points.x(), raw_points.y()); // 采样时直接s(x_coord)获得y值

注意这里用到了开源的样条库,比手写矩阵求解省事得多。生成的参考线在x=3.5处的曲率变化率必须小于0.1,否则乘客会晕车——这是车企的硬指标。


二、Frenet坐标系:老司机的分割视角

笛卡尔坐标系下同时处理横向偏移和纵向距离简直要命,Frenet把这两个维度拆开处理:

!Frenet坐标系示意图

坐标系转换核心代码

function [s, d] = cart2frenet(x, y, ref_line) % 找最近参考点 [~, idx] = min(sum((ref_line - [x,y]).^2, 2)); s = cum_dist(ref_line(1:idx,:)); % 累计距离 vec_t = ref_line.tangent_at(idx); % 参考线切向 d = cross([vec_t,0], [x-ref_line.x(idx), y-ref_line.y(idx),0]); d = d(3); % 取z分量 end

这里有个魔鬼细节:计算最近点时直接用欧式距离会翻车,应该用投影到参考线的近似距离。C++版用Eigen库实现更高效:

struct FrenetConverter { const ReferenceLine& ref_line; FrenetPoint convert(const CartesianPoint& p) { auto proj = ref_line.FindProjection(p); return {proj.s, proj.l}; // l即横向偏移d } };

实际工程中要考虑参考线的方向,当车辆逆行驶方向时s坐标会减小,这时候需要做方向判断。


三、五次多项式:让轨迹丝滑的秘诀

横向规划常用五次多项式,因为它能满足位置、速度、加速度三阶约束:

d(s) = a0 + a1s + a2s² + a3s³ + a4s⁴ + a5*s⁵

Matlab拟合演示

% 起点终点约束 s0 = 0; d0 = 2; d0_dot = 0; d0_ddot = 0; s1 = 10; d1 = 0; d1_dot = 0; d1_ddot = 0; A = [s0^0 s0^1 s0^2 s0^3 s0^4 s0^5; 0 1 2*s0 3*s0^2 4*s0^3 5*s0^4; 0 0 2 6*s0 12*s0^2 20*s0^3; ... ]; % 构造6x6矩阵 b = [d0; d0_dot; d0_ddot; d1; d1_dot; d1_ddot]; coeffs = A\b; % 解线性方程组

C++暴力解方程

Eigen::MatrixXd A(6,6); Eigen::VectorXd b(6); // 填充约束条件... Eigen::VectorXd coeffs = A.colPivHouseholderQr().solve(b);

为什么不用三次多项式?因为车辆运动学模型中加速度变化率(jerk)影响舒适性,五次多项式可保证jerk连续。


下篇预告:如何把上面这些零件组装成完整的Lattice规划器,并解决轨迹冲突检测的玄学问题。代码仓库已准备好Matlab和CMake两套环境配置指南,需要的老铁评论区打个卡。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/22 23:37:34

Markdown嵌入交互式图表,增强AI博客表现力

Markdown嵌入交互式图表&#xff0c;增强AI博客表现力 在深度学习项目开发中&#xff0c;最让人头疼的往往不是模型结构设计或调参优化&#xff0c;而是环境配置——“在我机器上明明能跑”的尴尬场景屡见不鲜。尤其是当涉及PyTorch、CUDA、cuDNN等组件版本错综复杂时&#xff…

作者头像 李华
网站建设 2026/2/23 0:51:14

PyTorch-CUDA-v2.6镜像兼容性测试覆盖主流显卡

PyTorch-CUDA-v2.6镜像兼容性测试覆盖主流显卡 在深度学习项目快速迭代的今天&#xff0c;一个常见的痛点是&#xff1a;为什么代码在一个设备上跑得好好的&#xff0c;换到另一台机器就报 CUDA error 或直接无法加载 GPU&#xff1f; 这背后往往不是模型的问题&#xff0c;而是…

作者头像 李华
网站建设 2026/2/23 11:44:38

GPU算力按Token计费模式适合哪些AI应用场景?

GPU算力按Token计费模式适合哪些AI应用场景&#xff1f; 在生成式AI爆发的今天&#xff0c;企业面对的一大难题是&#xff1a;如何用合理的成本支撑一个随时可能被成千上万用户调用的大模型服务&#xff1f;如果买几块A100自建集群&#xff0c;初期投入动辄数十万元&#xff1b…

作者头像 李华
网站建设 2026/2/23 8:11:05

基于Python爬取学院师资队伍信息的设计与分析爬虫 可视化

目录已开发项目效果实现截图关于博主关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;已开发项目效果实现截图 同行可拿货,招校园代理 ,本人源头供货商 基于Python爬取学院师资队伍…

作者头像 李华
网站建设 2026/2/24 14:04:39

基于Python的猫狗宠物领养医院医院预约展示系统vue_3jseq

目录已开发项目效果实现截图关于博主关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;已开发项目效果实现截图 同行可拿货,招校园代理 ,本人源头供货商 基于Python的猫狗宠物领养医…

作者头像 李华
网站建设 2026/2/22 9:41:04

基于Python的网上书店管理系统 图书销售商城vue

目录已开发项目效果实现截图关于博主关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;已开发项目效果实现截图 同行可拿货,招校园代理 ,本人源头供货商 基于Python的网上书店管理系…

作者头像 李华