自动驾驶建图--道路边缘生成方案探讨
自动驾驶建图–道路边缘生成方案探讨
一、背景
对于自动驾驶来说,建图是必不可少的,目前主流厂商技术都在从HD到"无图"进行过渡筹备中,不过想要最终实现真正的"无图"还是有很长的一段路要走。 对于建图来说,包含了很多的道路元素,车道线,停止线,斑马线,导流属性,道路边缘以及中心线(包含引导线)等。这里,中心线的预测通常是根据轨迹,通过数学公式进行拟合,目前学术上逐渐采用模型进行预测,但是对于下游(PNC)来说,还是存在不够平滑,曲率不够精准等问题,不过这个不在本次方案讨论范围内,先忽略,以后有空可以写一写。 道路边界对于PNC来说也是至关重要,约束车辆行驶范围,避免物理碰撞发生。通常道路边界的生成有几种方法,一种是当做车道线的一部分,跟着模型一起输出,但是没有车道线的特征明显,容易漏检,而且道路边界是异形的,基于分割的方案会比基于Anchor的方案效果稳定一些。另一种是HD的方法,根据处理后的车道线,按照距离和规则等虚拟出道路边界线。本文给出一种新的解决方案,略微繁琐,但是优点是可以延用已有的公开数据集进行处理生成,快速落地验证,缺点是本方案不具备时效性,是离线的方法。
二、方案
数据集&模型 整个方案的pipline如上图所示,为了快速验证效果,所以直接采用了公开的数据集BDD100k,这个数据集主要是用于可行驶区域, 车道线以及全景分割等。它的车道线有标边线,但是没有区分类别,没办法直接用,所以采用freespace来进行验证。模型方面,理论上采用任何一个分割都可以,这里采用的是YOLOPv2, 模型提供了训练好的权重和推理脚本,输出如下所示。
YOLOPv2输出
差异性 这个数据集存在一个与建图的需求有所差异的问题,刚才提到这个方案是基于freespace做的,但是freespace是以实际能看到的边界作区分的而不是道路的边界,所以和实际建图的需求有一些diff,上面图里面能看到绿色的就是freespace的结果,被左边的车挡住了道路的边界,所以freespace就会以车辆边界作为自身的界限。如果是实时的没有什么问题,但是离线的话会产生diff,如果第一天有车,建图后,第二天发现没有车,那么可通行的范围就被压榨了。所以后续如果实际使用,需要以道路的边界作为freespace的边界线。
overview
整体方案 整个方案的pipline如上所示,对前视摄像头得到的图像进行畸变矫正后,喂进模型,输出对应的freespace,由于IPM对于边界以及远处的投影效果不好的问题,所以只选取车前15m,左右20m的范围,得到的freespace根据内外参以及自车位置投影到世界坐标系下。通过连续帧的叠加,可以生成世界坐标系下的2d点云。实际上需要的是边缘,所以还需要对点云进行处理得到道路的边缘,这里有尝试过PCL以及AlphaShape等点云处理方法,能解决部分case的提取,但是还是依赖于调参,没办法自动化处理,下面有一些bad case示例。
- 世界坐标系2d点云
2d点云
- PCL
pcl滤波+边缘提取结果
- AlphaShape
alphashape提取结果
针对上面的问题,首先对世界坐标系的点云进行投影映射,我这里设置的是1个像素表示0.05m,因为一个车道线大概15-20cm宽,所以这一点点的误差不影响反投影回去的结果。映射后,可以得到栅格的点云,由于从uv到世界坐标系转换中,远处的点会发散,所以在栅格图像中需要对其进行过滤和填充处理,处理前后如下图所示。
栅格处理
然后可以用图像处理的方法得到整个栅格图的边缘并根据映射关系反投影到世界坐标系下,根据下游的需求对矢量化的点进行稀疏采样或者插值处理,结果如下所示。
边缘处理
接下来一步,就是需要根据RTK信息来对边缘的两端进行截断(不然封闭的区域车也没发行驶),此步骤略微繁琐,逻辑简化如下: - 根据属性判断是否是直行,转弯还是掉头路口等 - 根据不同的属性,设置不同的切分逻辑 - 直行|转弯,采用双头切分,分别根据起始和终止RTK位置,通过设置距离参数来找训左右两端的切分点进行切分。 - 掉头,采用单头切分,选定起始位置后定位关键点,通过设置较长的距离来贯穿整个掉头路口,定位4个点进行切分。 - 过滤异常点,平滑处理。
切分前后效果,这里蓝色是切分后的边缘
最后,就是不断的优化和迭代的逻辑了,模型效果不好那就优化模型,逻辑不够鲁邦就优化逻辑。之前有提到数据集中的freespace不是以实际道路边缘边界区分的,所以后面还需要标数据进行模型优化。
为了验证精度是否够高,可以拼接到HD上进行对比
底图是hd提供的车道线和参考线,红色是路口的道路边界
最后的最后,PNC实际上用不了这种异形的边缘的,事实证明了,一切的一切还是要向HD看齐,所以还要根据生成的边缘来做二次约束进行曲线平滑优化处理。这里就不展开讲了,又是一个非常复杂的数学问题。
基于边缘约束优化后效果
三、结论
本方案只是提供了一种快速落地的思路,里面实际上还有很多的细节问题需要进行优化。不过基于freespace的方案相比于只去预测道路边缘的方案来说,泛化能力相对来说会强一点,同时可以一份标注数据多种用途。不过速度上需要注意,离线可以满足要求,在线实时还是要看优化的效率。
有想要交流的可以在评论区留言或者私信我
倾囊相授自动驾驶学习资料和落地经验:链接
相关文章:

自动驾驶建图--道路边缘生成方案探讨
自动驾驶建图–道路边缘生成方案探讨 一、背景 对于自动驾驶来说,建图是必不可少的,目前主流厂商技术都在从HD到"无图"进行过渡筹备中,不过想要最终实现真正的"无图"还是有很长的一段路要走。 对于建图来说,…...

图片编辑器中实现文件上传的三种方式和二进制流及文件头校验文件类型
背景 最近在 vue-design-editor 开源项目中实现 psd 等多种文件格式上传解析成模板过程中, 发现搞定设计文件上传没有使用 input 实现文件上传, 所以我研究了一下相关技术, 总结了以下三种文件上传方法 input 文件选择window.showOpenFilePicker 和 window.showDirectoryPicke…...

深度学习,CRNN+CTC和Attention OCR你更青睐哪一种?
深度学习在OCR领域的应用已经取得了瞩目的成果,而选择合适的算法对于提升OCR的识别准确率至关重要。在众多算法中,CRNN和Attention OCR犹如两颗璀璨的明珠,备受瞩目。 CRNN,这位结合了卷积神经网络(CNN)和…...

飞桨AI应用@riscv OpenKylin
在riscv编译安装飞桨PaddlePaddle参见: 算能RISC-V通用云编译飞桨paddlepaddleopenKylin留档_在riscv下进行paddlelite源码编译-CSDN博客 安装好飞桨,就可以用飞桨进行推理了。刚开始计划用ONNX推理,但是在算能云没有装上,所以最…...

在MongoDB建模1对N关系的基本方法
“我在 SQL 和规范化数据库方面拥有丰富的经验,但我只是 MongoDB 的初学者。如何建立一对 N 关系模型?” 这是我从参加 MongoDB 分享日活动的用户那里得到的最常见问题之一。 我对这个问题没有简短的答案,因为方法不只有一种,还有…...

C++基础之运算符重载(十一)
首先为什么要对运算符进行重载?因为C内置的运算符只能作用于一些基本数据类型,而对类和结构体这种自定义数据类型是不管用的。所以这时我们需要对运算符进行重新定义满足一定的运算规则。 运算符重载的三种形式 1.以普通的函数进行重载 #include <…...

初始Java篇(JavaSE基础语法)(2)(逻辑控制)
个人主页(找往期文章包括但不限于本期文章中不懂的知识点):我要学编程(ಥ_ಥ)-CSDN博客 目录 逻辑控制 顺序结构 分支结构 if语句 switch 语句 循环结构 while 循环 for 循环 do while 循环 输入输出 输出到控制台 从键盘输入 …...

