(八)锥桶赛道路径规划

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 筛选点

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

欢迎技术交流和探讨~

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



http://www.chinasem.cn/article/228967

相关文章

hdu2544(单源最短路径)

模板题: //题意:求1到n的最短路径,模板题#include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#i

动态规划---打家劫舍

题目: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 思路: 动态规划五部曲: 1.确定dp数组及含义 dp数组是一维数组,dp[i]代表

poj 1734 (floyd求最小环并打印路径)

题意: 求图中的一个最小环,并打印路径。 解析: ans 保存最小环长度。 一直wa,最后终于找到原因,inf开太大爆掉了。。。 虽然0x3f3f3f3f用memset好用,但是还是有局限性。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#incl

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同

poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111

poj 2976: 题意: 在n场考试中,每场考试共有b题,答对的题目有a题。 允许去掉k场考试,求能达到的最高正确率是多少。 解析: 假设已知准确率为x,则每场考试对于准确率的贡献值为: a - b * x,将贡献值大的排序排在前面舍弃掉后k个。 然后二分x就行了。 代码: #include <iostream>#include <cstdio>#incl

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

代码随想录冲冲冲 Day39 动态规划Part7

198. 打家劫舍 dp数组的意义是在第i位的时候偷的最大钱数是多少 如果nums的size为0 总价值当然就是0 如果nums的size为1 总价值是nums[0] 遍历顺序就是从小到大遍历 之后是递推公式 对于dp[i]的最大价值来说有两种可能 1.偷第i个 那么最大价值就是dp[i-2]+nums[i] 2.不偷第i个 那么价值就是dp[i-1] 之后取这两个的最大值就是d

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【408DS算法题】039进阶-判断图中路径是否存在

Index 题目分析实现总结 题目 对于给定的图G,设计函数实现判断G中是否含有从start结点到stop结点的路径。 分析实现 对于图的路径的存在性判断,有两种做法:(本文的实现均基于邻接矩阵存储方式的图) 1.图的BFS BFS的思路相对比较直观——从起始结点出发进行层次遍历,遍历过程中遇到结点i就表示存在路径start->i,故只需判断每个结点i是否就是stop

Android Environment 获取的路径问题

1. 以获取 /System 路径为例 /*** Return root of the "system" partition holding the core Android OS.* Always present and mounted read-only.*/public static @NonNull File getRootDirectory() {return DIR_ANDR