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上开发机器人应用获得更好更全面的体验和支持。

审核编辑:郭婷

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

    关注

    977

    文章

    4377

    浏览量

    195358
  • CUDA
    +关注

    关注

    0

    文章

    125

    浏览量

    14402
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    NVIDIA Jetson AGX Thor Developer Kit开发环境配置指南

    NVIDIA Jetson AGX Thor 专为物理 AI 打造,与上一代产品 NVIDIA Jetson AGX Orin 相比,生成式 AI 性能最高提升至 5 倍。通过发布后的软件更新优化,Jetson Thor 的生成
    的头像 发表于 11-08 09:55 5976次阅读
    NVIDIA <b class='flag-5'>Jetson</b> AGX Thor Developer Kit开发环境配置指南

    【CIE全国RISC-V创新应用大赛】+基于MUSE Pi Pro的3d激光里程计实现

    ├── USB 3.0接口 ← IMU数据通道 └── 电源管理模块 软件架构 应用层: Point-LIO里程计节点 ↓ 中间件层: ROS2通信框架 + PCL处理库 ↓
    发表于 10-24 17:02

    BPI-AIM7 RK3588 AI与 Nvidia Jetson Nano 生态系统兼容的低功耗 AI 模块

    应用。 []() AIM-IO是一款专为 Jetson Nano 生态系统设计的开源扩展板。它与 RK3588 AI Module7 配合使用,为您提供一个微型 AI 开发平台,支持定制载板开发,并加速机器
    发表于 10-11 09:08

    什么是加速加速的重点选购指标是哪些?

    加速是提升网站、APP访问速度的关键工具,很多人却搞不清它的作用和选购要点。本文 华纳 会先用通俗语言解释加速是什么,再拆解选购时必看
    的头像 发表于 09-12 16:29 754次阅读

    ADI借助NVIDIA Jetson Thor平台加速人形机器人研发进程

    当前,人形机器人正逐步迈向实际应用部署阶段,其落地节奏取决于物理智能与实时推理能力的发展。随着NVIDIA Jetson Thor平台的正式面市,Analog Devices, Inc. (ADI)将进一步加速人形机器人与自主移动机器人(AMR)的研发进程。
    的头像 发表于 08-29 14:07 2629次阅读

    基于 NVIDIA Blackwell 的 Jetson Thor 现已发售,加速通用机器人时代的到来

    ·专为物理 AI 和机器人打造的机器人计算机 NVIDIA Jetson AGX Thor 开发者套件和量产级模组,现已发售。 ·超过 200 万开发者正在使用 NVIDIA 的机器人技术栈,联影
    发表于 08-26 09:28 1197次阅读
    基于 NVIDIA Blackwell 的 <b class='flag-5'>Jetson</b> Thor 现已发售,<b class='flag-5'>加速</b>通用机器人时代的到来

    AI 驱动三维逆向:降噪算法工具与机器学习建模能力的前沿应用

    在三维逆向工程领域,传统方法在处理复杂数据和构建高精度模型时面临诸多挑战。随着人工智能(AI)技术的发展,降噪算法工具与机器学习建模能力的应用,为三维逆向工程带来了创新性解决方案,显著提升
    的头像 发表于 08-20 10:00 449次阅读
    AI 驱动三维逆向:<b class='flag-5'>点</b><b class='flag-5'>云</b>降噪算法工具与机器学习建模能力的前沿应用

    NVIDIA Jetson + Isaac SDK 人形机器人方案全面解析

    SDK + Isaac Sim :专为机器人打造的软件开发平台,支持 ROS、实时感知、动作规划和 AI 强化学习 二、Jetson 芯片系列对比 型号 GPU (CUDA) CPU AI级别
    的头像 发表于 07-30 16:12 1844次阅读

    Jetson平台核心组件BOM清单概览

    Jetson平台核心组件BOM清单概览 NVIDIA Jetson系列作为业界领先的边缘计算和人工智能(AI)平台,其强大的性能背后是一系列精心挑选的核心芯片、电源管理集成电路(PMIC)以及丰富
    的头像 发表于 07-30 16:11 2434次阅读

    NVIDIA Jetson + Isaac SDK 在人形机器人领域的方案详解

    机器人感知、导航、运动控制、任务规划的模块化开发框架和物理仿真环境 二、Jetson 系列芯片型号对比表 型号 GPU (CUDA 核心) CPU AI性能(TOPS) 功耗(W) 典
    的头像 发表于 07-30 16:05 3127次阅读

    PCl Express M.2规格书

    电子发烧友网站提供《PCl Express M.2规格书.pdf》资料免费下载
    发表于 06-25 15:41 0次下载

    使用NVIDIA CUDA-X库加速科学和工程发展

    NVIDIA GTC 全球 AI 大会上宣布,开发者现在可以通过 CUDA-X 与新一代超级芯片架构的协同,实现 CPU 和 GPU 资源间深度自动化整合与调度,相较于传统加速计算架构,该技术可使计算工程工具运行速度提升至原来的 11 倍,计算规模增加至 5 倍。
    的头像 发表于 03-25 15:11 1202次阅读

    骥智行借助NVIDIA Jetson打造“域脑”通用计算平台

    本案例中,骥智行(Pegasus Technology)借助 NVIDIA Jetson 打造“域脑”通用计算平台,实现了在人形机器人、智能新终端等具身智能场景的部署应用,满足多场景算力需求,保障系统安全稳定运行并推动功能拓展。
    的头像 发表于 02-21 11:41 1469次阅读

    操作指南:pytorch服务器怎么设置?

    设置PyTorch服务器需选择平台,创建合适的GPU实例,安装操作系统、Python及Anaconda,创建虚拟环境,根据CUDA版本安装PyTorch,配置环境变量,最后验证安装。过程中需考虑
    的头像 发表于 02-08 10:33 605次阅读

    GPU加速服务器怎么用的

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