autoware整体架构的分析

autoware framework

  • sensing
    • lidar driver(lidar驱动)
    • PointCloud Preprocessing(点云预处理)
    • Detection(检测)
    • GNSS (全球导航卫星系统)
    • IMU (惯性测量单元)
  • Localization(定位)
    • Pose Initializer (姿态初始化器)
    • Point Cloud Processing (点云处理)
    • NDT Scan Matching (NDT扫描匹配)
    • EKF Localizer (扩展卡尔曼滤波器定位器)
    • Gyro Odometer (陀螺仪里程计)
    • Vehicle Velocity Converter (车辆速度转换器)
    • Pose Twist Fusion (姿态扭转融合)
    • Stop Filter (停车过滤器)
    • Localization Error Monitor (定位误差监控)
  • Perception (感知)
    • Object Recognition (物体识别)
    • Obstacle Segmentation (障碍物分割)
    • Traffic Light Recognition (交通信号灯识别)
    • Occupancy Grid Map (占用栅格地图)
    • Data Fusion and Filtering (数据融合与滤波)
    • Surround Obstacle Checker (周围障碍物检查)
  • Planning (规划)
    • Mission Planner (任务规划器)
    • Behavior Path Planner (行为路径规划器)
    • Behavior Velocity Planner (行为速度规划器)
    • Freespace Planner (自由空间规划器)
    • Obstacle Planner (障碍物规划器)
  • Control (控制)
    • Trajectory Follower (轨迹跟随器)
    • Vehicle Command Gate (车辆命令闸)
    • Vehicle Interface (车辆接口)
    • Shift Control (换挡控制)

谈到自动驾驶的仿真,autoware绝对是绕不过去的对象,autoware整体是一个ros2架构下的基于高精地图的解决方案,里面很多算法也是可以进行移植然后进行使用的。接下来我们来对整体的算法进行一个考究。主要是基于官方的这个svg文件:
请添加图片描述
这里面包含了几个大的部分,我们来仔细研究一下各部分的内容。

sensing

lidar driver(lidar驱动)

雷达的驱动,获取雷达的数据并将其转为ROS可以处理的格式,sensor_msgs/PointCloud2

PointCloud Preprocessing(点云预处理)

点云的预处理,包括一下一些内容:
fix_distortion: 修正点云中的失真,确保点云数据的精度。

pointcloud_to_laserscan:将三维点云转换为激光扫描数据
pointcloud_fusion将多个雷达的数据进行融合
voxel_grid_filter:使用体素滤波对点云进行下采样,减少数量。(体素滤波是将点云划分为3D栅格,并使用每个栅格中的代表点来减少点云的数量。)
ray_ground_filter:用于区分地面和非地面点云数据,可以过滤掉地面点云,减少不必要的计算。
pointcloud_map_loader:点云地图加载,用于后续定位和感知
outlier_filter:去除点云中的离群点,提高数据的质量。
ring_outlier_filter:针对环形激光雷达的离群点过滤算法。
crop_box_filter: 进一步裁剪点云数据,只保留关心的区域内的点云数据。
concat_filter: 将两个雷达的数据进行融合。

注:有些内容是perception的。

Detection(检测)

euclidean_cluster:欧式聚类,将点云分割成不同的对象,通过检查点云中点与点之间的距离,将同一对象分割出来
shape_estimation:估计物体的尺寸和形状。对点云的聚类结果进行分析,估计长方形,圆形等、
object_association:将不同传感器的感知结果关联起来,形成统一的感知输出,这是多传感器融合的一部分,将激光雷达、摄像头等关联起来提高物体检测的准确性。

GNSS (全球导航卫星系统)

GNSS提供全球定位服务,结合其他传感器的数据,提供车辆的全球位置。

gnss_driver: 负责从GNSS传感器获取数据。
gnss_poser: 处理GNSS数据,并将其转化为ROS可以处理的格式,供定位模块使用。
pose_initializer: 该模块将GNSS的位置估计作为初始位姿,用于后续的定位任务。

IMU (惯性测量单元)

IMU可以提供车辆的加速度和角速度数据,结合其他传感器的输出,帮助估计车辆的姿态和运动状态。

imu_driver: 负责获取IMU数据,包括加速度和角速度。
imu_corrector: 利用IMU数据进行校正,修正其他传感器可能存在的误差,确保系统的准确性。
gyro_odometer: 使用IMU数据估算车辆的运动状态,如速度和位置变化。这些数据可以进一步与其他传感器的数据融合,改善车辆的定位精度。

Localization(定位)

定位主要就是处理上述的一些传感器的数据了,包含这些内容:

Pose Initializer (姿态初始化器)

pose_initializer: 负责在系统启动时初始化车辆的位置。它利用来自GNSS的数据,提供一个初始的全局位姿估计。这一步骤通常是在车辆刚启动或系统重启时进行的。HMI(人机接口)也可以通过pose_initializer_srv服务发送初始位姿。

Point Cloud Processing (点云处理)

点云数据经过一系列处理和过滤后用于位置匹配:

crop_box_filter: 剪裁点云数据,保留重要的测量区域内的数据。
voxel_grid_…: 对点云数据进行下采样,以减少计算负担,并保留关键的空间信息。
random_…: 对点云数据进行随机采样,进一步减少数据量。

NDT Scan Matching (NDT扫描匹配)

ndt_scan_matcher: 采用NDT(正态分布变换)算法,通过点云与地图数据的匹配来估计车辆的位姿。此模块输出的位姿估计将作为EKF(扩展卡尔曼滤波器)的输入,用于进一步优化位置估计。

EKF Localizer (扩展卡尔曼滤波器定位器)

ekf_localizer: 使用扩展卡尔曼滤波器,将来自不同传感器的数据融合在一起,生成高精度的位姿估计。EKF通过结合先验状态估计和传感器观测数据,优化车辆的当前位姿。
输入包括:点云匹配的位姿估计、IMU数据(通过gyro_odometer)、速度转换数据(通过vehicle_velocity_converter)等。
输出包括:融合后的位姿估计,传递给pose_twist_fusion_filter和其他模块。

Gyro Odometer (陀螺仪里程计)

gyro_odometer: 通过处理IMU数据,估算车辆的速度和角速度。这些数据进一步传递给EKF Localizer,帮助改进位姿估计。

Vehicle Velocity Converter (车辆速度转换器)

vehicle_velocity_converter: 负责将车辆状态中的速度信息转换为适合EKF处理的格式。它将车辆的速度信息与IMU数据结合,为EKF Localizer提供必要的输入。

Pose Twist Fusion (姿态扭转融合)

pose_twist_fusion_filter: 结合位姿和速度信息,进一步优化车辆的姿态估计。它使用来自EKF Localizer和Gyro Odometer的数据,生成最终的定位结果。

Stop Filter (停车过滤器)

stop_filter: 当车辆检测到停止时,停止所有定位更新,以保持车辆在静止时的位置精度。该模块主要用于确保车辆在停止时的位置不会因传感器噪声而产生漂移。

Localization Error Monitor (定位误差监控)

localization_error_monitor: 负责监控定位系统的健康状况,检测可能的误差和异常情况。它通过诊断消息提供系统状态的反馈,有助于及时发现和纠正定位系统中的问题。
其中,利用imu数据,ndt的匹配数据车辆速度数据传入EKF来估计车辆位姿是一个大的方向,这里面其实也应该有相应的不确定性。这里用这些高级滤波和匹配算法来为车辆提供精确且实时的位置信息。

Perception (感知)

Perception部分负责处理感知模块的数据,包括检测、跟踪和预测等功能。感知系统识别车辆周围的动态和静态物体,并为规划和控制模块提供环境信息。
这也是道路的实际感知方案,没想到竟然不是通过点云识别而是聚类??所以现在我也放弃这条激光雷达检测的路。

Object Recognition (物体识别)

该子模块处理物体识别的任务,通过融合来自不同传感器的数据进行物体的检测和识别。
本身分割的时候如果做不到呢?要怎么将相机和雷达的数据更好的结合呢。相机最大的问题在于数据集吗??

outlier_cropbox_filter: 通过裁剪点云数据,去除不需要的部分,从而减少计算负担。
clustering: 使用聚类算法将点云数据分组,以识别不同的物体。
voxel_grid_filter: 通过下采样减少点云数据量,同时保留重要的空间信息。
outlier_filter: 过滤掉噪声数据,进一步提高识别精度。
concat_filter: 将多个滤波后的点云数据合并,得到完整的环境表示。
euclidean_cluster: 通过欧几里得聚类算法,识别出不同的物体。
lidar_centerpoint: 使用lidar数据估算物体的中心点。
shape_estimation: 根据聚类结果估算物体的形状。
roi_cluster_fusion: 将不同传感器的数据(如激光雷达和摄像头)融合,以提高物体识别的准确性。
object_range_splitter: 将检测到的物体根据距离进行分类处理。
object_lanelet_filter: 结合地图数据,过滤出与车道相关的物体。
multi_object_tracker: 对多个检测到的物体进行跟踪,预测它们的运动轨迹。

