Autoware源码网站
项目简介
教程
Autoware的整体架构如下图,主要包括传感器sensing、高精地图map data、车辆接口vehicle interface、感知perception(动态障碍物检测detection、跟踪tracking、预测prediction;交通信号灯检测detection、分类classfier)、定位localization、规划planning、控制control,
源码网站中仓库总共42个,主要库分别如下:
项目简介库2个:autoware、autoware-documentation、
感知和定位库:autoware_ai_perception
规划和控制库:autoware_ai_planning
传感器驱动和车辆接口:autoware_ai_drivers
仿真库2个:autocore_sim、autoware_ai_simulation
通用代码库:autoware_common、autoware_ai_common
可视化库:autoware_ai_visualization
消息库 2个:autoware_msgs 、autoware_ai_messages
launch文件库5个:sample_sensor_kit_launch、sample_vehicle_launch、autoware_launch、awf_reference_vehicle_launch、awf_reference_sensor_kit_launch。
感知和定位仓库
该仓库包括感知和定位算法。
lidar_localizer
该模块基于激光雷达定位,包括ICP和NDT两种定位方式。
NDT
1.NDT通过下面4中方式实现,,通过math_type参数设置;
1)pcl_generic=0:直接用PCL点云库中方法实现
2)pcl_anh=1:具体实现方法在autoware_ai_perception/ndt_cpu中,源码中没有实现的代码。
3)pcl_anh_gpu=2:具体实现在autoware_ai_perception/ndt_gpu中,源码中没有实现的代码,其使用GPU加速NDT过程。
4)pcl_openmp=3:具体实现在autoware_ai_perception/pcl_omp_registration中,源码中有实现代码,其使用OPENMP多线程技术加速ndt过程。
2.算法流程
算法中关键函数如下,算法的接口是参考PCL中NDT设计的(见ndt.h),其主要参考Magnusson的博士论文(The Three-Dimensional Normal-Distributions Transform - an Efficient Representation for Registration, Surface Analysis, and Loop Detection.)第6章实现的:
1)initialpose_callback:通过initialpose(geometry_msgs::PoseWithCovarianceStamped)话题得到初始位姿
2)map_callback:通过points_map(sensor_msgs::PointCloud2)话题得到地图,并设置ndt算法参数:ndt.setResolution(ndt_res=1.0)、ndt.setInputTarget(map_ptr){}、ndt.setMaximumIterations(max_iter=30)-计算尺寸为ndt_res单元格的PDF、ndt.setStepSize(step_size=0.1)、ndt.setTransformationEpsilon(trans_eps=0.01)。
3)points_callback:通过filtered_points(sensor_msgs::PointCloud2)激光雷达数据话题,转换成pcl格式的filtered_scan_ptr指针,将其输入ndt(setInputSource(filtered_scan_ptr)),根据imu和odom数据估计当前帧位姿初值init_guess。使用align(*output_cloud, init_guess)估计当前帧位姿。通过ndt.hasConverged()、ndt.getFinalTransformation()、ndt.getFinalNumIteration()、ndt.getFitnessScore()、ndt.getTransformationProbability()可读取ndt估计结果。
ICP
ICP调用PCL库ICP方法中实现:
1)initialpose_callback:通过initialpose(geometry_msgs::PoseWithCovarianceStamped)话题得到初始位姿
2)map_callback:通过points_map(sensor_msgs::PointCloud2)话题得到地图,并设置ICP算法地图:icp.setInputTarget(map_ptr)。
3)points_callback:通过filtered_points(sensor_msgs::PointCloud2)激光雷达数据话题,转换成pcl格式的filtered_scan_ptr指针,将其输入icp(icp.setInputSource(filtered_scan_ptr)),根据imu和odom数据估计当前帧位姿初值init_guess。通过icp.setMaximumIterations(maximum_iterations=100)、icp.setTransformationEpsilon(transformation_epsilon=0.01)、icp.setMaxCorrespondenceDistance(max_correspondence_distance=1.0)icp.setEuclideanFitnessEpsilon(euclidean_fitness_epsilon=0.1)、icp.setRANSACOutlierRejectionThreshold(ransac_outlier_rejection_threshold=1.0)设置算法参数,使用align(*output_cloud, init_guess)估计当前帧位姿。通过icp.getFinalTransformation()、icp.getFitnessScore()、可读取估计结果。