(八)锥桶赛道路径规划

2023-10-18 00:30
文章标签 规划 路径 赛道 锥桶

本文主要是介绍(八)锥桶赛道路径规划,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、参考资料

  1. 三角剖分:https://blogs.mathworks.com/student-lounge/2022/10/03/path-planning-for-formula-student-driverless-cars-using-delaunay-triangulation/

  1. 贝塞尔曲线https://muzing.top/posts/6610880/

2、任务需求

在赛道进行路径规划,赛道两侧分别是红蓝锥桶,这里采用的参考资料2中的算法。

  1. PanoSim仿真中采用「目标级雷达」,直接返回目标相对于自己的相对位置,但是相机下的位置不是真实世界下的位置

  1. 同样的我们也缺乏真实的路宽,在一侧没有的时候不能移动d/2

因此如果建立在拥有真实的坐标基础上,同时车身自带定位与建图的情况下,可以直接套用算法,目前采用的方案仅仅针对两侧都有锥桶,通过分别计算两侧贝塞尔曲线然后相加。

3、测试思路

原作者文档中解释非常清楚,这里仅仅做一些小小改动

3.1 贝塞尔曲线

    red = get_traffic_cone_matrix(np.array(test_data[i]), 3)  # 左侧锥桶位置矩阵blue = get_traffic_cone_matrix(np.array(test_data[i]), 2)  # 右侧锥桶位置矩阵red_bezier = get_bezier_curve(red,25)blue_bezier = get_bezier_curve(blue, 25)#local_path = local_path_fitting(red, blue, translation_dis=1.5)  # 规划出的局部路径矩阵# 左上角为原点plt.xlim(0, 1920)plt.ylim(0, 1080)plt.gca().invert_yaxis()plt.plot(red[:, 0], red[:, 1], "o-", color="r")plt.plot(blue[:, 0], blue[:, 1], "o-", color="b")#plt.plot(local_path[:, 1] * -1, local_path[:, 0], color="k", linestyle="--")x = (red_bezier + blue_bezier[::-1])/2

这里采用了,左右两侧分别计算25个点的平均值,可以理解为中线。由于锥桶的顺序至关重要,原作者做了x方向排序,我们相加的取平均的的时候需要对一侧取反 x = (red_bezier + blue_bezier[::-1])/2,这样才能保证结果正确。

为了和原始图片保持一致,这里更改了画图原点,xy的方向。

3.2过滤点

没有采用原作者的fiter,因为相机存在畸变,实际测试中效果表现不好。因此自己尝试了两种方案。

3.2.1过滤置信度低的点

首先通过置信度进行筛选锥桶,可以看到原图的左边有很多蓝色锥桶,但是置信度低直接使用会影响结果。

将上图的坐标点抽出来单独画图,可以看出这样是无法进行规划的。

这里对yolov5 detect.py做一点小改动,在write results的时候,原来是保存归一化后的结果符合yolo数据格式。我们虚妄同时保存锥桶框最下沿中点的位置,x1,y1,x2,y2是框的两个对角点。

xx=(x1+x2)/2

yy=max(y1,y2);

因此又新开了一个txt_path2的txt,保存我们需要的最下沿中点的x,y坐标。最后将保存的点放到作者的test_data.py下

#               #Write resultsfor *xyxy, conf, cls in reversed(det):if save_txt:  # Write to filexywh = (xyxy2xywh(torch.tensor(xyxy).view(1, 4)) / gn).view(-1).tolist()  # normalized xywhline = (cls, *xywh, conf) if save_conf else (cls, *xywh)  # label formatwith open(f'{txt_path}.txt', 'a') as f:f.write(('%g ' * len(line)).rstrip() % line + '\n')x1,y1,x2,y2 = xyxyxx=(x1+x2)/2yy=max(y1,y2);line2 = (cls,xx,yy)txt_path2 = txt_path + "_"with open(f'{txt_path2}.txt', 'a') as f2:f2.write(('%g ' * len(line2)).rstrip() % line2 + '\n')

3.2.2过滤远的的点

由于左边第一列红色实际上不是当前赛道,是U型弯回来的时候左侧锥桶,因此采用距离的方法,筛掉,当然这个距离目前是自己定的,因为看起来想个圆形,所以采用(960,1300)为圆心1400000为距离剔除远的点。

