当前位置: 首页 > news >正文

从零学习自动驾驶Lattice规划算法(下

从零学习自动驾驶Lattice规划算法(下) 轨迹采样 轨迹评估 碰撞检测 包含matlab代码实现和cpp代码实现,方便对照学习。 cpp代码用vs2019编译 依赖qt5.15做可视化 更新: 1 优化绘图 2 增加轨迹预测模块 3 增加从mat文件加载场景的功能,方便场景自定义

在自动驾驶领域,Lattice规划算法是实现智能路径规划的重要技术。今天我们接着上一篇,深入探讨轨迹采样、轨迹评估以及碰撞检测,并且为大家呈现Matlab和C++的代码实现,方便大家对照学习。

轨迹采样

轨迹采样是为了在车辆可行驶的空间中生成一系列可能的轨迹。在Matlab中,我们可以这样实现简单的轨迹采样:

% 轨迹采样参数设置 num_samples = 100; step_size = 0.1; t = 0:step_size:10; % 初始化轨迹矩阵 trajectories = zeros(length(t), num_samples); for i = 1:num_samples % 简单的多项式轨迹采样 a = rand; b = rand; c = rand; trajectories(:, i) = a * t.^2 + b * t + c; end

这里我们先设置了采样的数量numsamples和步长stepsize,然后初始化了一个轨迹矩阵trajectories。通过循环,每次生成随机的多项式系数abc,从而得到不同的轨迹。

在C++中,借助Qt框架实现轨迹采样。假设我们已经有了一个TrajectorySampler类:

#include <QVector> #include <cmath> #include <random> class TrajectorySampler { public: TrajectorySampler(int numSamples, double stepSize, double endTime) : numSamples(numSamples), stepSize(stepSize), endTime(endTime) {} QVector<QVector<double>> sampleTrajectories() { QVector<QVector<double>> trajectories; std::random_device rd; std::mt19937 gen(rd()); std::uniform_real_distribution<> dis(0.0, 1.0); for (int i = 0; i < numSamples; ++i) { double a = dis(gen); double b = dis(gen); double c = dis(gen); QVector<double> trajectory; for (double t = 0; t <= endTime; t += stepSize) { double pos = a * std::pow(t, 2) + b * t + c; trajectory.append(pos); } trajectories.append(trajectory); } return trajectories; } private: int numSamples; double stepSize; double endTime; };

在C++代码中,我们通过std::random_devicestd::mt19937实现随机数生成,同样生成一系列多项式轨迹。

轨迹评估

轨迹评估用于判断生成的轨迹是否满足自动驾驶的各种要求,比如安全性、舒适性等。下面是Matlab中的简单轨迹评估示例:

% 假设已经有了采样得到的轨迹trajectories % 定义一个简单的评估函数,这里只考虑轨迹长度 evaluateTrajectory = @(traj) sum(diff(traj).^2); evaluation_results = zeros(1, num_samples); for i = 1:num_samples evaluation_results(i) = evaluateTrajectory(trajectories(:, i)); end

这里我们定义了一个简单的评估函数evaluateTrajectory,通过计算轨迹各点间差值平方和来评估轨迹长度。

从零学习自动驾驶Lattice规划算法(下) 轨迹采样 轨迹评估 碰撞检测 包含matlab代码实现和cpp代码实现,方便对照学习。 cpp代码用vs2019编译 依赖qt5.15做可视化 更新: 1 优化绘图 2 增加轨迹预测模块 3 增加从mat文件加载场景的功能,方便场景自定义

在C++中,我们在TrajectoryEvaluator类中实现类似功能:

#include <QVector> #include <cmath> class TrajectoryEvaluator { public: static double evaluateTrajectory(const QVector<double>& traj) { double result = 0.0; for (int i = 1; i < traj.size(); ++i) { result += std::pow(traj[i] - traj[i - 1], 2); } return result; } };

碰撞检测

碰撞检测是自动驾驶规划中至关重要的环节,确保车辆行驶安全。以下是Matlab的碰撞检测示例:

% 假设车辆位置和尺寸 vehicle_x = 5; vehicle_y = 5; vehicle_width = 2; vehicle_length = 4; % 假设障碍物位置和尺寸 obstacle_x = 10; obstacle_y = 10; obstacle_width = 3; obstacle_length = 5; % 碰撞检测 is_collision = (abs(vehicle_x - obstacle_x) < (vehicle_width + obstacle_width) / 2) &&... (abs(vehicle_y - obstacle_y) < (vehicle_length + obstacle_length) / 2);

这段代码通过比较车辆和障碍物的位置及尺寸来判断是否发生碰撞。

在C++中,实现一个简单的碰撞检测函数:

#include <cmath> bool collisionDetection(double vehicleX, double vehicleY, double vehicleWidth, double vehicleLength, double obstacleX, double obstacleY, double obstacleWidth, double obstacleLength) { return (std::abs(vehicleX - obstacleX) < (vehicleWidth + obstacleWidth) / 2) && (std::abs(vehicleY - obstacleY) < (vehicleLength + obstacleLength) / 2); }

更新内容

1. 优化绘图

在Matlab中,我们可以通过设置图形属性来优化绘图,比如改变线条颜色、标记样式等:

figure; for i = 1:num_samples plot(t, trajectories(:, i), 'Color', rand(1, 3), 'LineWidth', 1.5, 'Marker', 'o'); hold on; end xlabel('Time'); ylabel('Position'); title('Sampled Trajectories'); grid on;

在C++中,借助Qt的绘图功能优化绘图。假设我们有一个TrajectoryPlotter类:

#include <QPainter> #include <QColor> class TrajectoryPlotter { public: void plotTrajectories(const QVector<QVector<double>>& trajectories, const QVector<double>& t) { QPixmap pixmap(800, 600); pixmap.fill(Qt::white); QPainter painter(&pixmap); painter.setPen(Qt::black); painter.drawText(10, 20, "Sampled Trajectories"); painter.drawLine(50, 50, 50, 550); painter.drawLine(50, 550, 750, 550); for (const auto& traj : trajectories) { QColor color = QColor::fromRgbF(qrand() / (double)RAND_MAX, qrand() / (double)RAND_MAX, qrand() / (double)RAND_MAX); painter.setPen(color); for (int i = 1; i < traj.size(); ++i) { int x1 = static_cast<int>(50 + t[i - 1] * 700 / t.back()); int y1 = static_cast<int>(550 - traj[i - 1] * 500 / 10); int x2 = static_cast<int>(50 + t[i] * 700 / t.back()); int y2 = static_cast<int>(550 - traj[i] * 500 / 10); painter.drawLine(x1, y1, x2, y2); } } pixmap.save("trajectories.png"); } };

2. 增加轨迹预测模块

在Matlab中,可以通过扩展现有的轨迹采样和评估部分来实现简单的轨迹预测:

% 假设已经有评估后的轨迹evaluation_results % 选择评估结果最好的轨迹作为预测轨迹 [~, best_index] = min(evaluation_results); predicted_trajectory = trajectories(:, best_index);

在C++中,在TrajectoryPredictor类中实现:

#include <QVector> #include <limits> class TrajectoryPredictor { public: QVector<double> predictTrajectory(const QVector<QVector<double>>& trajectories, const QVector<double>& evaluationResults) { double minResult = std::numeric_limits<double>::max(); int bestIndex = 0; for (int i = 0; i < evaluationResults.size(); ++i) { if (evaluationResults[i] < minResult) { minResult = evaluationResults[i]; bestIndex = i; } } return trajectories[bestIndex]; } };

3. 增加从mat文件加载场景的功能,方便场景自定义

在Matlab中,可以使用load函数加载mat文件:

load('scene.mat'); % scene.mat文件中假设包含车辆和障碍物的相关参数 vehicle_x = scene.vehicle_x; vehicle_y = scene.vehicle_y; % 其他参数同理加载

在C++中,需要借助第三方库来读取mat文件,比如matio库:

#include <matio.h> #include <iostream> int main() { mat_t* matfp = Mat_Open("scene.mat", MAT_ACC_RDONLY); if (matfp == NULL) { std::cerr << "Error opening mat file" << std::endl; return 1; } matvar_t* matvar = Mat_VarRead(matfp, "vehicle_x"); if (matvar!= NULL) { double vehicleX = *(double*)matvar->data; std::cout << "Vehicle X: " << vehicleX << std::endl; Mat_VarFree(matvar); } Mat_Close(matfp); return 0; }

希望通过以上Matlab和C++代码实现以及相关功能更新,能帮助大家更好地理解和学习自动驾驶Lattice规划算法。

http://www.jsqmd.com/news/610553/

相关文章:

  • Unreal Engine 插值实战:从基础Lerp到高级平滑动画
  • 独立开发者的机会:开发垂直领域的微型Agent
  • 短剧人必看!AniShort.ai:一人也能拍大片,团队协作零内耗
  • OpenClaw+Qwen3-14B镜像实战:飞书机器人自动回复配置指南
  • VLM+DOM: 打造最强Agentic RPA接管浏览器
  • 从PID到阻抗:机器人柔顺控制的模型演进与动力学角色
  • OpenClaw智能邮件处理:Qwen2.5-VL-7B解析附件图片自动回复
  • Modbus-RTU协议详解与工业通信实战技巧
  • 如何提升区域科技成果转化效率
  • .NET 9 AI推理落地全链路(含量化/编译/硬件加速):Windows/Linux/macOS三端实测对比报告
  • OpenClaw+Qwen3-4B省钱方案:自部署模型替代高价API调用
  • 性价比高的南昌实体店线上获客哪个靠谱
  • TSmaster Trace 窗口:从基础配置到高效分析的进阶指南
  • ChCore实验环境搭建全攻略:从Docker到Git分支管理避坑指南
  • LVGL窗口设计避坑指南:lv_win_create常见问题与最佳实践
  • CATIA 转 SolidWorks 高效转换技巧:迪威模型网实战解析
  • OpenClaw技能扩展指南:基于Qwen3-14B实现公众号自动发布
  • PotPlayer,Screenbox,免费苹果mac视频播放器推荐
  • 11.1面向对象基本概念-分析设计测试
  • 软考机考绘图技巧与实战指南
  • OpenClaw+Phi-3-vision无障碍应用:图片转语音助手的实现
  • 是德N5771A直流电源/keysight N5771A
  • 物联网模组测试难点 |APP指令下发+UART 响应+GPIO 电平变化,如何一次性验证?
  • AI中NLP的循环神经网络及其演进
  • Agent Harness:AI Agent 时代那个「缺失的操作系统层」
  • 7款指纹浏览器真实使用体验,告诉你最划算的选法
  • 书匠策AI:毕业论文的“智慧导航员”,让学术航行不再迷茫!
  • 【Keil实战】巧用Debug功能优化程序运行时间精度
  • 2026年4月市面上验收单元工厂,智能晨检机/社区智慧食堂/留样秤/结算台/食堂留样系统,验收单元实力厂家联系电话 - 品牌推荐师
  • OpenClaw安装 Skill 完整指南:从哪里找、怎么安装到怎么验证