Obstacle Segmentation (障碍物分割)

该子模块处理障碍物的分割和检测,主要通过激光雷达点云数据实现。

crop_box_filter: 剪裁点云数据以保留测量范围内的障碍物。
common: 通用处理模块,负责去除地面点云和其他非障碍物点云数据。
occupancy_grid_map: 根据点云数据生成占用栅格地图,用于表示环境中的障碍物。
probabilistic_occupancy_grid_map: 生成概率占用栅格地图,通过概率模型表示障碍物的存在。
三维的占用栅格地图,可以说是esdf和tsdf地图了。

Traffic Light Recognition (交通信号灯识别)

该子模块处理交通信号灯的识别和状态检测。

traffic_light_map_based_detector: 使用地图数据,检测并识别交通信号灯的位置和状态。
traffic_light_classifier: 对检测到的交通信号灯进行分类和状态识别。
traffic_light_roi: 根据感兴趣区域(ROI)识别交通信号灯,并生成交通信号灯状态信息。

Occupancy Grid Map (占用栅格地图)

占用栅格地图模块负责生成关于周围环境的占用状态,通常用于路径规划和避障。

occupancy_grid_map: 生成栅格地图,表示环境中不同区域的占用状态,供其他模块使用。
probabilistic_occupancy_grid_map: 通过概率模型增强栅格地图的表示能力,提供更为精确的环境表示。

Data Fusion and Filtering (数据融合与滤波)

concat_filter: 用于将不同传感器或处理结果的点云数据进行合并,以形成完整的环境表示。
shape_estimation: 从聚类后的点云数据中估计物体的形状。

Surround Obstacle Checker (周围障碍物检查)

surround_obstacle_checker: 使用来自感知模块的数据检测车辆周围的障碍物,判断是否存在碰撞风险。

Planning (规划)

规划模块负责根据感知、定位等模块提供的数据生成车辆的行驶路径。它不仅要确保路径的安全性,还要考虑到交通规则、动态障碍物、以及车辆的物理限制等因素。

Mission Planner (任务规划器)

任务规划器是规划模块的顶层组件,负责生成全局路径,包括起点和终点,以及路径上的重要路标。

mission_planner: 生成全局路径,并将其传递给下游的路径规划器。

Behavior Path Planner (行为路径规划器)

行为路径规划器负责在全局路径的基础上,生成更加具体的路径,并考虑到当前的交通环境和道路情况。

lane_following: 车辆的车道保持功能,确保车辆在车道内行驶。

lane_change: 实现车辆的变道功能。

obstacle_avoidance: 避开道路上的障碍物。

pull_over/out: 实现车辆的停靠和驶出功能。

Behavior Velocity Planner (行为速度规划器)

行为速度规划器负责根据路径规划器生成的路径,计算适当的车速。

detection_area: 识别车辆行驶路径上的目标区域。

blind_spot: 处理车辆的盲点区域。

cross_walk: 处理行人穿越道路的情况。

traffic_light: 处理红绿灯的信号。

intersection: 处理交叉路口的情况。

occlusion_spot: 处理视野受阻的区域。

no_stopping_area: 识别禁停区域。

stop_line: 处理停车线的情况。

virtual_stop_line: 处理虚拟停车线的情况。

Freespace Planner (自由空间规划器)

自由空间规划器用于停车或在没有明确道路标记的区域内进行路径规划。

freespace_planner: 生成停车路径或自由区域内的路径。

costmap_generator: 生成用于路径规划的代价地图。

Obstacle Planner (障碍物规划器)

障碍物规划器专注于处理障碍物的相关问题,确保车辆能够安全绕过障碍物。

surround_obstacle_checker: 检查车辆周围的障碍物。

external_velocity_limit: 根据外部因素(如道路标志、行人)限制车辆速度。

obstacle_stop: 实现车辆在遇到障碍物时的紧急停车。

scenario_selector: 根据不同的场景选择适合的规划算法。

motion_velocity_optimizer: 优化车辆的速度和加速度,使其与路径匹配。

我之前学习过move_base的导航栈,这个更像是实际车辆的一个规控架构,所以需要重新升级一下之前的内容,主要包含的也是全局和局部规划——也就是任务规划,行为路径规划
同时独立出来了行为速度规划,并且对于自由空间也有一套规划器,最后是障碍物的规划器。一共5个规划器来完成这些内容,至于地图类型,则是暂时以栅格和esdf、tsdf地图为主,有这样提前建立的地图,然后能够根据mpc来规划,同时也是通过mpc来控制。由于mpc包揽规控,尤其是局部规划器,所以把它称为了规控一体设计。
并且仿照之前的感知,也有很多其他的工作可以进行延伸的。

