精华内容
下载资源
问答
  • 无人驾驶传感器融合系列(三)——真实激光雷达点云数据流的处理 本章摘要:在前两章中,讲解了激光雷达点云的分割、聚类基础原理以及实现。这一章主要介绍真实点云情况下的一些预处理,比如点云的导入、过滤、...

    无人驾驶传感器融合系列(三)——真实激光雷达点云数据流的处理

    本章摘要:在前两章中,讲解了激光雷达点云的分割、聚类基础原理以及实现。这一章主要介绍真实点云情况下的一些预处理,比如点云的导入、过滤、裁剪。然后根据单帧障碍物检测的pipeline,处理点云数据流。

    真实激光点云的导入

    将file中的点云文件(比如data文件下的 0000000000.pcd )导入到cloud。

    template<typename PointT>
    typename pcl::PointCloud<PointT>::Ptr ProcessPointClouds<PointT>::loadPcd(std::string file)
    {
        typename pcl::PointCloud<PointT>::Ptr cloud (new pcl::PointCloud<PointT>);
        if (pcl::io::loadPCDFile<PointT> (file, *cloud) == -1) //* load the file
        {
            PCL_ERROR ("Couldn't read file \n");
        }
        std::cerr << "Loaded " << cloud->points.size () << " data points from "+file << std::endl;
        return cloud;
    }
    

    显示导入的点云

    //显示pointXYZ类型的点云
    void renderPointCloud(pcl::visualization::PCLVisualizer::Ptr& viewer, const pcl::PointCloud<pcl::PointXYZ>::Ptr& cloud, std::string name, Color color)
    {
      	viewer->addPointCloud<pcl::PointXYZ> (cloud, name);
      	viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 4, name);
      	viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_COLOR, color.r, color.g, color.b, name);
    }
    //显示pointXYZI类型的点云
    void renderPointCloud(pcl::visualization::PCLVisualizer::Ptr& viewer, const pcl::PointCloud<pcl::PointXYZI>::Ptr& cloud, std::string name, Color color)
    {
    	if(color.r==-1)
    	{
    		// Select color based off of cloud intensity
    		pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZI> intensity_distribution(cloud,"intensity");
      		viewer->addPointCloud<pcl::PointXYZI>(cloud, intensity_distribution, name);
    	}
    	else
    	{
    		// Select color based off input value
    		viewer->addPointCloud<pcl::PointXYZI> (cloud, name);
    		viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_COLOR, color.r, color.g, color.b, name);
    	}
    	viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, name);
    }
    

    效果图如下:
    在这里插入图片描述

    过滤导入的点云

    从上面的点云可以看出来,点云非常密集,密集的点云会加剧计算量。所以可以适当的对其进行过滤,下面采用VoxelGrid方法对其进行过滤。基本原理就是将点云划分成一个一个的voxel立方格子,每个格子保留一个点,voxel格子边长越大,得到的点云越是稀疏。

    typename pcl::PointCloud<PointT>::Ptr cloud_filtered (new pcl::PointCloud<PointT>());
    pcl::VoxelGrid<PointT> sor;
    sor.setInputCloud (cloud);
    sor.setLeafSize (filterRes, filterRes, filterRes);  //filterRes 就为voxel格子的边长。
    sor.filter (*cloud_filtered);
    

    裁剪点云

    点云过滤之后,会变得适当的稀疏,但是点云的范围依然很广,比如道路外面的树木、建筑物等,这些对我们是没有意义的,还有就是前后特别远的地方,我们也不关心,所以我们需要将这些地方裁剪掉,只保留我们关注的区域。采用CropBox来裁剪点云。

    typename pcl::PointCloud<PointT>::Ptr cloud_region (new pcl::PointCloud<PointT>());
    pcl::CropBox<PointT> region(true);  //把一定区域内的点云裁剪掉,比如车道外的点,前后太远的点。
    region.setMin(minPoint);    //裁剪框x,y,z,i的最小值,比如:Eigen::Vector4f (-30, -6, -2, 0)
    region.setMax(maxPoint);    //裁剪框x,y,z, i的最大值。比如:Eigen::Vector4f ( 60, 6, 0, 1)
    region.setInputCloud(cloud_filtered);  //输入为上面过滤之后的点云
    region.filter(*cloud_region);     //裁剪之后的点云
    

    剔除掉打在车顶上的点云

    有些点云会打在车顶上,比如上图中中间那些杂点,这些干扰点没有意义,需要剔除掉。采用CropBox得到一定范围内点的索引,然后采用ExtractIndices剔除掉这些杂点。

    std::vector<int> indice;
    pcl::CropBox<PointT> roof(true);  
    region.setMin(Eigen::Vector4f(-1.5,-1.7,-1.2,1));
    region.setMax(Eigen::Vector4f(2.5,1.7,0,1));
    region.setInputCloud(cloud_region);
    region.filter(indice);      //得到上述范围内点的索引
    
    pcl::PointIndices::Ptr inliers (new pcl::PointIndices());
    for(int ind: indice)
       inliers->indices.push_back(ind);
    
    // Create the filtering object
    pcl::ExtractIndices<PointT> extract;
    // Extract the inliers
    extract.setInputCloud (cloud_region);
    extract.setIndices (inliers);
    extract.setNegative (true);
    extract.filter (*cloud_region);
    

    经过上面的过滤、裁剪、剔除之后效果图如下(车顶上的点还没有完全剔除):
    在这里插入图片描述

    点云数据流的处理

    经过上面一系列的预处理之后,就可以按照前两章的内容进行分割,聚类了,至此就完成了单帧点云处理的pipeline。下面说说如何进行点云数据流的处理。

    pcl::visualization::PCLVisualizer::Ptr viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));
    
    ProcessPointClouds<pcl::PointXYZI>* pointProcessorI = new ProcessPointClouds<pcl::PointXYZI>();
    std::vector<boost::filesystem::path> stream = pointProcessorI->streamPcd("../src/sensors/data/pcd/data_1");
    auto streamIterator = stream.begin();                                         //data_1为存放一系列点云的文件
    pcl::PointCloud<pcl::PointXYZI>::Ptr inputCloudI;
    
    while (!viewer->wasStopped ())
    {
    	// Clear viewer
    	viewer->removeAllPointClouds();
    	viewer->removeAllShapes();
    
    	// Load pcd and run obstacle detection process
        inputCloudI = pointProcessorI->loadPcd((*streamIterator).string());
        cityBlock(viewer, pointProcessorI, inputCloudI);
    
        streamIterator++;
        if(streamIterator == stream.end())
             streamIterator = stream.begin();
    
        viewer->spinOnce ();
    }
    

    上面用到的streamPcd定义如下:

    template<typename PointT>
    std::vector<boost::filesystem::path> ProcessPointClouds<PointT>::streamPcd(std::string dataPath)
    {
        std::vector<boost::filesystem::path> paths(boost::filesystem::directory_iterator{dataPath}, boost::filesystem::directory_iterator{});
        // sort files in accending order so playback is chronological
        sort(paths.begin(), paths.end());
    
        return paths;
    }
    

    最终的效果如下:

    在这里插入图片描述

    完整代码见:github

    根据需要,自行调整不同状态时候的输出,代码中已有明确的注释。

    展开全文
  • 无人驾驶传感器融合系列(一)——激光雷达点云的分割原理及实现 本章摘要:激光雷达扫描得到的点云含有大部分地面点,这对后续障碍物点云的分类、识别和跟踪带来麻烦,所以需要将其分割掉。本章主要讲解点云的...

    无人驾驶传感器融合系列(一)——激光雷达点云的分割原理及实现

    本章摘要:激光雷达扫描得到的点云含有大部分地面点,这对后续障碍物点云的分类、识别和跟踪带来麻烦,所以需要将其分割掉。本章主要讲解点云的基础分割算法—RANSAC算法,通过例子分析其基本原理,然后讲解如何运用PCL实现RANSAC算法

    RANSAC算法原理

    RANSAC (Random Sample Consensus) 随机采样一致性算法,其实就是想办法找出代表地面的平面。如下图所示,绿色的点为打在地面上的点,红色的点为打在障碍物上的点。打在地面上的点基本上是处在一个平面上的,所以我们的目标就是找到这个平面,然后将距离此平面一定距离内的点分割成地面。
    在这里插入图片描述由于算法逻辑本质上是一致的,为了简便起见,这里将三维空间寻找平面问题,转化为二维空间寻找直线的问题。算法逻辑如下:
    (1)要得到一个直线模型,需要两个点唯一确定一个直线方程。所以第一步随机选择两个点。
    (2)通过这两个点,可以计算出这两个点所表示的方程y=ax+b。
    (3)计算所有的数据点到这个方程的距离。
    (4)找到所有满足距离阈值的点。
    (5)然后再重复(1)~(4)这个过程,直到达到一定迭代次数后,选出那个包含最多点的直线,作为要求的直线,其所包含的点作为要分割的点。过程如下图所示:
    在这里插入图片描述

    PCL实现RANSAC算法

    PCL是一个开源的点云处理库,是在吸收了前人点云相关研究基础上建立起来的大型跨平台开源C++编程库,它实现了大量点云相关的通用算法和高效数据结构,包含点云获取、滤波、分割、配准、检索、特征提取、识别、追踪、曲面重建、可视化等大量开源代码。下面代码介绍如何用PCL实现RANSAC算法:

    template<typename PointT>
    std::pair<typename pcl::PointCloud<PointT>::Ptr, typename pcl::PointCloud<PointT>::Ptr> ProcessPointClouds<PointT>::SegmentPlane(typename pcl::PointCloud<PointT>::Ptr cloud, int maxIterations, float distanceThreshold)
    {
        auto startTime = std::chrono::steady_clock::now();  //记录起始时间
    	
        pcl::PointIndices::Ptr inliers (new pcl::PointIndices());   //std::vector<int> indices,包含在平面一定范围内所有点云id的vector.
        pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients ()); //定义模型的系数
        pcl::SACSegmentation<PointT> seg;        // Create the segmentation object
        seg.setOptimizeCoefficients (true);      // Optional
        seg.setModelType (pcl::SACMODEL_PLANE);  //设置采用的模型
        seg.setMethodType (pcl::SAC_RANSAC);     //设置方法为ransac分割
        seg.setMaxIterations (maxIterations);    //设置最大迭代次数
        seg.setDistanceThreshold (distanceThreshold);   //设置距离阈值
        seg.setInputCloud (cloud);               //输入点云
        seg.segment (*inliers, *coefficients);   //得到分割结果
        
        if (inliers->indices.size () == 0)
        {
          std::cerr << "Could not estimate a planar model for the given dataset." << std::endl;
        }
    
        auto endTime = std::chrono::steady_clock::now();  //记录结束时间
        auto elapsedTime = std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime);
        std::cout << "plane segmentation took " << elapsedTime.count() << " milliseconds" << std::endl;
    
        std::pair<typename pcl::PointCloud<PointT>::Ptr, typename pcl::PointCloud<PointT>::Ptr> segResult = SeparateClouds(inliers,cloud);
        return segResult;
    }
    
    template<typename PointT>
    std::pair<typename pcl::PointCloud<PointT>::Ptr, typename pcl::PointCloud<PointT>::Ptr> ProcessPointClouds<PointT>::SeparateClouds(pcl::PointIndices::Ptr inliers, typename pcl::PointCloud<PointT>::Ptr cloud) 
    {
      // TODO: Create two new point clouds, one cloud with obstacles and other with segmented plane
        typename pcl::PointCloud<PointT>::Ptr plancloud (new pcl::PointCloud<PointT>());
        typename pcl::PointCloud<PointT>::Ptr obstcloud (new pcl::PointCloud<PointT>());
    
        for(int index : inliers->indices)
            plancloud->points.push_back(cloud->points[index]);
        
        // Create the filtering object
        pcl::ExtractIndices<PointT> extract;
        // Extract the inliers
        extract.setInputCloud (cloud);
        extract.setIndices (inliers);
        extract.setNegative (true);
        extract.filter (*obstcloud);
    
        std::pair<typename pcl::PointCloud<PointT>::Ptr, typename pcl::PointCloud<PointT>::Ptr> segResult(plancloud, obstcloud);
        return segResult;
    }
    

    完整代码见:github

    显示不同的输出结果见 sensors/ environment.cpp/ simpleHighway, 可以根据注释自己调整输出。

    展开全文
  • 无人驾驶传感器融合系列(十一)—— 相机内参标定 本章摘要:本章讲解相机畸变产生的原因,标定原理,以及如何通过opencv实现相机内参的标定。 一、相机畸变产生的原因 相机主要有两大畸变,径向畸变,切...

    无人驾驶传感器融合系列(十一)—— 相机内参标定

    本章摘要:本章讲解相机畸变产生的原因,标定原理,以及如何通过opencv实现相机内参的标定。

    一、相机畸变产生的原因

    相机主要有两大畸变,径向畸变,切向畸变。
    径向畸变
    下面左图为针孔相机模型,如果按此理想模型进行投影的话,其实是不会产生径向畸变的。但是实际上,相机是采用透镜来代替针孔的,以增加采光量,提升投影质量。在透镜的边缘,光线会或多或少的产生异常的弯曲,这就导致了相片边缘的畸变现象。
    在这里插入图片描述在这里插入图片描述切向畸变:
    由于透镜和成像平面之间的不平行,造成的成像的倾斜现象,这样就会导致成像物体看起来比实际物体更近,或者更远。
    在这里插入图片描述

    二、畸变系数计算原理

    径向畸变系数为k1, k2, k3,切向畸变系数为p1, p2,可以通过如下两个方程求得:
    在这里插入图片描述径向畸变计算方程
    在这里插入图片描述
    切向畸变计算方程:
    在这里插入图片描述

    三、相机内参标定

    根据上面畸变洗漱计算原理,下面讲讲如何采用opencv实现相机内参的标定主要流程。

    1. 采用cv2.findChessboardCorners( ),找到畸变棋盘上的角点。往往会收及一系列不同角度、方向上的的棋盘图片。
      在这里插入图片描述
    2. 将畸变棋盘角点与非畸变棋盘角点对应。
      在这里插入图片描述
    3. 采用cv2.calibrateCamera()计算畸变系数。
    4. 采用cv2.undistort() 给图片去畸变。

    四、实例演示

    import numpy as np
    import cv2
    import glob
    import matplotlib.pyplot as plt
    import matplotlib.image as mpimg
    import pickle
    
    # prepare object points, like (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0)
    #非畸变棋盘角点
    objp = np.zeros((6*9,3), np.float32)
    objp[:,:2] = np.mgrid[0:9, 0:6].T.reshape(-1,2)
    
    # Arrays to store object points and image points from all the images.
    objpoints = [] # 3d points in real world space
    imgpoints = [] # 2d points in image plane.
    
    # Make a list of calibration images
    #导入一组不同角度、距离的棋盘照片
    images = glob.glob('camera_cal/*.jpg')
    
    # Step through the list and search for chessboard corners
    #找到角点,然后对应放入objpoints 、imgpoints
    for idx, fname in enumerate(images):
        img = cv2.imread(fname)
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
        # Find the chessboard corners
        ret, corners = cv2.findChessboardCorners(gray, (9,6), None)
    
        # If found, add object points, image points
        if ret == True:
            objpoints.append(objp)
            imgpoints.append(corners)
    
    # Test undistortion on an image
    img = cv2.imread('camera_cal/calibration1.jpg')
    img_size = (img.shape[1], img.shape[0])
    
    # Do camera calibration given object points and image points
    # 计算畸变系数
    # mtx:3维到2维像平面投影矩阵,dist:畸变洗漱矩阵 [k1, k2, p1, p2, k3]。
    ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, img_size,None,None)
    
    # 给图片去畸变
    dst = cv2.undistort(img, mtx, dist, None, mtx)
    cv2.imwrite('output_images/calibration1_undist.jpg',dst)
    
    # Save the camera calibration result for later use (we won't worry about rvecs / tvecs)
    dist_pickle = {}
    dist_pickle["mtx"] = mtx
    dist_pickle["dist"] = dist
    pickle.dump( dist_pickle, open( "camera_cal/dist_pickle.p", "wb" ) )
    #dst = cv2.cvtColor(dst, cv2.COLOR_BGR2RGB)
    # Visualize undistortion
    f, (ax1, ax2) = plt.subplots(1, 2, figsize=(20,10))
    ax1.imshow(img)
    ax1.set_title('Original Image', fontsize=30)
    ax2.imshow(dst)
    ax2.set_title('Undistorted Image', fontsize=30)
    

    在这里插入图片描述

    代码资源

    关于上面的代码资源,见github: Advanced-Lane-Finding前半部分。

    展开全文
  • RANSAC (Random Sample Consensus) 随机采样一致性算法,其实就是想办 法找出代表地面的平面。如下图所示,绿色的点为打在地面上的点,红色的点为 打在障碍物上的点。打在地面上的点基本上是处在一个平面上的,所以...
  • 无人驾驶传感器融合系列(八)——基于相机目标追踪之关键点探测 本章摘要:上一章对目标追踪中的TTC有个大概的讲解。在此基础上,第八、九章将对关键点keypoints方法进行详细的讲解。主要内容:图像上的关键点...

    无人驾驶传感器融合系列(八)——基于相机目标追踪之关键点探测

    本章摘要:上一章对目标追踪中的TTC有个大概的讲解。在此基础上,第八、九章将对关键点keypoints方法进行详细的讲解。主要内容:图像上的关键点具备什么样的特征,如何探测;对检测出来的关键点如何描述,以便于和其他关键点区别和匹配;对于不同帧之间的关键点如何实现匹配,进而实现目标追踪。本章主要讲解关键点探测。

    一、keypoints具备的特征

    图像上那么多像素点,什么样的点叫做关键点了,应该是能够唯一确定位置的点。周边像素值一致或者区别不明显,肯定是难以确定唯一位置的,能够确定位置的地方应该是像素值变化明显的地方,那么它们具备什么样的特征了,看看下图:
    在这里插入图片描述
    是不是可以得到下面的结果,直线上是难以确定唯一位置的,但是角点、椭圆中心可以,它们能够根据周边像素值比较准确的确定其(x, y)位置。后面主要对角点关键点进行分析。
    在这里插入图片描述

    二、梯度值

    上面的像素变化明显的地方如何度量了,那就是梯度,下面图直观的感受一下。可以看出像素值变化大的地方,梯度值很大。
    在这里插入图片描述
    那梯度值如何计算了,其实和常规梯度计算一样的:
    在这里插入图片描述
    在这里插入图片描述
    上面公式体现在像素值梯度计算上,怎么样比较方便了,这里采用Sobel operator 梯度计算。下面程序段会帮助了解其原理。
    在这里插入图片描述
    x方向梯度值Ix的计算:

    	// load image from file
        cv::Mat img;
        img = cv::imread("./img1.png");
    
        // convert image to grayscale
        cv::Mat imgGray;
        cv::cvtColor(img, imgGray, cv::COLOR_BGR2GRAY);
    
        // create filter kernel
        float sobel_x[9] = {-1, 0, +1,
                            -2, 0, +2, 
                            -1, 0, +1};
        cv::Mat kernel_x = cv::Mat(3, 3, CV_32F, sobel_x);
    
        // apply filter
        cv::Mat result_x;
        cv::filter2D(imgGray, result_x, -1, kernel_x, cv::Point(-1, -1), 0, cv::BORDER_DEFAULT);
    
        // show result
        string windowName = "Sobel operator (x-direction)";
        cv::namedWindow( windowName, 1 ); // create window 
        cv::imshow(windowName, result_x);
        cv::waitKey(0); // wait for keyboard input before continuing
    

    在这里插入图片描述

    三、高斯平滑

    在进行上面梯度计算之前,还需要进行高斯平滑。因为原始图片可能会有噪点,可以采用高斯平滑减少他们的影响。
    高斯平滑就是采用一定大小的窗口,对图片进行扫描过滤,这样就可以将像素周边的点以一定权重考虑进来,实现平滑的目的。

    在这里插入图片描述
    高斯平滑两个关键点:

    1. 方差:方差越大考虑周边的像素的权重就越大,结果也就越平滑。下图从左到右方差越来越小。
      在这里插入图片描述

    2. 窗口大小:窗口越大,周边越多像素被考虑进来。

    	int filterSize = 5;
        int stdDev = 2.0;
        cv::GaussianBlur(imgGray, blurred, cv::Size(filterSize, filterSize), stdDev);
    

    四、角点探测

    比如有下面这样一个角点,如何探测到,并且能够确定其位置了。在这里插入图片描述
    采用一个窗口,计算窗口内部像素值的累计和,然后移动窗口,看像素值之后是否会发生明显的变化。图a 两个方向上都不会,图b 只有水平方向上会发生明显变化,图c 两个方向上都会发生明显变化。这两个方向上都会发生明显变化的点,就是我们要找的角点了。

    下面进行计算分析:
    假如窗口水平和竖直方向分别移动了u, v,那么窗口w内的像素值变化量为:
    在这里插入图片描述
    对第一项进行泰勒展开可得:
    在这里插入图片描述
    带回公式可以得到:
    在这里插入图片描述
    称上面的H为协方差矩阵,其椭圆表示如下图所示。哪个方向越长,代表哪个方向的变化越明显更。
    在这里插入图片描述
    其中半长轴计算如下:
    在这里插入图片描述

    五、Harris Corner Detector

    Harris为经典角点探测中比较代表性的,其response计算如下,其中k值一般取 k = 0.04 - 0.06。
    在这里插入图片描述

    经典关键点探测算法,它们更多的关注准确度,速度往往欠佳。

    • 1988 Harris Corner Detector (Harris, Stephens)
    • 1996 Good Features to Track (Shi, Tomasi)
    • 1999 Scale Invariant Feature Transform (Lowe)
    • 2006 Speeded Up Robust Features (Bay, Tuytelaars, Van Gool)

    实时关键点检测算法:

    • 2006 Features from Accelerated Segment Test (FAST) (Rosten, Drummond)
    • 2010 Binary Robust Independent Elementary Features (BRIEF) (Calonder, et al.)
    • 2011 Oriented FAST and Rotated BRIEF (ORB) (Rublee et al.)
    • 2011 Binary Robust Invariant Scalable Keypoints (BRISK) (Leutenegger, Chli, Siegwart)
    • 2012 Fast Retina Keypoint (FREAK) (Alahi, Ortiz, Vandergheynst)
    • 2012 KAZE (Alcantarilla, Bartoli, Davidson)

    关于上面关键点检测算法的应用,详见github,SFND_2D_Feature_Tracking,还对各个算法的性能对比进行了比较。

    后续

    本章讲解了关键点的检测,下一章将会讨论如何描述检测出来的关键点,以便于和其他关键点区别和匹配。

    文章说明:

    Udacity 传感器融合课程笔记

    展开全文
  • 本章摘要:前几章讲了单独相机实现目标追踪,这一章讲解如何实现相机和激光雷达数据融合。整体思路是这样的,1、先是坐标对齐,将雷达坐标转换到相机坐标。2、然后将激光点往像平面投影,得到投影到像平面的点云。3...
  • 无人驾驶传感器融合系列(九)——基于相机目标追踪之关键点描述、匹配 本章摘要:关键点检测出来之后,需要将其与其它图像上的关键点进行匹配,匹配的依据是什么了,这就需要涉及到关键点的描述了。根据关键点...
  • 无人驾驶传感器融合系列(六)——毫米波雷达方位角估计(77GHz FMCW) 本章摘要:本章主要讲解毫米波雷达如何估计障碍物的方位角,方位角的分辨率计算,方位角可估算范围。 一、方位角估计基础 根据上一...
  • 无人驾驶传感器融合系列(七)——基于相机的目标追踪与碰撞检测 本章摘要:本章主要讲解基于相机实现目标追踪的整体思路,以及根据追踪的结果实现一个简单的应用TTC(time to collision),好对基于相机的目标...
  • 首先,本文介绍了 KITTI 数据集中涉及传感器融合算法的点云数据以及检测结果的评判 标准,并通过梳理点云数据无序性、稀疏性以及信息量有限的特性,提出点云数据鸟瞰化方案,融合点云数据高度、密度、强度信息,将其...
  • 无人驾驶传感器融合系列(五)——毫米波雷达测速原理(77GHz FMCW) 本章摘要:介绍调频连续波(FMCW),如何进行测速,测速范围,测速分辨率如何计算。 一、傅里叶变换 对时域信号进行傅里叶变换,不仅...
  • 无人驾驶传感器融合系列(四)——毫米波雷达测距原理(77GHz FMCW) 本章摘要:介绍什么是调频连续波(FMCW),它是如何进行测距的,测距分辨率分析,测距范围分析。 调频连续波测距的 基本原理 : 1、...
  • 无人驾驶传感器融合系列(二)——激光雷达点云的聚类原理及实现 本章摘要:在上一章,我们采用RANSAC算法分割出了地面点云,非地面点云。我们通常会对非地面点云进行进一步的分割,也就是对地面以上的障碍物的...
  • 无人驾驶的多传感器融合技术

    千次阅读 2019-07-13 17:07:06
    “自动泊车、公路巡航控制和自动紧急制动等自动驾驶...只有把多个传感器信息融合起来,才是实现自动驾驶的关键。” 现在路面上的很多汽车,甚至是展厅内的很多新车,内部都配备有基于摄像头、雷达、超声波或LIDAR...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,098
精华内容 2,039
关键字:

无人驾驶传感器融合系列