0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用CUDA PCL 1.0加速Jetson的点云处理

星星科技指导员 来源:NVIDIA 作者:NVIDIA 2022-04-27 10:53 次阅读

很多Jetson用户在自动化解决方案中选择激光雷达进行定位和感知。激光雷达使用3D点云描绘周围的空间环境。点云可以高精度长距离采样物体表面信息以便于上层应用的障碍感知、绘图、定位和路径规划算法

使用CUDA-PCL处理点云

CUDA PCL 1.0是基于CUDA开发的点云处理库,在本文中,我们将介绍目前所有的三个库:ICP,segmentation 和 filter。

CUDA-ICP

迭代最近点算法(Iterative Closest Point,ICP) 用于计算两帧点云数据之间的坐标变换矩阵,从而能够使不同的坐标下的点云数据合并到同一个坐标系统中。ICP算法 通过计算两帧点云的距离误差从而修正变换矩阵(平移和旋转)以便最小化距离误差,通常两帧点云之间的距离误差是通过匹配点的距离计算得来。ICP算法应用广泛,能够获得很高的匹配结果且有很高的鲁棒性,同时会耗费大量的计算资源。为了改进ICP算法在Jetson上的性能,我们推荐使用基于CUDA加速的CUDA-ICP。

使用CUDA-ICP

以下是CUDA ICP的使用实例

我们仅仅需要初始化相关的类对象,并调用接口函数即可。

    cudaICP icpTest(nPCountM, nQCountM, stream);
    icpTest.icp(cloud_source, nPCount,
            float *cloud_target, int nQCount,
            int Maxiterate, double threshold,
            Eigen::Matrix4f &transformation_matrix, stream);

CUDA-ICP 计算的输出是 transformation_matrix,代表的含义如下:

源点云(P)* transformation = 目标坐标系的点云(Q)

因为激光类型的输出点云的数量为固定值,所以CUDA-ICP在输出化的时候,要求输入两帧点云的最大数量,从而分配计算资源。

class cudaICP
{
public:
    /*
       nPCountM and nQCountM are the maximum of count for input clouds
       They are used to pre-allocate memory.
    */
    cudaICP(int nPCountM, int nQCountM, cudaStream_t stream = 0);
    ~cudaICP(void);

    /*
    cloud_target = transformation_matrix *cloud_source
    When the Epsilon of transformation_matrix is less than threshold,
    the function will return transformation_matrix.
    Input:
        cloud_source, cloud_target: data pointer for points cloud
        nPCount: the points number of cloud_source
        nQCount: the points number of cloud_target
        Maxiterate: the threshold for iterations
        threshold: When the Epsilon of transformation_matrix is less than
            threshold, the function will return transformation_matrix.
    Output:
        transformation_matrix
    */