traffic_cone = traffic_cone[np.lexsort(traffic_cone[:, ::-1].T)]  # 按x坐标排序cone= []for i in range(n):x=traffic_cone[i]xx=(x[0] - 960) ** 2 + (x[1] - 1600) ** 2if (x[0]-960)**2 + (x[1]-1300)**2 <= 1400000:cone.append(x)#clean_traffic_cone = filter_traffic_cone(traffic_cone)  # 剔除异常的锥桶return np.array(cone)

效果如下

4、实验结果

由于python画图不是16:9(1920,1080)的图像显示,因此通过ppt拉伸进行对比。ppt这个设置透明色会让路径多一些白点,只能凑活看一下。

这里规划线明显在左侧,应该向左打方向~

5、存在问题

5.1当一侧没有的时候就不可以了,因为没有路宽,也不知道相机内参外参无法投影(留坑后期填)

解决方法:定位建图,丢失一侧主要发生在转弯过程,如果已经转完了证明之前早就观察到了,通过建图数据进行规划。

5.2 筛选点

目前的方案都比较粗糙,如果有实际点的位置和自身状态进行筛选更好,比如根据当前的转向预测个范围在筛选。

欢迎技术交流和探讨~

这篇关于(八)锥桶赛道路径规划的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/qq_53086461/article/details/129388104
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/228967

相关文章

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

VSCode设置python SDK路径的实现步骤

《VSCode设置pythonSDK路径的实现步骤》本文主要介绍了VSCode设置pythonSDK路径的实现步骤,包括命令面板切换、settings.json配置、环境变量及虚拟环境处理,具有一定... 目录一、通过命令面板快速切换(推荐方法)二、通过 settings.json 配置(项目级/全局)三、

使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)

《使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)》字体设计和矢量图形处理是编程中一个有趣且实用的领域,通过Python的matplotlib库,我们可以轻松将字体轮廓... 目录背景知识字体轮廓的表示实现步骤1. 安装依赖库2. 准备数据3. 解析路径指令4. 绘制图形关键

如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)

《如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)》:本文主要介绍如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)问题,具有很好的参考价值,希望对大家有所帮助,如有... 目录先在你打算存放的地方建四个文件夹更改这四个路径就可以修改默认虚拟内存分页js文件的位置接下来从高级-

一文详解如何查看本地MySQL的安装路径

《一文详解如何查看本地MySQL的安装路径》本地安装MySQL对于初学者或者开发人员来说是一项基础技能,但在安装过程中可能会遇到各种问题,:本文主要介绍如何查看本地MySQL安装路径的相关资料,需... 目录1. 如何查看本地mysql的安装路径1.1. 方法1:通过查询本地服务1.2. 方法2:通过MyS

Python如何调用指定路径的模块

《Python如何调用指定路径的模块》要在Python中调用指定路径的模块,可以使用sys.path.append,importlib.util.spec_from_file_location和exe... 目录一、sys.path.append() 方法1. 方法简介2. 使用示例3. 注意事项二、imp

使用Python实现矢量路径的压缩、解压与可视化

《使用Python实现矢量路径的压缩、解压与可视化》在图形设计和Web开发中,矢量路径数据的高效存储与传输至关重要,本文将通过一个Python示例,展示如何将复杂的矢量路径命令序列压缩为JSON格式,... 目录引言核心功能概述1. 路径命令解析2. 路径数据压缩3. 路径数据解压4. 可视化代码实现详解1

Linux修改pip和conda缓存路径的几种方法

《Linux修改pip和conda缓存路径的几种方法》在Python生态中,pip和conda是两种常见的软件包管理工具,它们在安装、更新和卸载软件包时都会使用缓存来提高效率,适当地修改它们的缓存路径... 目录一、pip 和 conda 的缓存机制1. pip 的缓存机制默认缓存路径2. conda 的缓

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

Python中Windows和macOS文件路径格式不一致的解决方法

《Python中Windows和macOS文件路径格式不一致的解决方法》在Python中,Windows和macOS的文件路径字符串格式不一致主要体现在路径分隔符上,这种差异可能导致跨平台代码在处理文... 目录方法 1:使用 os.path 模块方法 2:使用 pathlib 模块(推荐)方法 3:统一使