当前位置:

首页 > 业界资讯 > 一文解读自动驾驶中的激光雷达点云分割算法

一文解读自动驾驶中的激光雷达点云分割算法

目前常见的激光点云分割算法有基于平面拟合的方法和基于激光点云数据特点的方法两类。具体如下:点云地面分割算法01基于平面拟合的方法-GroundPlaneFitting算法思想:一种简单的处理方法就是沿着x方向(车头的方向)将空间分割成若干个子平面,然后对每个子平面使用地面平面拟合算法(GPF)从而得到能够处理陡坡的地面分割方法。该方法是在单帧点云中拟合全局平面,在点云数量较多时效果较好,点云稀疏时极易带来漏检和误检,比如16线激光雷达。算法伪代码:伪代码算法流程是对于给定的点云P,分割的最终结果

本文目录

    目前常见的激光点云分割算法有基于平面拟合的方法和基于激光点云数据特点的方法两类。具体如下:

    一文解读自动驾驶中的激光雷达点云分割算法

    点云地面分割算法

    01 基于平面拟合的方法-Ground Plane Fitting

    算法思想:一种简单的处理方法就是沿着x方向(车头的方向)将空间分割成若干个子平面,然后对每个子平面使用地面平面拟合算法(GPF)从而得到能够处理陡坡的地面分割方法。该方法是在单帧点云中拟合全局平面,在点云数量较多时效果较好,点云稀疏时极易带来漏检和误检,比如16线激光雷达。

    算法伪代码:

    一文解读自动驾驶中的激光雷达点云分割算法

    伪代码

    算法流程是对于给定的点云 P ,分割的最终结果为两个点云集合,地面点云​ 和非地面点云。此算法有四个重要参数,如下:

    • Niter : 进行奇异值分解(SVD)的次数,也即进行优化拟合的次数
    • NLPR : 用于选取LPR的最低高度点的数量
    • Thseed : 用于选取种子点的阈值,当点云内的点的高度小于LPR的高度加上此阈值时,我们将该点加入种子点集
    • Thdist : 平面距离阈值,我们会计算点云中每一个点到我们拟合的平面的正交投影的距离,而这个平面距离阈值,就是用来判定点是否属于地面

    种子点集的选择

    我们首先选取一个种子点集(seed point set),这些种子点来源于点云中高度(即z值)较小的点,种子点集被用于建立描述地面的初始平面模型,那么如何选取这个种子点集呢?我们引入最低点代表(Lowest Point Representative, LPR)的概念。LPR就是NLPR个最低高度点的平均值,LPR保证了平面拟合阶段不受测量噪声的影响。

    一文解读自动驾驶中的激光雷达点云分割算法

    种子点的选择

    输入是一帧点云,这个点云内的点已经沿着z方向(即高度)做了排序,取 num_lpr_ 个最小点,求得高度平均值 lpr_height(即LPR),选取高度小于 lpr_height + th_seeds_的点作为种子点。

    具体代码实现如下

    /*
    @brief Extract initial seeds of the given pointcloud sorted segment.
    This function filter ground seeds points accoring to heigt.
    This function will set the `g_ground_pc` to `g_seed_pc`.
    @param p_sorted: sorted pointcloud
    
    @param ::num_lpr_: num of LPR points
    @param ::th_seeds_: threshold distance of seeds
    @param ::
    */
    void PlaneGroundFilter::extract_initial_seeds_(const pcl::PointCloud &p_sorted)
    {
    // LPR is the mean of low point representative
    double sum = 0;
    int cnt = 0;
    // Calculate the mean height value.
    for (int i = 0; i 

    平面模型

    接下来我们建立一个平面模型,点云中的点到这个平面的正交投影距离小于阈值Thdist,则认为该点属于地面,否则属于非地面。采用一个简单的线性模型用于平面模型估计,如下:

    ax+by+cz+d=0

    即:

    一文解读自动驾驶中的激光雷达点云分割算法

    其中

    一文解读自动驾驶中的激光雷达点云分割算法

    ,通过初始点集的协方差矩阵C来求解n,从而确定一个平面,种子点集作为初始点集,其协方差矩阵为

    一文解读自动驾驶中的激光雷达点云分割算法

    这个协方差矩阵 C 描述了种子点集的散布情况,其三个奇异向量可以通过奇异值分解(SVD)求得,这三个奇异向量描述了点集在三个主要方向的散布情况。由于是平面模型,垂直于平面的法向量 n 表示具有最小方差的方向,可以通过计算具有最小奇异值的奇异向量来求得。

    那么在求得了 n 以后, d 可以通过代入种子点集的平均值  ,s(它代表属于地面的点) 直接求得。整个平面模型计算代码如下:

    /*
    @brief The function to estimate plane model. The
    model parameter `normal_` and `d_`, and `th_dist_d_`
    is set here.
    The main step is performed SVD(UAV) on covariance matrix.
    Taking the sigular vector in U matrix according to the smallest
    sigular value in A, as the `normal_`. `d_` is then calculated 
    according to mean ground points.
    
    
    @param g_ground_pc:global ground pointcloud ptr.
    
    */
    void PlaneGroundFilter::estimate_plane_(void)
    {
    // Create covarian matrix in single pass.
    // TODO: compare the efficiency.
    Eigen::Matrix3f cov;
    Eigen::Vector4f pc_mean;
    pcl::computeMeanAndCovarianceMatrix(*g_ground_pc, cov, pc_mean);
    // Singular Value Decomposition: SVD
    JacobiSVD svd(cov, Eigen::DecompositionOptions::ComputeFullU);
    // use the least singular vector as normal
    normal_ = (svd.matrixU().col(2));
    // mean ground seeds value
    Eigen::Vector3f seeds_mean = pc_mean.head();
    
    
    // according to normal.T*[x,y,z] = -d
    d_ = -(normal_.transpose() * seeds_mean)(0, 0);
    // set distance threhold to `th_dist - d`
    th_dist_d_ = th_dist_ - d_;
    
    
    // return the equation parameters
    }

    优化平面主循环

    extract_initial_seeds_(laserCloudIn);
    g_ground_pc = g_seeds_pc;
    // Ground plane fitter mainloop
    for (int i = 0; i clear();
    g_not_ground_pc->clear();
    
    
    //pointcloud to matrix
    MatrixXf points(laserCloudIn_org.points.size(), 3);
    int j = 0;
    for (auto p : laserCloudIn_org.points)
    {
    points.row(j++) points.push_back(laserCloudIn_org[r]);
    }
    }
    }

    得到这个初始的平面模型以后,我们会计算点云中每一个点到该平面的正交投影的距离,即 points * normal_,并且将这个距离与设定的阈值​(即th_dist_d_) 比较,当高度差小于此阈值,我们认为该点属于地面,当高度差大于此阈值,则为非地面点。经过分类以后的所有地面点被当作下一次迭代的种子点集,迭代优化。

    02 基于雷达数据本身特点的方法-Ray Ground Filter

    代码

    ​​https://github.com/suyunzzz/ray_filter_ground​​

    算法思想

    Ray Ground Filter算法的核心是以射线(Ray)的形式来组织点云。将点云的 (x, y, z)三维空间降到(x,y)平面来看,计算每一个点到车辆x正方向的平面夹角 θ, 对360度进行微分,分成若干等份,每一份的角度为0.2度。

    一文解读自动驾驶中的激光雷达点云分割算法

    激光线束等间隔划分示意图(通常以激光雷达角度分辨率划分)

    一文解读自动驾驶中的激光雷达点云分割算法

    同一角度范围内激光线束在水平面的投影以及在Z轴方向的高度折线示意图

    为了方便对同一角度的线束进行处理,要将原来直角坐标系的点云转换成柱坐标描述的点云数据结构。对同一夹角的线束上的点按照半径的大小进行排序,通过前后两点的坡度是否大于我们事先设定的坡度阈值,从而判断点是否为地面点。

    一文解读自动驾驶中的激光雷达点云分割算法

    线激光线束纵截面与俯视示意图(n=4)

    通过如下公式转换成柱坐标的形式:

    一文解读自动驾驶中的激光雷达点云分割算法

    转换成柱坐标的公式

    radius表示点到lidar的水平距离(半径),theta是点相对于车头正方向(即x方向)的夹角。对点云进行水平角度微分之后,可得到1800条射线,将这些射线中的点按照距离的远近进行排序。通过两个坡度阈值以及当前点的半径求得高度阈值,通过判断当前点的高度(即点的z值)是否在地面加减高度阈值范围内来判断当前点是为地面。

    伪代码

    一文解读自动驾驶中的激光雷达点云分割算法

    伪代码

    • local_max_slope_ :设定的同条射线上邻近两点的坡度阈值。
    • general_max_slope_ :整个地面的坡度阈值

    遍历1800条射线,对于每一条射线进行如下操作:

    1.计算当前点和上一个点的水平距离pointdistance

    2.根据local_max_slope_和pointdistance计算当前的坡度差阈值height_threshold

    3.根据general_max_slope_和当前点的水平距离计算整个地面的高度差阈值general_height_threshold

    4.若当前点的z坐标小于前一个点的z坐标加height_threshold并大于前一个点的z坐标减去height_threshold:

    5.若当前点z坐标小于雷达安装高度减去general_height_threshold并且大于相加,认为是地面点

    6.否则:是非地面点。

    7.若pointdistance满足阈值并且前点的z坐标小于雷达安装高度减去height_threshold并大于雷达安装高度加上height_threshold,认为是地面点。

    /*!
     *
     * @param[in] in_cloud Input Point Cloud to be organized in radial segments
     * @param[out] out_organized_points Custom Point Cloud filled with XYZRTZColor data
     * @param[out] out_radial_divided_indices Indices of the points in the original cloud for each radial segment
     * @param[out] out_radial_ordered_clouds Vector of Points Clouds, each element will contain the points ordered
     */
    void PclTestCore::XYZI_to_RTZColor(const pcl::PointCloud::Ptr in_cloud,
     PointCloudXYZIRTColor &out_organized_points,
     std::vector &out_radial_divided_indices,
     std::vector &out_radial_ordered_clouds)
    {
    out_organized_points.resize(in_cloud->points.size());
    out_radial_divided_indices.clear();
    out_radial_divided_indices.resize(radial_dividers_num_);
    out_radial_ordered_clouds.resize(radial_dividers_num_);
    
    for (size_t i = 0; i points.size(); i++)
    {
    PointXYZIRTColor new_point;
    //计算radius和theta
    //方便转到柱坐标下。
    auto radius = (float)sqrt(
    in_cloud->points[i].x * in_cloud->points[i].x + in_cloud->points[i].y * in_cloud->points[i].y);
    auto theta = (float)atan2(in_cloud->points[i].y, in_cloud->points[i].x) * 180 / M_PI;
    if (theta points[i];
    new_point.radius = radius;
    new_point.theta = theta;
    new_point.radial_div = radial_div;
    new_point.concentric_div = concentric_div;
    new_point.original_index = i;
    
    out_organized_points[i] = new_point;
    
    //radial divisions更加角度的微分组织射线
    out_radial_divided_indices[radial_div].indices.push_back(i);
    
    out_radial_ordered_clouds[radial_div].push_back(new_point);
    
    } //end for
    
    //将同一根射线上的点按照半径(距离)排序
    #pragma omp for
    for (size_t i = 0; i 

    03 基于雷达数据本身特点的方法-urban road filter

    原文

    Real-Time LIDAR-Based Urban Road and Sidewalk Detection for Autonomous Vehicles

    代码

    ​​https://github.com/jkk-research/urban_road_filter​​

    z_zero_method

    一文解读自动驾驶中的激光雷达点云分割算法

    z_zero_method

    首先将数据组织成[channels][thetas]

    对于每一条线,对角度进行排序

    1. 以当前点p为中心,向左选k个点,向右选k个点
    2. 分别计算左边及右边k个点与当前点在x和y方向差值的均值
    3. 同时计算左边及右边k个点的最大z值max1及max2
    4. 根据余弦定理求解余弦角

    如果余弦角度满足阈值且max1减去p.z满足阈值或max2减去p.z满足阈值且max2-max1满足阈值,认为此点为障碍物,否则就认为是地面点。

    x_zero_method

    X-zero和Z-zero方法可以找到避开测量的X和Z分量的人行道,X-zero和Z-zero方法都考虑了体素的通道数,因此激光雷达必须与路面平面不平行,这是上述两种算法以及整个城市道路滤波方法的已知局限性。X-zero方法去除了X方向的值,使用柱坐标代替。

    一文解读自动驾驶中的激光雷达点云分割算法

    一文解读自动驾驶中的激光雷达点云分割算法

    x_zero_method

    首先将数据组织成[channels][thetas]

    对于每一条线,对角度进行排序

    1. 以当前点p为中心,向右选第k/2个点p1和第k个点p2
    2. 分别计算p及p1、p1及p2、p及p2间z方向的距离
    3. 根据余弦定理求解余弦角

    如果余弦角度满足阈值且p1.z-p.z满足阈值或p1.z-p2.z满足阈值且p.z-p2.z满足阈值,认为此点为障碍物

    star_search_method

    该方法将点云划分为矩形段,这些形状的组合像一颗星;这就是名字的来源,从每个路段提取可能的人行道起点,其中创建的算法对基于Z坐标的高度变化不敏感,这意味着在实践中,即使当激光雷达相对于路面平面倾斜时,该算法也会表现良好,在柱坐标系中处理点云。

    具体实现:

    一文解读自动驾驶中的激光雷达点云分割算法

    star_search_method

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    业界资讯 自动驾驶
    相关文章 更多
    胡峥楠谈YU7 GT自动驾驶征战纽北,称小米入局汽车还是有梦想的
    胡峥楠谈YU7 GT自动驾驶征战纽北,称小米入局汽车还是有梦想的

    小米YU7GT在纽博格林北环以自动驾驶模式跑出10分29秒483,创全球量产车自动驾驶圈速纪录。胡峥楠表示,这体现小米入局汽车的梦想:电能替代化学能,智能替代人工。纽北因此将小米列为三大顶级合作伙伴之一。该成绩相当于老司机水平,但仅是起点。

    小米 YU7 GT 打破浙赛自动驾驶圈速纪录成绩为1:49.434
    小米 YU7 GT 打破浙赛自动驾驶圈速纪录成绩为1:49.434

    小米YU7GT在浙江国际赛车场以1分49秒434创下自动驾驶圈速纪录,此前于纽博格林北环也取得全球首个自动驾驶圈速成绩。该车最大马力1003匹,零百加速2.92秒,CLTC续航705km,基于897V碳化硅高压平台,全程无人干预。

    曹操出行与May Mobility达成战略合作 共同开拓欧洲Robotaxi市场
    曹操出行与May Mobility达成战略合作 共同开拓欧洲Robotaxi市场

    曹操出行与自动驾驶企业MayMobility达成战略合作,在欧洲探索Robotaxi商业化。双方将联合开展可行性研究,优先在欧洲试点,由曹操出行负责运营,MayMobility提供自动驾驶技术支撑,共同推进无人驾驶出租车服务落地。

    全球首个自动驾驶系统全球技术法规获批发布
    全球首个自动驾驶系统全球技术法规获批发布

    由中、欧、英、美、加、日六方牵头的联合国自动驾驶系统全球技术法规获批发布,首次从产品全生命周期明确核心技术指标,将安全管理、试验验证及持续监控纳入制造商义务,提供完整评估方法,使各国自动驾驶车辆拥有统一标准,推动产业化从碎片化走向体系化。

    消息称大众将与博世在自动驾驶领域“分道扬镳”
    消息称大众将与博世在自动驾驶领域“分道扬镳”

    大众与博世在自动驾驶领域合作或告终,因项目进展缓慢、成本压力大且缺乏竞争力。大众计划另寻供应商采购软硬件,目标将技术普及至亲民车型。L3级自动驾驶预计2030年成为新车标准配置。

    大众放弃博世智驾!
    大众放弃博世智驾!

    大众汽车计划终止与博世在自动驾驶领域的合作,以削减成本。该合作始于2024年初,投入15亿欧元研发L2、L3级软件,但因进度慢于预期、错过关键里程碑而中止。大众正寻找新伙伴,此前已与地平线合作,同时面临裁员10万等财务危机。

    挥别博世?10万裁员?大众激进自救
    挥别博世?10万裁员?大众激进自救

    大众集团计划终止与博世在自动驾驶领域的合作,因15亿欧元投入未达预期。同时,大众酝酿激进重组,全球裁员或扩至10万人,并拟中期关停4家德国工厂,方案将于7月提交监事会。

    消息称理想拆分产品部部分关键职能:整车、智驾并入研发部门
    消息称理想拆分产品部部分关键职能:整车、智驾并入研发部门

    理想汽车调整组织架构,将产品部电动本体团队并入整车研发部门,自动驾驶终端团队并入基座模型研发部门,旨在简化产品决策流程,减少沟通层级,从而提升产品定义效率与协同能力,以应对市场竞争。

    理想“动刀”产品部
    理想“动刀”产品部

    理想汽车调整产品部架构,电动本体定义团队拆分并入整车研发,自动驾驶终端产品团队整合进基座模型研发,旨在拉近产品定义与研发落地的距离。

    标准输出 赋能中国智驾“出海”提速
    标准输出 赋能中国智驾“出海”提速

    全球首个自动驾驶系统全球技术法规由中国牵头制定并发布,明确了核心技术指标与管理要求,为智驾安全落地提供统一规则,助力中国车企降低海外合规成本,推动智能新能源汽车加速全球化进程。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。