    void icp(float *cloud_source, int nPCount,

Figure 1. 执行ICP之前的两帧点云。

Figure 2. 经过ICP匹配后的两帧点云。

CUDA-Segmentation

点云地图包含大量的地面点,不仅会使得地图变的杂乱,也会干扰之后的点云的分类和识别。因此在实际处理中,我们会首先使用点云分割移除点云中的地面。CUDA-Segmentation 使用随机样本一致性算法(random sample consensus, Ransac)进行点云的分割。

使用CUDA- Segmentation

以下代码是CUDA Segmentation的使用实例。

我们直接初始化对象并调用相关的接口函数即可。

  //Now Just support: SAC_RANSAC + SACMODEL_PLANE
  std::vector indexV;
  cudaSegmentation cudaSeg(SACMODEL_PLANE, SAC_RANSAC, stream);
  segParam_t setP;
  setP.distanceThreshold = 0.01; 
  setP.maxIterations = 50;
  setP.probability = 0.99;
  setP.optimizeCoefficients = true;
  cudaSeg.set(setP);
  cudaSeg.segment(input, nCount, index, modelCoefficients);
  for(int i = 0; i < nCount; i++)
  {
    if(index[i] == 1) 
    indexV.push_back(i);
  }

CUDA Segmentation分割拥有nCount个的点云,并输出索引表index用于指示输入点云中的被分割掉的点和modelCoefficients用于指示寻找的平面公式。

typedef struct {
  double distanceThreshold; 
  int maxIterations;
  double probability;
  bool optimizeCoefficients;
} segParam_t;

class cudaSegmentation
{
public:
    //Now Just support: SAC_RANSAC + SACMODEL_PLANE
    cudaSegmentation(int ModelType, int MethodType, cudaStream_t stream = 0);

    ~cudaSegmentation(void);

    /*
    Input:
        cloud_in: data pointer for points cloud
        nCount: count of points in cloud_in
    Output:
        Index: data pointer which has the index of points in a plane from input
      modelCoefficients: data pointer which has the group of coefficients of the plane
    */
    int set(segParam_t param);
    void segment(float *cloud_in, int nCount,
            int *index, float *modelCoefficients);
private:
    void *m_handle = NULL;
}; 

让我们查看下面的实例,第一张图是原始的点云,第二张图是经过算法寻找到的平面。这是一个非常典型的平面移除的应用。

Figure 3. cuda-segmentaion处理之前的点云。

Figure 4. cuda-segmentaion找到的点云平面。

CUDA-Filter

滤波器是在分割,检测和识别之前,点云数据中最重要的处理。

带通点云滤波是最简单的方法,仅仅是过滤X,Y和Z轴方向的点云。

目前CUDA-Filter仅支持带通操作,更多的滤波器会在后续加入。

使用CUDA- Filter

这个是CUDA Filter的使用实例。

我们仅仅需要初始化对象并调用相关的接口函数即可。

我们仅仅需要初始化对象并调用相关的接口函数即可。

  cudaFilter filterTest(stream);
  FilterParam_t setP;
  FilterType_t type = PASSTHROUGH;
  setP.type = type;
  setP.dim = 2;
  setP.upFilterLimits = 1.0;
  setP.downFilterLimits = 0.0;
  setP.limitsNegative = false;
  filterTest.set(setP);
  filterTest.filter(output, &countLeft, input, nCount);

CUDA-Filter使用指定的参数过滤nCount有个点的点云数据,过滤后输出的点云数量为countLeft。


typedef struct {
    FilterType_t type;
    //0=x,1=y,2=z
    int dim;
    float upFilterLimits;
    float downFilterLimits;
    bool limitsNegative;

} FilterParam_t;

class cudaFilter
{
public:
    cudaFilter(cudaStream_t stream = 0);
    ~cudaFilter(void);
    int set(FilterParam_t param);
    /*
    Input:
        source: data pointer for points cloud
        nCount: count of points in cloud_in
    Output:
        output: data pointer which has points filtered by CUDA
        countLeft: count of points in output
    */
    int filter(void *output, unsigned int *countLeft, void *source, unsigned int nCount);

    void *m_handle = NULL;
}; 

让我们看下X轴方向的带通滤波实例。

Figure 5. 原始点云。

Figure 6. X周过滤后的数据。

开始使用 CUDA-PCL

我们希望通过本文介绍使用CUDA-PCL从而获得更好的点云处理性能。

因为PCL在Jetson上无法使用CUDA进行点云的加速处理,所以我们开发了基于CUDA的点云处理库CUDA-PCL。

关于作者

范磊是英伟达高级CUDA软件工程师,在TSE China 小组致力于CUDA软件方案的开发和优化。

李雨倩负责基于Jetson的自主机器解决方案和生态发展建设,让开发者在Jetson上开发机器人应用获得更好更全面的体验和支持。

审核编辑:郭婷

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 激光雷达
    +关注

    关注

    968

    文章

    3972

    浏览量

    189927
  • CUDA
    +关注

    关注

    0

    文章

    121

    浏览量

    13626
收藏 人收藏

    评论

    相关推荐

    GPU加速服务器怎么用的

    GPU加速服务器是将GPU硬件与计算服务相结合,通过服务提供商的平台,用户可以根据需求灵活租用带有GPU资源的虚拟机实例。那么,GPU加速
    的头像 发表于 12-26 11:58 45次阅读

    数据库和主机哪个好一

    数据库和主机哪个好一主机和数据库各有优势,选择哪个更好取决于具体需求。主机提供虚拟
    的头像 发表于 12-04 13:50 130次阅读

    基于深度学习的三维分类方法

    近年来,云表示已成为计算机视觉领域的研究热点之一,并广泛应用于自动驾驶、虚拟现实、机器人等许多领域。虽然深度学习技术在处理常规结构化的二维网格图像数据方面取得了巨大成功,但在处理不规则、非结构化的
    的头像 发表于 10-29 09:43 458次阅读
    基于深度学习的三维<b class='flag-5'>点</b><b class='flag-5'>云</b>分类方法

    有没有大佬知道NI vision 有没有办法通过gpu和cuda加速图像处理

    有没有大佬知道NI vision 有没有办法通过gpu和cuda加速图像处理
    发表于 10-20 09:14

    怎么在TMDSEVM6678: 6678自带的FFT接口和CUDA提供CUFFT函数库选择?

    请教一下gpgpu上包括4个Riscv cpu和一个DPU, 没有6678,要替换原来信号处理用的6678,该怎么在6678自带的FFT接口和CUDA提供CUFFT函数库选择?
    发表于 09-27 07:20

    LiDAR激光数据处理软件处理流程

    、形状等信息。LiDAR技术在地形测绘、城市规划、林业、交通、考古等领域有着广泛的应用。本文将介绍LiDAR激光数据处理软件的处理流程。 一、LiDAR数据采集 飞行平台选择:Li
    的头像 发表于 08-29 17:05 1040次阅读

    如何理解计算?

    据的安全性。 **高性能计算:**计算平台提供高性能的计算资源,用于处理复杂的科学和工程计算任务。用户可以使用平台来进行高性能计算、模拟和仿真,加速科学研究和工程设计的进程。 **
    发表于 08-16 17:02

    打破英伟达CUDA壁垒?AMD显卡现在也能无缝适配CUDA

    电子发烧友网报道(文/梁浩斌)一直以来,围绕CUDA打造的软件生态,是英伟达在GPU领域最大的护城河,尤其是随着目前AI领域的发展加速,市场火爆,英伟达GPU+CUDA的开发生态则更加稳固,AMD
    的头像 发表于 07-19 00:16 4694次阅读

    软件生态上超越CUDA,究竟有多难?

    神坛的,还是围绕CUDA打造的一系列软件生态。   英伟达——CUDA的绝对统治   相信对GPU有过一定了解的都知道,英伟达的最大护城河就是CUDACUDA在后端架构上处于绝对的统
    的头像 发表于 06-20 00:09 3640次阅读

    友思特案例 | 自研创新!三维工件尺寸测量及处理解决方案

    3D相机等新型传感器的发展克服了传统工件尺寸测量的各种局限,可获取丰富的三维数据。友思特提供了一种工件3D尺寸测量和处理方案,结合自
    的头像 发表于 06-13 14:13 477次阅读
    友思特案例 | 自研创新!三维工件尺寸测量及<b class='flag-5'>点</b><b class='flag-5'>云</b><b class='flag-5'>处理</b>解决方案

    加速一键智能上耀 X 实例显真功夫

    ,推出了下一代柔性算力新物种——华为耀服务器 X 实例(以下简称:耀 X 实例),助力企业
    的头像 发表于 05-27 18:20 2155次阅读
    <b class='flag-5'>加速</b>一键智能上<b class='flag-5'>云</b>,<b class='flag-5'>云</b>耀 X 实例显真功夫

    借助NVIDIA Aerial CUDA增强5G/6G的DU性能和工作负载整合

    Aerial CUDA 加速无线接入网 (RAN)可加速电信工作负载,使用 CPU、GPU 和 DPU 在云原生加速计算平台上提供更高水平的频谱效率 (SE)。
    的头像 发表于 05-24 11:10 576次阅读
    借助NVIDIA Aerial <b class='flag-5'>CUDA</b>增强5G/6G的DU性能和工作负载整合

    NVIDIA 通过 CUDA-Q 平台为全球各地的量子计算中心提供加速

    加速的高性能计算系统中的量子处理器(QPU)。   QPU 是量子计算机的大脑,通过利用电子或光子等粒子行为进行
    发表于 05-13 15:21 200次阅读
    NVIDIA 通过 <b class='flag-5'>CUDA</b>-Q 平台为全球各地的量子计算中心提供<b class='flag-5'>加速</b>

    Keil使用AC6编译提示CUDA版本过高怎么解决?

    \' ArmClang: warning: Unknown CUDA version 10.2. Assuming the latest supported version 10.1
    发表于 04-11 07:56

    基于深度学习的方法在处理3D进行缺陷分类应用

    背景部分介绍了3D应用领域中公开可访问的数据集的重要性,这些数据集对于分析和比较各种模型至关重要。研究人员专门设计了各种数据集,包括用于3D形状分类、3D物体检测和3D分割等任
    的头像 发表于 02-22 16:16 1159次阅读
    基于深度学习的方法在<b class='flag-5'>处理</b>3D<b class='flag-5'>点</b><b class='flag-5'>云</b>进行缺陷分类应用