自动驾驶中泊车算法学习记录

‍作者 | Sean  编辑 | 汽车人

原文链接:https://zhuanlan.zhihu.com/p/663742537

点击下方卡片,关注“自动驾驶之心”公众号

ADAS巨卷干货,即可获取

点击进入→自动驾驶之心【自动泊车】技术交流群

本文只做学术分享,如有侵权,联系删文

自动驾驶泊车算法学习记录

Introduction

最近在学习自动驾驶泊车方面的算法,看的论文主要有以下三篇,分别是Path Planning for Autonomous Vehicles in Unknown Semi-structured Environments, DL-IAPS and PJSO: A Path/Speed Decoupled Trajectory Optimization and its Application in Autonomous Driving, Speed Profile Planning in Dynamic Environments via Temporal Optimization

Path Planning for Autonomous Vehicles in Unknown Semi-structured Environments

这篇论文应该只要是学习Hybrid Astar的人都看过,主要讲的是在开放空间搜索泊车路径,第一步先搜索出一条大概满足运动学约束的路径,然后密集插值,在进一步采用CG算法优化平滑度,保持原来关键的位置不变,这样也不用害怕碰撞了,这篇论文进一步求路径点对应的速度

DL-IAPS and PJSO: A Path/Speed Decoupled Trajectory Optimization and its Application in Autonomous Driving

这篇论文是逻辑上和上一篇论文挺像的, 先搜索一条路径,然后对路径点进一步平滑,这个论文平滑的时候会采用一个信赖半径, 发生碰撞了就缩小关键点的可移动范围, 除此之外DL-IAPS and PJSO还求解了路径的速度,这是比较牛逼的,但我看不太懂- -,后续有机会再进一步研究

Speed Profile Planning in Dynamic Environments via Temporal Optimization

我觉得路径和速度解耦求解的还可以看这篇伯克利的论文, 这篇论文是默认已经有一条光滑的路径,然后对时间变量优化,最后求解出路径点的速度,加速度,我复现了下发现这个方法会很容易收到路径点是否平滑的影响(曲率连续),如果路径点不够平滑,求解出来的速度也不好,这里论文没有说这个问题。

Idea

我看传统的泊车方法好像都需要先搜索出一条路径,然后再作进一步的处理,我觉得Hybrid Astar的搜索速度非常依赖于地图分辨率,分辨率小了就会很慢,大了就没法精确避障了, 如果直接使用一条直线段连接成的路径作为参考线,不用搜索的结果了,然后对这个直线段采用最优化的方案进行求解效果会如何。TEB就是直接对直线段进行优化,并且也实现了car-like方面的路径规划, 于是我去下载了源码然后跑了一下,发现效果不太好,速度很慢, 很容易出现无解的情况, 我觉得可能是因为TEB还多了一个时间变量需要处理,时空联合规划很容易失败,如果我把这个时间给去掉,在进行优化的话效果会不会就不一样了?

Method

33606eef9e0befe14587b2e60122683b.png

kinematic cost function

64746bd5933e10a43f401a2d4456075d.png

nonholonomic constraint

9508fc425e928406dab031d1ac5095a7.png

safety constraint

04d059a4a98c9afbb09c8e310db01529.png

vehicle with trailer kinematic 参考文献

d533a3859f3316d7fdca413271bbfe4a.png
挂车模型图
004d412b7155ccba8da3786e457a0ff4.png 9634742049bb441e3a4c5d6e663e2424.png

code

代码方面就是把TEB的代价函数复制过来就可以了,优化器改成ceres-solver的, 车辆模型,我不仅实现了汽车模型,还顺带在卡车模型啥也测试了一波。

Result

测试模型包含阿克曼汽车模型以及vehicle with trailer模型, 图中阿克曼就是用一个矩形来描述,卡车模型则用两个矩形来描述,小个的是车头,长条的是车厢(用c++画的图,很简陋- -),绿色框是辅助划线的可以不用管, 其他的多边形则为障碍物,

我以为测试结果会很差,结果还是有点出乎意料的,虽然有的时候会出现无解,但是只要初始线段给的好一点就不会出问题,优化的速度也挺快平均时间大概是0.3s, 路径的质量的评价我觉得主要是看平滑度和曲率大小,只要曲率不会超过车辆最小转弯半径就可以了, 这里我设置的曲率最大是0.155, 列了几组测试图,第一个是直线段参考线和优化后的路径图,第二幅是对应的曲率和航向

  • Test1

