Tip: 如果你在进行深度学习、自动驾驶、模型推理、微调或AI绘画出图等任务,并且需要GPU资源,可以考虑使用Compshare的GPU算力云平台。他们提供高性价比的4090 GPU,按时收费每卡2.6元,月卡只需要1.7元每小时,并附带200G的免费磁盘空间。通过链接注册并联系客服,可以获得20元代金券(相当于6-7H的免费GPU资源)。欢迎大家体验一下~
0. 引言
Autoware的整体框架和模块主要包括感知和规划两大部分。其中autoware.ai是ros1,安装可以参照古月老师的博客《Autoware.ai的安装、配置与测试(Docker & 源码编译)》,autoware.auto是ros2版本,安装可以参照古月老师的博客《Autoware.auto的安装、配置与测试(Docker版)》。现在的autoware已经改动很大了,放在了autoware.universe中。Autoware分为Autoware.core 和Autoware.universe 两个版本,其中Autoware.core 是稳定版,Autoware.universe 是开发者版本。
感知包括定位模块,检测模块,预测模块。定位模块使用3D map和SLAM算法来实现,辅助以GNSS和IMU传感器。检测模块使用摄像头和激光雷达,结合传感器融合算法和深度学习网络进行目标检测。预测模块使用定位和检测的结果来预测跟踪目标。
规划模块主要是基于感知的输出结果,进行全局路径规划和局部路径规划。全局路径规划在车辆启动或重启的时候被确定,局部路径根据车辆的状态进行实时更新。例如,如果车辆在障碍物前或停止线前,车辆状态变为“stop”,那么车辆的速度就被规划为0。如果车辆遇到一个障碍物且状态为“avoid”,那么局部跟踪路径就会被重新规划绕过障碍物。主要模块如下所示,通过这个图我们可以一点点剖析整个代码的逻辑结构:
1. Localization(定位)
- ekf_localizer 扩展卡尔曼滤波定位器通过将二维车辆动力学模型与输入的自我姿态和自我扭矩信息进行整合,估计出鲁棒且噪音较小的机器人姿态和扭矩。该算法专门为快速移动的机器人设计,例如自动驾驶系统。
- gyro_odometer 是一个通过结合惯性测量单元和车辆速度来估计扭矩的软件包。
- initial_pose_button_panel 是一个用来向定位模块发送请求,计算当前自车位姿的软件包。
- localization_error_monitor 是一个用于诊断定位错误的软件包,通过监测定位结果的不确定性来实现。
- ndt_scan_matcher 是一个使用NDT扫描匹配方法进行位置估计的软件包。
- pose_initializer 是一个用来向ekf_localizer发送初始姿态的包。它接收来自GNSS/用户的粗略估计的初始姿态。将姿态传递给ndt_scan_matcher,并通过服务从ndt_scan_matcher获取计算出的自我姿态。最后,它将初始姿态发布到ekf_localizer。该节点依赖于地图高度拟合库。
- pose_instability_detector 包括一个节点,旨在监测 /localization/kinematic_state 的稳定性,该主题是扩展卡尔曼滤波器(EKF)的输出。
- pose2twist 节点从输入的姿态历史中计算出速度。除了计算出的twist之外,该节点还输出线性-x和角度-z分量作为浮点消息,以简化调试工作。
- stop_filter 当这个功能不存在时,每个节点都使用不同的标准来确定车辆是否停止,导致一些节点在停车模式下运行,而另一些节点继续以驾驶模式运行。
- tree_structured_parzen_estimator 是一个用于黑盒优化的软件包
- twist2accel 该软件包负责利用ekf_localizer的输出来估计加速度。它使用低通滤波器来减轻噪音
- YabLoc 是基于视觉的定位系统,配备矢量地图。它通过将从图像中提取的道路标线与矢量地图进行匹配来估计位置。不需要使用点云地图和激光雷达技术。YabLoc 能够使未配备激光雷达的车辆在无点云地图的环境中进行定位。
2. Detection(识别)
- bytetrack 核心算法名为ByteTrack,主要旨在进行多目标跟踪。由于该算法将几乎所有检测框(包括得分较低的框)进行关联,预计使用该算法可以减少假阴性的数量。
- compare_map_segmentation 是一个节点,通过使用地图信息(例如pcd、高程图或从map_loader接口中分割地图点云)来过滤输入点云中的地面点。
- crosswalk_traffic_light_estimator 是一个模块,它从高清地图和检测到的车辆交通信号中估计行人交通信号。
- detected_object_feature_remover 是一个用于将话题类型从DetectedObjectWithFeatureArray转换为DetectedObjects的软件包
- detected_object_validation 这个软件包的目的是消除检测到的物体中明显的误报。
- detection_by_tracker 该软件包将跟踪的物体反馈给检测模块,以保持其稳定性并持续检测物体
- elevation_map_loader 该软件包提供了用于比较地图分割的高程图
- euclidean_cluster 欧几里德聚类是一种将点云分成较小部分以分类对象的软件包。该软件包包含两种聚类方法:欧几里德聚类和基于体素网格的欧几里德聚类。
- front_vehicle_velocity_estimator 这个软件包包含了一个用于离线感知模块分析的前车速度估计。该软件包可以将来自激光雷达点云的速度估计附加到3D检测中的速度信息上
- ground_segmentation 是一个节点,它从输入点云中移除地面点
- heatmap_visualizer 是一个用于在BEV空间上可视化检测到的3D物体位置热图的软件包。该软件包用于对检测器进行定性评估和趋势分析,也就是说,例如,热图显示“该检测器在我们车辆附近表现良好,但在远处表现不佳”。
- image_projection_based_fusion 是一个用于融合图像和3D点云或障碍物(边界框、聚类或分割)中检测到的障碍物的软件包。
- lidar_apollo_instance_segmentation 该节点基于基于CNN的模型和障碍物聚类方法,将来自激光雷达传感器的3D点云数据分割为障碍物,例如汽车、卡车、自行车和行人。
- lidar_apollo_segmentation_tvm && lidar_apollo_segmentation_tvm_nodes 一种替代欧几里得聚类的方法。该节点利用神经网络从点云中检测和标记前景障碍物(例如汽车、摩托车、行人)
- lidar_centerpoint_tvm &&lidar_centerpoint 是一个用于检测动态三维物体的软件包
- multi_object_tracker 检测结果通过时间序列进行处理。主要目的是为了提供ID和估计速度
- object_merger 是一个用于通过数据关联合并来自两种方法的检测到的物体的软件包。
- object_range_splitter 是一个用于根据物体与原点的距离将检测到的物体分成两个消息的软件包。
- occupancy_grid_map_outlier_filter 这个节点是基于占据栅格地图的异常值过滤器。根据占据栅格地图的实现方式,它可以被称为时间序列中的异常值过滤器,因为占据栅格地图表达了时间序列中的占据概率。
- probabilistic_occupancy_grid_map 该软件包输出障碍物存在的概率,以占据栅格地图的形式呈现
- radar_fusion_to_detected_object 该软件包包含一个用于雷达检测到的物体和3D检测到的物体的传感器融合模块。融合节点可以在成功匹配雷达数据时,将速度信息附加到3D检测结果上。跟踪模块使用速度信息来增强跟踪结果,而规划模块则使用它来执行自适应巡航控制等动作。
- radar_tracks_msgs_converter 这个软件包将从radar_msgs/msg/RadarTracks转换为autoware_auto_perception_msgs/msg/DetectedObject和autoware_auto_perception_msgs/msg/TrackedObject。
- shape_estimation 该节点根据标签计算出一个精确的物体形状(边界框、圆柱体、凸包),以适应点云聚类。
- tensorrt_yolo && tensorrt_yolox 该软件包基于YOLO(You only look once)模型,可以在图像上检测目标物体(如汽车、卡车、自行车和行人)的2D边界框
- traffic_light_classifier 是一个用于使用交通灯周围的裁剪图像进行交通灯标签分类的软件包。该软件包包含两个分类器模型:cnn_classifier和hsv_classifier。
- traffic_light_map_based_detector 基于地图的交通信号灯检测器根据高清地图计算出图像中交通信号灯的位置。可以通过参数输入校准和振动误差,并且检测到的感兴趣区域的大小将根据误差而变化。
- traffic_light_selector 该软件包接收多个交通信号灯状态,并输出一个用于规划组件的单个交通信号灯状态。
- traffic_light_ssd_fine_detector 这是一个使用MobileNetV2和SSDLite进行交通信号灯检测的软件包。
- traffic_light_visualization 是一个包含两个可视化节点的软件包:traffic_light_map_visualizer是一个节点,它在rviz上以标记的形式显示交通灯的颜色状态和位置。traffic_light_roi_visualizer是一个节点,它在输入图像上绘制交通灯识别节点的结果(交通灯状态、位置和分类概率),如下图所示,并将其发布出去。