Control (控制)

控制模块负责将规划模块生成的路径和速度指令转化为具体的车辆控制命令。这些命令包括转向角、加速度、制动等,最终实现车辆的安全行驶。

Trajectory Follower (轨迹跟随器)

轨迹跟随器模块负责将规划好的路径和速度转化为具体的控制命令。

lateral_controller: 横向控制器,负责控制车辆的转向角,使其沿着规划的路径行驶。

longitudinal_controller: 纵向控制器,负责控制车辆的加速度和制动,使其保持在规划的速度范围内。

latlon_muxer: 负责将横向和纵向控制器的输出合并为最终的控制命令。

lane_departure: 检测车辆是否偏离车道,并发出相应的控制命令以纠正车辆的行驶方向。

shift_decider: 决定车辆的换挡操作,根据当前的行驶状态调整变速器的挡位。

Vehicle Command Gate (车辆命令闸)

车辆命令闸模块负责将各个控制模块的输出进行协调,并将最终的控制命令发送给车辆接口。

vehicle_cmd_gate: 汇总各个控制模块的输出,并根据优先级或其他条件决定最终的车辆控制命令。

Vehicle Interface (车辆接口)

车辆接口模块负责将来自控制模块的命令转化为车辆硬件能够理解的信号。

vehicle_interface: 负责与车辆的底层硬件进行通信,将控制命令发送到车辆的执行机构,如转向系统、制动系统、和加速系统。

accel_map_calibrator: 负责加速踏板的标定,确保加速命令能够准确地转换为车辆的加速度。

raw_vehicle_cmd: 处理未经处理的车辆命令,并将其转换为车辆能够执行的格式。

external_velocity: 接收外部速度限制命令并应用到车辆控制中。

Shift Control (换挡控制)

换挡控制模块负责根据车辆的状态和行驶情况,自动控制变速器的档位。

shift_decider: 根据车辆的速度、加速度等因素决定是否需要换挡,并发出相应的指令。
还有一些车辆和系统,以及hmi的内容,这里就先不讨论了。一个优秀的架构是有这指点江山的作用的,目前我能接触到的顶级的设计应该也就只能到这里了,接下来就是模仿和创新的过程了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/52830.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

#Datawhale X 李宏毅苹果书 AI夏令营#1.2了解线性模型

1.2线性模型 什么是线性模型? 初始模型:, 其中y表示观看人数,x1表示前一天的观看人数,这个模型就是在用前一天的观看人数来预测当前的观看人数。 模型改进: 然而真实的数据是有周期性的,每隔7天&#…

这本大模型书一定要读!李开复、周鸿祎都强烈推荐的《实战AI大模型》(附PDF)

《实战AI大模型》是一本旨在填补人工智能(AI)领域(特别是AI大模型)理论与实践之间鸿沟的实用手册。书中介绍了AI大模型的基础知识和关键技术,如Transformer、BERT、ALBERT、T5、GPT系列、InstructGPT、ChatGPT、GPT 4、…

无人机之云台的作用

无人机云台在无人机技术中扮演着至关重要的角色,其作用主要体现在以下几个方面: 一、 确保拍摄稳定性 防抖动:无人机在飞行过程中,尤其是在复杂环境下,如遇到风力干扰或进行高速飞行时,机身容易产生震动和…

Prometheus+Grafana的安装和入门

概念 什么是Prometheus? Prometheus受启发于Google的Brogmon监控系统(相似kubernetes是从Brog系统演变而来), 从2012年开始由google工程师Soundclouds使用Go语言开发的开源监控报警系统和时序列数据库(TSDB)。,并且与2015年早起…

【Linux —— POSIX信号量 - 基于环形队列的生产消费模型】

Linux —— POSIX信号量 - 基于环形队列的生产消费模型 POSIX信号量信号量的概念POSIX信号量的类型信号量的操作 POSIX信号量函数基于环形队列的生产消费模型设计思路同步和安全性代码 POSIX信号量 信号量的概念 POSIX信号量是一种用于进程和线程之间同步的机制,主…

【netty系列-08】深入Netty组件底层原理和基本实现

Netty系列整体栏目 内容链接地址【一】深入理解网络通信基本原理和tcp/ip协议https://zhenghuisheng.blog.csdn.net/article/details/136359640【二】深入理解Socket本质和BIOhttps://zhenghuisheng.blog.csdn.net/article/details/136549478【三】深入理解NIO的基本原理和底层…

数据结构(邓俊辉)学习笔记】串 16——Karp-Rabin算法:串即是数

