一、环境配置
      操作系统: Ubuntu 18.04
      ROS版本: ROS Melodic Morenia

说明: 我仅仅在上述环境下进行了验证调试,其它版本应该也是可以用的。

二、安装教程
       1.  安装好ubuntu系统和ROS环境
       2.  打开终端,并在终端命令行输入以下指令:
       3.  git clone https://gitee.com/wccworld/read_pcd.git
       4.  cd read_pcd/catkin_ws
       5.  catkin_make
       6.  source devel/setup.bash
       7.  roslaunch read_pcd read_pcd.launch

三、核心代码

1.  读取.pcd格式点云文件,并转化为ROS可发布点云格式PointCloud2

/********************************PCD点云获取**********************************************/pcl::PointCloud<PointType>::Ptr pcd_cloud_in (new pcl::PointCloud<PointType>);if (pcl::io::loadPCDFile<PointType> (pcd_doc_path, *pcd_cloud_in) == -1){PCL_ERROR ("Couldn't read file: %s \n", pcd_doc_path.c_str());return (-1);}sensor_msgs::PointCloud2 input_cloud;pcl::toROSMsg(*pcd_cloud_in,input_cloud);input_cloud.header.frame_id = output_frame_id;// read_pcd_pub.publish(input_cloud);
/****************************************************************************************/

