【点云处理】点云法向量估计及其加速(4)

news2024/10/5 20:20:51

    上篇文章【点云处理】点云法向量估计及其加速(3)介绍了如何使用pcl提供的gpu版本法向量计算接口对点云发向量计算进行加速。不足之处在于点云k近邻查找依然比较耗时,成为影响整体计算性能的瓶颈。这篇文章就如何优化点云K近邻查找效率进行实验。上一篇文章的示例代码中knn算法实际上主要是分为两个部分:1).KDTree建树;2).根据建好的KDTree做k近邻搜索,从而建立k近邻表。

  for (auto i=0; i<cloud_size; i++) {
            kdtree->nearestKSearch(cloud->points[i], 10, neighbors_all[i], dists);
            sizes[i] = neighbors_all[i].size();
  }

我们应该注意到,k近邻搜索这一步我们只是简简单单使用了一个for循环进行逐个点云的搜索,完全没有考虑到这一查找过程的可并行性,所以这里我们首先尝试使用多线程对这一过程进行提速。当我们考虑多线程时可以使用boost::thread库或者自从C++ 11开始支持的std::thread,也可以使用操作系统相关的线程API,如在Linux上,可以使用pthread库。除此之外,还可以使用omp来使用多线程。它的好处是跨平台,使用简单。这里直接使用OpenMP提供的parallel编译指示命令"#pragma omp parallel for"来告诉编译器对后面的for并行执行。编译器会创建一个包含N(在运行时决定,通常为服务器的逻辑核数)个线程的先成组,由他们来并行地运行后面的for语句块。

# pragma omp parallel for          
        for (auto i=0; i<cloud_size; i++) {
            std::vector<float> dists;
            kdtree->nearestKSearch(cloud->points[i], 10, neighbors_all[i], dists);
            sizes[i] = neighbors_all[i].size();
        }                       

ok,再次编译运行。

并没有什么卵用!!OpenMP多线程没起作用?从处理器的资源利用来看"看上去"是用上了,每个核都分担了压力。

                                                                                 图:无omp加速

                                                                                  图:有omp加速 

通过简单调试也可以证实是用上了,因为结果是乱序的。

​
 28     # pragma omp parallel for                        
 29         for (auto i=0; i<cloud_size; i++) {          
 30             std::vector<float> dists;                
 31             kdtree->nearestKSearch(cloud->points[i], 10, neighbors_all[i], dists);
 32             sizes[i] = neighbors_all[i].size();      
 33             printf("point[%d] is processing...\n", i);
 34         }                 

​

point[53295] is processing...
point[21318] is processing...
point[42636] is processing...
point[31977] is processing...
point[53296] is processing...
point[21319] is processing...
point[53297] is processing...
point[31978] is processing...
point[21320] is processing...
point[53298] is processing...
好吧,至于这种方式为什么没效果,我也不知道了。Do you known?

【补充:我项目中用到的CMakeLists.txt】

cmake_minimum_required(VERSION 3.0.2)
project(calc_normal)

### Compile as C++14, supported in ROS Kinetic and newer
add_compile_options(-std=c++14)
SET(CMAKE_BUILD_TYPE RELEASE CACHE STRING "Set build type release" FORCE)

option(USE_DEBUG "Debug Code" OFF)
option(USE_OPENMP "Use OpenMP" ON)

if(USE_DEBUG)
    add_definitions(-DUSE_DEBUG)
endif()

if(USE_OPENMP)
    find_package(OpenMP REQUIRED)
    if(${OPENMP_FOUND})
        message("Find OpenMP")
        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
        set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
    endif()
endif(USE_OPENMP)

find_package(CUDA REQUIRED)
find_package(PCL 1.11 REQUIRED)
if(NOT ${PCL_FOUND})
    message("PCL 1.11 Not Found ...Searching 1.12")
    find_package(PCL 1.12 REQUIRED)
endif(NOT ${PCL_FOUND})

message("PCL_INCLUDE_DIRS" ${PCL_INCLUDE_DIRS})
include_directories(${PCL_INCLUDE_DIRS})
message("PCL_LIBRARY_DIRS" ${PCL_LIBRARY_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})

find_package(catkin REQUIRED COMPONENTS
  roscpp
  std_msgs
  message_generation
  sensor_msgs
)

catkin_package(
    CATKIN_DEPENDS
    message_runtime
)