文章目录 1. 化串为数2. 凡物皆数3. 亦是数 1. 化串为数 接下来的这节,我们再来讨论一种十分另类的串匹配算法,也就是所谓的 Karp-Rabin 算法。回顾此前所介绍的几种串匹配算法,我们所面临的难题是一样的。也就是说在这里,我们每次…

Windows 10/11降级漏洞的工具包现已发布 仅供安全测试

早前有研究人员在分析 Windows 10/11 更新机制时发现微软虽然已经考虑到潜在的安全问题增加了各种限制,但还是存在失误因此存在弱点,研究人员则通过该弱点成功降级了系统。通过该漏洞不仅可以成功降级系统,同时系统还会认为自己已经完成更新并…

Java面试题·区别题·JavaSE部分

系列文章目录 总章 Java区别题 文章目录 系列文章目录前言private/默认/protected/public权限修饰符的区别&和&&区别和联系,I和II区别和联系if和switch的不同之处和equals的区别和联系数组做形参和可变参数做形参联系和区别接口和抽象类的异同之处面向…

嵌入式day36

数据库 专业存储数据、大量数据 数组、链表、变量---->内存:程序运行结束、掉电数据丢失 文件---->硬盘:程序运行结束、掉电数据不丢失 数据库---->硬盘 数据库文件与普通文件区别: 1.普通文件对数据管理(增删改查…

Linux入门攻坚——30、sudo、vsftpd

su:Switch User,即切换用户 su [-l user] -c ‘COMMAND’ 如:su -l root -c ‘COMMAND’ 如果没有指定-l user,则默认是root sudo:可以让某个用户不需要拥有管理员的密码,而可以执行管理员的权限。 需…

基于RS232的VGA显示

前言 基于ROM的VGA显示缺点:需要将图片转化为mif文件,使用的RAM是FPGA内部RAM模拟出来的,占用资源大切换显示图片需要重新转化,对ROM进行写入,使用极不方便,因此这里采用RS232进行VGA显示。 正文 一、基于…

代码随想录Day 28|题目:122.买卖股票的最佳时机Ⅱ、55.跳跃游戏、45.跳跃游戏Ⅱ、1005.K次取反后最大化的数组和

提示:DDU,供自己复习使用。欢迎大家前来讨论~ 文章目录 题目题目一:122.买卖股票的最佳时机 II贪心算法:动态规划 题目二:55.跳跃游戏解题思路: 题目三: 45.跳跃游戏 II解题思路方法一方法二 题…

鸿蒙开发入门day15-焦点事件

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,还请三连支持一波哇ヾ(@^∇^@)ノ) 目录 焦点事件 基础概念与规范 基础概念 走焦规范 走焦算法 获焦/失…

【逐行注释】MATLAB下的UKF(无迹卡尔曼滤波),带丰富的中文注释,可直接复制到MATLAB上运行,无需下载

文章目录 程序组成部分完整代码运行结果主要模块解读:运动模型绘图部分误差统计特性输出程序组成部分 由模型初始化、运动模型、UKF主体部分、绘图代码和输出部分组成: 完整代码 将下列代码复制粘贴到MATLAB里面,即可运行: % 三维状态量的UKF例程 % 作者联系方式:微信…

安全面试常见问题任意文件下载

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 1.1 任意文件下…

培训第三十九天(了解docker-compose,docker-compose编排容器,配置harbor服务)

一、回顾 1、拉取私有仓库镜像 # 配置dockerdocker pull 10.0.0.10:5000/centosnginx:v0 2、容器网络类型 brideg(net) default# docker启动之后会生成新的虚拟网卡,网卡的名称docker0# 网段默认是172.17.0.1# 所有的容器都桥接docker0,通过桥接共享网…

LRN正则化是什么?

LRN正则化,全称为Local Response Normalization(局部响应归一化),是一种在深度学习,特别是在卷积神经网络(CNN)中常用的正则化技术。该技术旨在通过模拟生物视觉系统中的侧抑制现象,…

OpenLayers3, 设置地图背景

文章目录 一、前言二、代码实现三、总结 一、前言 本文基于OpenLayers3&#xff0c;实现地图加入背景图的功能。 二、代码实现 <!DOCTYPE html> <html xmlns"http://www.w3.org/1999/xhtml"> <head><meta http-equiv"Content-Type"…

QT学习ubuntu qt + desktop

环境搭建 ubuntu 安装QT 遇到kit 选择不了 通过sudo apt-get install qt5-default去安装SDK的时候报错&#xff1a; Package qt5-default is not available, but is referred to by another package. This may mean that the package is missing, has been obsoleted, or is …