2.  直通滤波器对X轴进行滤波(  PCL点云滤波的主要内容、原理和详细使用说明可参考此篇文章  https://zhuanlan.zhihu.com/p/102748557  )

 //  直通滤波器 X 轴滤波 pcl::PointCloud<PointType>::Ptr filter_x (new pcl::PointCloud<PointType>);pcl::PassThrough<PointType> ptx;ptx.setInputCloud(pcd_cloud_in);                 //输入点云ptx.setFilterFieldName("x");                     //对x轴进行操作ptx.setFilterLimits(pass_x_min, pass_x_max);     //设置直通滤波器操作范围// ptx.setFilterLimitsNegative(true);              //设置保留范围内,还是过滤掉范围内ptx.filter(*filter_x);                           //执行滤波,过滤结果保存在filter_x

3.  VoxelGrid滤波器对点云进行下采样

//  体素降采样pcl::PointCloud<PointType>::Ptr vox_cloud(new pcl::PointCloud<PointType>);pcl::VoxelGrid<PointType> vox_grid;vox_grid.setInputCloud(filter_z);vox_grid.setLeafSize(voxel_size, voxel_size, voxel_size); //设置滤波时创建的体素立方体(m)vox_grid.filter(*vox_cloud);

4.  statisticalOutlierRemoval滤波器移除离群点

//  statisticalOutlierRemoval滤波器移除离群点pcl::PointCloud<PointType>::Ptr filtered_cloud(new pcl::PointCloud<PointType>);pcl::StatisticalOutlierRemoval<PointType> sor;   sor.setInputCloud(vox_cloud);                                                 sor.setMeanK(sor_nearby_number);                            //设置在进行统计时考虑查询点临近点数                                              sor.setStddevMulThresh(sor_thresh_value);                   //设置判断是否为离群点的阀值                                           sor.filter(*filtered_cloud);  

5.  点云旋转和平移操作

//  点云旋转和平移操作for(int i = 0; i < filtered_cloud->points.size(); i++) {PointType new_point;double rx_x,rx_y,rx_z,ry_x,ry_y,ry_z,rz_x,rz_y,rz_z;double px = filtered_cloud->points[i].x;double py = filtered_cloud->points[i].y;double pz = filtered_cloud->points[i].z;double pi = filtered_cloud->points[i].intensity;//  点云绕 X 旋转rx_x = px;rx_y = cos(rad(x_rotate_value))*py + (-sin(rad(x_rotate_value)))*pz;rx_z = sin(rad(x_rotate_value))*py + cos(rad(x_rotate_value))*pz;//  点云绕 Y 旋转ry_x = cos(rad(y_rotate_value))*rx_x + (-sin(rad(y_rotate_value)))*rx_z;ry_y = rx_y;ry_z = sin(rad(y_rotate_value))*rx_x + cos(rad(y_rotate_value))*rx_z;//  点云绕 Z 旋转rz_x = cos(rad(z_rotate_value))*ry_x + (-sin(rad(z_rotate_value)))*ry_y;rz_y = sin(rad(z_rotate_value))*ry_x + cos(rad(z_rotate_value))*ry_y;rz_z = ry_z;//  点云整体平移new_point.x = rz_x + x_trans_value;new_point.y = rz_y + y_trans_value;new_point.z = rz_z + z_trans_value;new_point.intensity = pi;handle_cloud->points.push_back(new_point);}

四、使用说明
       找到所下载源码里的read_pcd.launch文件,只需对相应参数进行修改,便可实现PCL点云的滤波、体素降采样、移除离群点、旋转以及平移等操作,具体参数代表的内容如下所示:

<launch><param name="output_frame_id" value = "map" />                   # 设置frame_id<param name="pointCloud_pubTopic" value = "/handle_point" />     # 设置处理后点云的输出话题名<param name="pcd_doc_path" value = "/home/wcc/SLAM/map_result/lio_sam/GlobalMap.pcd" />       # 设置所要加载的PCD文件路径,此处需要用自己的PCD文件路径替换此路径<param name="output_pcd_path" value = "/home/wcc/csdn/read_pcd/catkin_ws/pcd/output.pcd" />   # 设置处理完之后点云输出的PCD文件路径,此处需根据自己的路径进行修改<param name="pass_x_min" value = "-100.0" />      # 设置直通滤波器进行X轴滤波时X的最小值<param name="pass_x_max" value = "100.0" />       # 设置直通滤波器进行X轴滤波时X的最大值<param name="pass_y_min" value = "-100.0" />      # 设置直通滤波器进行Y轴滤波时Y的最小值<param name="pass_y_max" value = "100.0" />       # 设置直通滤波器进行Y轴滤波时Y的最大值<param name="pass_z_min" value = "-1.0" />        # 设置直通滤波器进行Z轴滤波时Z的最小值<param name="pass_z_max" value = "30.0" />        # 设置直通滤波器进行Z轴滤波时Z的最大值<param name="voxel_size" value = "0.1" />         # 设置滤波时创建的体素体积值,单位(M)<param name="sor_nearby_number" value = "10" />   # 设置在进行统计时考虑查询点临近点数<param name="sor_thresh_value" value = "5.0" />   # 设置判断是否为离群点的阀值<param name="x_rotate_value" value = "0.0" />     # 设置整体点云绕X轴旋转的角度值<param name="y_rotate_value" value = "0.0" />     # 设置整体点云绕y轴旋转的角度值<param name="z_rotate_value" value = "0.0" />     # 设置整体点云绕z轴旋转的角度值<param name="x_trans_value" value = "0.0" />      # 设置整体点云绕x轴平移的距离值<param name="y_trans_value" value = "20.0" />     # 设置整体点云绕y轴平移的距离值<param name="z_trans_value" value = "0.0" />      # 设置整体点云绕z轴平移的距离值<node pkg="read_pcd" name="read_pcd" type="read_pcd" output="screen" /><node pkg="rviz" type="rviz" name="rviz" args="-d $(find read_pcd)/rviz/read_pcd.rviz" />
</launch>

五、结果展示

rviz显示.pcd格式原始点云

rviz显示.pcd格式处理之后的点云

六、源码链接

https://gitee.com/wccworld/read_pcd

七、总结

       创作不易,代码完全开源,可随意更改学习和使用!

ROS环境下采用PCL点云库对PCD格式点云进行滤波、旋转和平移等处理,并用RVIZ实时显示相关推荐

  1. 从bag包中提取图片和点云数据为pcd格式点云文件

    从bag包中提取图片和点云数据为pcd格式点云文件 1 开始提取bag包之前的准备工作 2 从bag包中提取图片和点云数据 首先说明一下我运行的系统环境: python2 Ubuntu18.04 RO ...

  2. ubuntu 20.04 ROS 环境下 使用 velodyne

    ubuntu 20.04 ROS 环境下 使用 velodyne 系统环境配置 硬件连接 网口配置 运行驱动程序 通过rviz可视化点云 系统环境配置 安装ROS依赖 sudo apt install ...

  3. WHEELTEC N100惯导模块在ROS环境下如何使用?

    文章目录 0.引言 1.惯导模块介绍 2.惯导模块连接端口测试 3.配置惯导模块的ROS驱动功能包 4.惯导模块数据输出和可视化 0.引言   之前采用的惯导模块为ICM20948 IMU模块(模块精 ...

  4. ros环境下配置orb-slam2遇到的问题

    第一次写博客,记录一下ros配置orb-slam2的过程与问题,配置过程都是参考各路大神.环境是VMware,Ubuntu18.04,ROS Melodic. Ubuntu18.04配置ros环境参考 ...

  5. ROS环境下Baxter机器人控制记录

    1.前记: 这篇博文为自己学习是的记录,做这一切的目的就是熟悉ROS环境下如何控制Baxter机器人做运动.以便将来对其控制的扩展,如基于视觉(单目,双目,或Kinect)交互的控制,基于leap m ...

  6. python控制机械臂6轴_在ROS环境下,怎么使用moveit!来驱动真实的六轴机械臂?

    很多小伙伴在使用ROS的时候,都会产生类似的疑问,程序写过那么多,仿真也跑过不少,但是如何控制真实机械臂/机器人呢? 今天古月君就来尝试破个题. 首先,解决这个问题的关键词是"接口" ...

  7. ROS环境下Pixhawk+XPlane半实物仿真

    使用pixhawk作为飞控开发固定翼飞机的相关应用时,半实物的仿真环境可以很好的模拟真实的飞行环境.本文介绍了借助Mavros软件包实现ROS环境下机载处理的半实物仿真环境搭建. 实验所需软硬件:pi ...

  8. 多版本Visual Studio 集成环境下的WCF 开发-服务库默认配置表

    多版本Visual Studio 集成环境下的WCF 开发-服务库默认配置表 Visual Studio2008 Visual Studio2008只有服务库,而没有服务应用程序,其服务库生成配置文件 ...

  9. 在ROS环境下使用KCF算法追踪图像

    在ROS环境下使用KCF算法追踪图像 项目是基于dji的[DJI Onboard SDK](dji-sdk/Onboard-SDK: DJI Onboard SDK Official Reposito ...

  10. ROS环境下的串口通讯

    目录 1.前言 2.内容 2.1 准备工作 2.1.1 连接外部USB设备 2.1.2 串口调试工具的下载 2.1.3 serial库的安装 2.2 代码部分 2.2.1 编写发布节点 2.2.2 编 ...

最新文章

  1. 谷歌开源框架 FUSS,让声音分离不再成为难题
  2. SqlServer_Case_When用法
  3. python2和3的编码区别_Python2和3字符编码的区别
  4. 【CV秋季划】深度学习换脸算法视频更新
  5. tmpfs加速并降低squid负载(一)
  6. 【MFC】自绘对话框动画效果的状态栏
  7. 使用 SAP Cloud SDK 连接 OData 服务
  8. c++ 设置类型别名
  9. 2018谷歌学术影响因子发布:CVPR排名泛AI领域第一
  10. web逻辑思维题目_逻辑思维训练500题以及答案
  11. 【校招VIP】产品行测考察之逻辑推理
  12. Netty实现自定义协议和源码分析
  13. 史上最健康的养胃时间表
  14. 手把手带你从0完成医疗行业影像图像检测三大经典模型InceptionV3-RestNet50-VGG16(附python源代码及数据库)——改变世界经典人工智能项目实战(一)手把手教学迁移学习
  15. 【AI应用】NVIDIA GeForce RTX 3060的详情参数
  16. 【建议收藏】一文了解FPC柔性电路板(5.29更新)
  17. uniapp微信公众号h5接入网易七鱼客服系统
  18. 前端模块化 AMD 详解
  19. 搜索网站/论坛内容帖子
  20. 如何在独显电脑上让PotPlayer输出5.1声道音频到JBL CINEMA 615音响

热门文章

  1. java图片处理,文字自动换行
  2. 基于SSH框架的人力资源管理系统设计与实现
  3. netlogo-入门-学习记录
  4. Java 点餐小程序源码带管理后台(免费分享)
  5. Android截图功能
  6. J2ME基本术语词典(05/06/09)
  7. 键盘ASCII对照表
  8. 基于STM32的PWM电机驱动TB6612、A4950
  9. 映美精IC Imageing Control .net控件调试问题
  10. python通达信,显示K线图