if(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")
    message("embed_platform on")
    include_directories(${CUDA_INCLUDE_DIRS})
    link_directories(/usr/local/cuda/targets/aarch64-linux/lib)
    link_directories(/usr/local/cuda/lib64)
    set(CUDA_GEN_CODE "-gencode=arch=compute_72,code=sm_72")
    set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS}  ${CUDA_GEN_CODE}")
else()
    message("embed_platform off")
    include_directories(${CUDA_INCLUDE_DIRS})
    link_directories(/usr/local/cuda/lib64)
    set(CUDA_GEN_CODE "-gencode=arch=compute_75,code=sm_75")
    set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS}  ${CUDA_GEN_CODE}")
endif()

include_directories(
    ${catkin_INCLUDE_DIRS}
)

file(GLOB_RECURSE PROJECT_SRC 
    ./src/*.cpp
)

cuda_add_executable(${PROJECT_NAME} src/main.cpp ${PROJECT_SRC})

## Specify libraries to link a library or executable target against
target_link_libraries(${PROJECT_NAME} cudart)
target_link_libraries(${PROJECT_NAME} ${catkin_LIBRARIES})
target_link_libraries(${PROJECT_NAME} ${PCL_LIBRARIES})

if(USE_OPENMP)
    if(${OpenMP_FOUND})
       target_link_libraries(${PROJECT_NAME} OpenMP::OpenMP_CXX)
    endif()
endif(USE_OPENMP)

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/37588.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

redis数据库的下载安装/免安装版

文章目录下载方式一下载方式二免安装版redis是一款高性能的NOSQL系列的非关系型数据库这里分享三个下载源&#xff0c;只介绍免安装版下载方式一 官网下下载https://redis.io&#xff08;国外网站下载速度比较慢&#xff09; 下载方式二 Redis中文网http://www.redis.net.cn…

想你所想,华为云桌面Workspace助你轻松办公

想你所想&#xff0c;华为云桌面Workspace助你轻松办公 双11作为近年来最受关注的购物季&#xff0c;从最开始的电商&#xff0c;到现在各行各业纷纷下场推出活动&#xff0c;期望在此段时间内迅速积累用户&#xff0c;从而提升产品知名度和用户基础。华为云也不例外&#xff0…

学生个人博客网页设计作品 学生个人网页模板 个人网页制作 HTML学生个人网站作业设计

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

应用商店的ASO和搜索引擎的SEO的区别

ASO和SEO&#xff0c;目标相似&#xff0c;有着异曲同工之妙&#xff0c;两者都是提高搜索排名的方式&#xff0c;具体有什么区别呢&#xff1f;今天柚鸥ASO给大家做一下总结。 SEO是指搜索引擎优化&#xff0c;利用搜索引擎的规则来提高网站&#xff08;例如&#xff1a;百度…

室内定位解决方案-最新全套文件

室内定位解决方案-最新全套文件一、建设背景二、建设思路三、建设方案四、获取 - 室内定位全套最新解决方案合集一、建设背景 室内定位顾名思义就是定位室内目标对象的位置&#xff0c;可以是人也可以是物体的位置的一种技术方案&#xff0c;根据定位精度的不同&#xff0c;被…

C++ Primer Plus第五版笔记(p1-50)

1 在unix中 echo 获得状态 2iostream 包含istream以及ostream:随着时间的推移&#xff0c;字符是按照顺序生成或者是消耗的 3cin标准输入 cout标准输出 Cerr标准错误 clog 一般性信息 4cin>>c1>>c2&#xff1b;连续输入 5cout是ostream的对象&#xff0c;第一个<…

VirtualBox安装openEuler

下载&#xff1a; https://www.openeuler.org/zh/mirror/list/ 根据设备架构选择对应的版本&#xff1a;windows是x86架构 选择下面这个4.2G大小的&#xff1a; 安装&#xff1a; 1&#xff0c;点击新建&#xff1a; 按下图设置 设置内存大小&#xff0c;使用的cpu数…

SpringBoot项目在使用Maven打包war中遇到的问题

问题描述 在使用maven打包&#xff08;package&#xff09;springboot项目为war项目后&#xff0c;在本地机器上使用Tomcat跑这个项目&#xff0c;访问资源时出现下面的错误&#xff1a; o.s.b.w.servlet.support.ErrorPageFilter : Cannot forward to error page for reque…

TIKTOK出海公会为什么是2022出海风口?有哪些机遇与挑战?

近两年在全球迅速扩张市场的TIKTOK一举跃为全球下载量第一的APP&#xff0c;背靠十几亿月活用户的流量矿山&#xff0c;成为首个非Facebook系达成此成就的应用&#xff0c;可谓是赚足了全世界的目光。与此同时&#xff0c;大量跨境商家与自媒体从业者也盯上了TIKTOK的造富潜力&…

zlib-1.2.11库、libpng-1.6.36库编译及交叉编译 —— 附带shell编译脚本及源码

目录 一、zlib-1.2.11库编译 二、libpng-1.6.36库编译 三、编译zlib和libpng的编译脚本 编译libpng库之前需要先下载编译zlib库&#xff0c;因为libpng需要依赖zlib才能编译通过。 编译环境如下&#xff1a;ubunt 14.04、gcc 4.8.4、arm-hisiv100nptl-linux-gcc 一、zlib-1.2…

SAP S4客户与供应商如何管理 事务代码 BP

在 S4里里面&#xff0c; “客户”与“供应商”的概念被整合为为“业务伙伴”了 &#xff0c;所以SAP也用也新的事务代码来管理“业务伙伴” 新的业务代码是BP 。 在旧版本的SAP里面采用供应商和客户的方式来管理业务伙伴&#xff0c;有一些弊端&#xff0c;例如&#xff1a; 1…

[附源码]java毕业设计源冀平行进口车系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

二、进程管理(三)同步与互斥

目录 3.1 临界资源与临界区 3.2 同步与互斥概念 3.3 实现临界区互斥的基本方法 3.3.1 软件实现方法 3.3.1.1 单标志法 3.3.1.2 双标志先检查法 3.3.1.3 双标志后检查法 3.3.1.4 Peterson算法 3.3.2 硬件实现方法 3.3.2.1 中断屏蔽方法 3.3.2.2 硬件指令方法之TestAn…

使用DIV、CSS技术设计的个人博客网页(web期末考试)

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

GANs综述

生成式对抗网络GANs及其变体 基础GAN 生成式对抗网络&#xff0c;是lan Goodfellow 等人在2014年开发的&#xff0c;GANs 属于生成式模型&#xff0c;GANs是基于最小值和最大值的零和博弈理论。 为此&#xff0c;GANs是由两个神经网络组成一个Generator。另一个是Discriminat…

dolphinscheduler 2.0.5和2.0.6 体验记录及优化扩展(任务出现kill状态、未设置延时执行出现延时执行、系统变量扩展)

目录&#x1f42c;未停止工作流的情况下出现kill状态的任务实例&#x1f42c;未设置延时执行出现延时执行&#x1f420;集群服务器时间有误差导致的&#x1f420;优化&#xff1a;增加延时时间判断&#x1f42c;系统变量&#x1f420;第N周扩展*️⃣主目录&#xff1a;dolphins…

Kettle:跨库(SQLServer-PostgreSQL)同步多张表数据的详细设计过程

〇、参考地址 1、多个Excel实现同步 https://www.wangt.cc/2021/05/kettle%E5%A4%9A%E4%B8%AA%E8%A1%A8%E4%B8%80%E8%B5%B7%E8%BF%81%E7%A7%BB-%E9%80%9A%E8%BF%87%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E9%85%8D%E7%BD%AE%E9%9C%80%E8%A6%81%E5%90%8C%E6%AD%A5%E7%9A%84%E5%AD…

Java搭建实战基于若依springboot二次开发WMS带移动端管理系统vue源码

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 有个朋友发了一套基于若依开发的springboot源码给我&#xff0c;让我帮忙看一下&#xff0c;录制一期视频教程出来&#xff0c;我看了一下&#xff0c;系统是前后端分离的架构&#xff0c;前端使用Vue2&#xff0…

Ubuntu20.04安装graph-tool

目录step1&#xff1a;查看系统发行版本step2: 在 /etc/apt/sources.list文件中添加一行step3: 下载密钥step4: 更新apt-getstep5: 下载graph-toolstep6&#xff1a;移动graph-tool包到anaconda下step7: 测试是否安装成功链接: 官方安装教程注&#xff1a;如果下列过程中出现权…

cesium在地形上贴地添加各种entity

目录 添加带标签的点 添加billboard 添加corridor 添加面polygon 添加带图片的面polygon 添加矩形 添加glb模型 被遮挡的线用其他颜色标注 添加贴地线 官方示例&#xff1a;Cesium Sandcastlehttps://sandcastle.cesium.com/?srcClamp%20to%20Terrain.html&labelTutor…