autoware framework
谈到自动驾驶的仿真,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的内容,这里就先不讨论了。一个优秀的架构是有这指点江山的作用的,目前我能接触到的顶级的设计应该也就只能到这里了,接下来就是模仿和创新的过程了。