f6f0ff67613a1d1f41f031b639fdd39d.png
reference_path(left), optimized path(right)
6323afdfbd2e3ac3964373a9160e48f4.png
path curvature(left), path heading(right)
  • Test2

5555428f42076bb4b8fb9610ef8bcc09.png
reference_path(left), optimized path(right)
c8d2d18dd7a377c7740f199116aceee1.png
path curvature(left), path heading(right)
  • Test3

d8b89aa6dd173c20f74ae93493bca5c1.png
reference_path(left), optimized path(right)
d94cfe0d25a2f3994fd1cdb70f37a533.png
path curvature(left), path heading(right)
  • Test4

2493877aec4716344bb1b24f15993c2b.png
reference_path(left), optimized path(right)
3b5eafed13ba2d2cd5081dfe22f93cd6.png
path curvature(left), path heading(right)
  • Test6

3d0f817f3dcd9a46307ccd0b0d2667ce.png
reference_path(left), optimized path(right)
7a4b5ad002420622260c4103e1fde79d.png
path curvature(left), path heading(right)


problem

  1. 路径点的间隔不能小,否则优化时间和质量都会受到影响,这个我觉得后期可以参考上述论文,先优化出一条大概得解,然后再密集插值进一步平滑

  2. 参数初始化的好坏也会影响到求解结果

  3. 曲率不连续,虽然路径点曲率都满足要求了,但是曲率还是存在突变

  4. 倒车次数比较多

① 全网独家视频课程