家用路由器和企业路由器的区别?
一、家用路由器 家用路由器路由器交换机 它只有一个WAN口和一个LAN口,WAN口接公网一个地址,LAN口接你电脑一个IP地址,完全符合路由器的设计,而因为家里如果用了,说明要接多个电脑,那么如果还需要对每个接口…...
Gin简介(Go web基础知识)
Gin简介 https://geektutu.com/post/quick-go-gin.html我是从这个网站上面摘录的,就是做个笔记,仅分享。膜拜极客兔兔大佬 Go特性: 快速:路由不使用反射,基于Radix树,内存占用少。 中间件:HT…...
HBase的Bulk Load流程
目录 1. 数据准备 2. 文件移动 3. 加载数据 4. Region处理 5. 元数据更新 6. 完成加载 7. 清理 8. 异常处理 LoadIncrementalHFiles(也称为Bulk Load)是HBase中一种将大量数据高效导入到HBase表的机制。以下是LoadIncrementalHFiles的主要流程步…...
vue中图片替换 遇到问题
问题: 在img标签里动态绑定路径:<img v-bind:src"imgSrc" /> data里这样写是错误的:imgSrc:xx/xx.png 这样渲染的路径会有问题,导致出不来图片 解决了 是这样的 data(){return(){imgSrc:require("../…...
Android 观察者模式
在Android中,观察者模式(Observer Pattern)是一种常用的设计模式,用于在对象之间建立一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在Android开发中࿰…...

阿里云部署MySQL、Redis、RocketMQ、Nacos集群
文章目录 🔊博主介绍🥤本文内容MySQL集群配置云服务器选购CPU选择内存选择云盘选择ESSD AutoPL云盘块存储性能(ESSD) 镜像选择带宽选择密码配置注意事项 安装docker和docker-compose部署MySQL三主六从半同步集群一主二从同步集群规…...

day05-店铺营业状态设置
1. Redis入门 1.1 Redis简介 Redis 是一个基于内存的 key-value 结构数据库。Redis 是互联网技术领域使用最为广泛的存储中间件。 官网: https://redis.io 中文网: https://www.redis.net.cn/ 主要特点: 基于内存存储,读写性能高…...

哈希表(c++)
1、介绍 哈希表,也称为散列表,是一种非常高效的数据结构。它通过将键(Key)映射到数组的特定位置来快速查找、插入和删除数据。这个映射过程由哈希函数(Hash Function)完成,该函数将键转化为一个…...
C#基础-标识符命名规则
目录 1、标识符定义 2、遵循规则 3、标识符的例子 4、MSDN中英文解释 英文...

Zabbix Web界面中文汉化
要想达到上图的效果,第一步先查看 /usr/share/zabbix/assets/fonts/ [rootservice yum.repos.d]# ll /usr/share/zabbix/assets/fonts/ 总用量 0 lrwxrwxrwx. 1 root root 33 3月 23 16:58 graphfont.ttf -> /etc/alternatives/zabbix-web-font 继续查看graph…...

esp32CAM环境搭建(arduino+MicroPython+thonny+固件)
arduino ide 开发工具 arduino版本:1.8.19 arduino ide 中文设置: file >> preferences >> arduino IDE 获取 ESP32 开发环境:打开 Arduino IDE ,找到 文件>首选项 ,将 ESP32 的配置链接填入附加开发板管理网…...

Spring Boot从入门到实战
课程介绍 本课程从SpringBoot的最基础的安装、配置开始到SpringBoot的日志管理、Web业务开发、数据存储、数据缓存,安全控制及相关企业级应用,全程案例贯穿,案例每一步的都会讲解实现思路,全程手敲代码实现。让你不仅能够掌Sprin…...
Spring Boot(七十一):整合RateLimiter实现接口限流
1 简介 RateLimiter 从概念上来讲,速率限制器会在可配置的速率下分配许可证。如果必要的话,每个acquire() 会阻塞当前线程直到许可证可用后获取该许可证。一旦获取到许可证,不需要再释放许可证。 RateLimiter使用的是一种叫令牌桶的流控算法,RateLimiter会按照一定的频率…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...

基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...