BEV感知、毫米波雷达视觉融合多传感器标定多传感器融合多模态3D目标检测点云3D目标检测目标跟踪Occupancy、cuda与TensorRT模型部署协同感知语义分割、自动驾驶仿真、传感器部署、决策规划、轨迹预测等多个方向学习视频(扫码即可学习

cd0a8446543d161794651acdf8b9908d.png 视频官网:www.zdjszx.com

② 国内首个自动驾驶学习社区

近2000人的交流社区,涉及30+自动驾驶技术栈学习路线,想要了解更多自动驾驶感知(2D检测、分割、2D/3D车道线、BEV感知、3D目标检测、Occupancy、多传感器融合、多传感器标定、目标跟踪、光流估计)、自动驾驶定位建图(SLAM、高精地图、局部在线地图)、自动驾驶规划控制/轨迹预测等领域技术方案、AI模型部署落地实战、行业动态、岗位发布,欢迎扫描下方二维码,加入自动驾驶之心知识星球,这是一个真正有干货的地方,与领域大佬交流入门、学习、工作、跳槽上的各类难题,日常分享论文+代码+视频,期待交流!

f3070b7583d1fdabaa7911855ee132a4.png

③【自动驾驶之心】技术交流群

自动驾驶之心是首个自动驾驶开发者社区,聚焦目标检测、语义分割、全景分割、实例分割、关键点检测、车道线、目标跟踪、3D目标检测、BEV感知、多模态感知、Occupancy、多传感器融合、transformer、大模型、点云处理、端到端自动驾驶、SLAM、光流估计、深度估计、轨迹预测、高精地图、NeRF、规划控制、模型部署落地、自动驾驶仿真测试、产品经理、硬件配置、AI求职交流等方向。扫码添加汽车人助理微信邀请入群,备注:学校/公司+方向+昵称(快速入群方式)

0ff3a9881ad797728ff8bac2f523aad7.jpeg

④【自动驾驶之心】平台矩阵,欢迎联系我们!

3212d6ec346f117ddaa18193ca75e028.jpeg

### 全景自动驾驶算法实现原理 全景自动驾驶涉及多种关键技术,包括但不限于交通信号灯识别、自主代客泊车以及汽车360影像技术。以下是这些技术的具体实现原理: #### 1. **交通信号灯识别** 交通信号灯识别是自动驾驶系统中的重要模块之一。该系统的实现依赖于卷积神经网络(CNN),这是一种专门用于图像分类和目标检测的深度学习模型[^1]。 - 数据预处理阶段:收集并标注大量交通信号灯图片数据集,将其分为训练集和测试集。 - 模型构建阶段:采用经典的 CNN 架构(如 VGG 或 ResNet)来提取特征,并通过全连接层进行分类预测。 - 训练与优化阶段:利用反向传播算法调整权重参数,最小化损失函数值以提高模型准确性。 ```python import tensorflow as tf from tensorflow.keras import layers, models def create_cnn_model(input_shape=(64, 64, 3), num_classes=3): model = models.Sequential() # 添加卷积层 model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=input_shape)) model.add(layers.MaxPooling2D((2, 2))) model.add(layers.Conv2D(64, (3, 3), activation='relu')) model.add(layers.MaxPooling2D((2, 2))) model.add(layers.Flatten()) model.add(layers.Dense(128, activation='relu')) # 输出层 model.add(layers.Dense(num_classes, activation='softmax')) return model ``` 上述代码展示了如何创建一个简单的 CNN 模型来进行交通信号灯分类任务。 --- #### 2. **自主代客泊车(AVP)** 自主代客泊车是一种高级别的自动驾驶功能,主要特点是在无驾驶员的情况下完成停车操作[^2]。 - 环境感知部分:借助激光雷达、超声波传感器等设备获取周围障碍物的距离信息;同时结合高精地图定位车辆位置。 - 路径规划环节:根据当前状态计算最优行驶路径,在避开其他物体的同时找到合适的停车位。 - 控制执行过程:发送指令给底盘控制系统调节方向盘角度、油门踏板力度等动作直至完全停下。 由于 AVP 的复杂度较高,这里仅给出伪代码框架示意逻辑流程: ```pseudo function AutonomousValetParking(vehicle_state, environment_data): while not parked: perception_results <- ProcessPerception(environment_data) if ObstacleDetected(perception_results): AdjustPathToAvoidObstacles() potential_parking_spots <- FindAvailableSpots(perception_results) target_spot <- SelectBestSpot(potential_parking_spots) trajectory <- PlanTrajectory(vehicle_state, target_spot) ExecuteControlCommands(trajectory) ``` 此段描述概括了整个自主代客泊车的核心思路。 --- #### 3. **汽车360影像** 为了增强驾驶安全性,许多现代车型配备了环视监控系统——即所谓的“鸟瞰图”。这项服务通常由四个广角摄像机组成,分别安装在车身四周的不同部位上采集画面后再拼接成一幅无缝衔接的大范围视野效果图象[^3]。 具体步骤如下: - 图像捕捉:每台相机负责记录特定方向上的场景; - 几何校正:消除鱼眼镜头带来的畸变现象; - 像素映射:将二维平面投影转换至三维空间坐标系下表示; - 合并渲染:最后把修正后的片段组合起来形成最终产物供显示使用。 下面是一份简化版 Python 实现方案示例: ```python import cv2 import numpy as np def undistort_image(image, camera_matrix, dist_coeffs): h, w = image.shape[:2] newcameramtx, roi = cv2.getOptimalNewCameraMatrix(camera_matrix, dist_coeffs, (w,h), 1, (w,h)) dst = cv2.undistort(image, camera_matrix, dist_coeffs, None, newcameramtx) x, y, w, h = roi return dst[y:y+h, x:x+w] def stitch_images(images, homographies): result = images[0].copy() for img, H in zip(images[1:], homographies): warped_img = cv2.warpPerspective(img, H, (result.shape[1], result.shape[0])) result = cv2.addWeighted(result, 0.5, warped_img, 0.5, 0) return result # 加载预先标定好的参数文件 camera_params = load_camera_parameters('calibration.json') front_view = cv2.imread('front.jpg') left_view = cv2.imread('left.jpg') right_view = cv2.imread('right.jpg') rear_view = cv2.imread('rear.jpg') views = [front_view, left_view, right_view, rear_view] corrected_views = [] for i, view in enumerate(views): corrected_views.append(undistort_image(view, camera_params['K'][i], camera_params['dist'][i])) homography_matrices = compute_homographies(corrected_views) final_stitched_image = stitch_images(corrected_views, homography_matrices) cv2.imwrite('panoramic_output.png', final_stitched_image) ``` 以上脚本完成了从原始素材到合成结果的整体流水线作业。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值