ROS环境下采用PCL点云库对PCD格式点云进行滤波、旋转和平移等处理,并用RVIZ实时显示
一、环境配置
操作系统: 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>
五、结果展示
六、源码链接
https://gitee.com/wccworld/read_pcd
七、总结
创作不易,代码完全开源,可随意更改学习和使用!
ROS环境下采用PCL点云库对PCD格式点云进行滤波、旋转和平移等处理,并用RVIZ实时显示相关推荐
- 从bag包中提取图片和点云数据为pcd格式点云文件
从bag包中提取图片和点云数据为pcd格式点云文件 1 开始提取bag包之前的准备工作 2 从bag包中提取图片和点云数据 首先说明一下我运行的系统环境: python2 Ubuntu18.04 RO ...
- ubuntu 20.04 ROS 环境下 使用 velodyne
ubuntu 20.04 ROS 环境下 使用 velodyne 系统环境配置 硬件连接 网口配置 运行驱动程序 通过rviz可视化点云 系统环境配置 安装ROS依赖 sudo apt install ...
- WHEELTEC N100惯导模块在ROS环境下如何使用?
文章目录 0.引言 1.惯导模块介绍 2.惯导模块连接端口测试 3.配置惯导模块的ROS驱动功能包 4.惯导模块数据输出和可视化 0.引言 之前采用的惯导模块为ICM20948 IMU模块(模块精 ...
- ros环境下配置orb-slam2遇到的问题
第一次写博客,记录一下ros配置orb-slam2的过程与问题,配置过程都是参考各路大神.环境是VMware,Ubuntu18.04,ROS Melodic. Ubuntu18.04配置ros环境参考 ...
- ROS环境下Baxter机器人控制记录
1.前记: 这篇博文为自己学习是的记录,做这一切的目的就是熟悉ROS环境下如何控制Baxter机器人做运动.以便将来对其控制的扩展,如基于视觉(单目,双目,或Kinect)交互的控制,基于leap m ...
- python控制机械臂6轴_在ROS环境下,怎么使用moveit!来驱动真实的六轴机械臂?
很多小伙伴在使用ROS的时候,都会产生类似的疑问,程序写过那么多,仿真也跑过不少,但是如何控制真实机械臂/机器人呢? 今天古月君就来尝试破个题. 首先,解决这个问题的关键词是"接口" ...
- ROS环境下Pixhawk+XPlane半实物仿真
使用pixhawk作为飞控开发固定翼飞机的相关应用时,半实物的仿真环境可以很好的模拟真实的飞行环境.本文介绍了借助Mavros软件包实现ROS环境下机载处理的半实物仿真环境搭建. 实验所需软硬件:pi ...
- 多版本Visual Studio 集成环境下的WCF 开发-服务库默认配置表
多版本Visual Studio 集成环境下的WCF 开发-服务库默认配置表 Visual Studio2008 Visual Studio2008只有服务库,而没有服务应用程序,其服务库生成配置文件 ...
- 在ROS环境下使用KCF算法追踪图像
在ROS环境下使用KCF算法追踪图像 项目是基于dji的[DJI Onboard SDK](dji-sdk/Onboard-SDK: DJI Onboard SDK Official Reposito ...
- ROS环境下的串口通讯
目录 1.前言 2.内容 2.1 准备工作 2.1.1 连接外部USB设备 2.1.2 串口调试工具的下载 2.1.3 serial库的安装 2.2 代码部分 2.2.1 编写发布节点 2.2.2 编 ...
最新文章
- 谷歌开源框架 FUSS,让声音分离不再成为难题
- SqlServer_Case_When用法
- python2和3的编码区别_Python2和3字符编码的区别
- 【CV秋季划】深度学习换脸算法视频更新
- tmpfs加速并降低squid负载(一)
- 【MFC】自绘对话框动画效果的状态栏
- 使用 SAP Cloud SDK 连接 OData 服务
- c++ 设置类型别名
- 2018谷歌学术影响因子发布:CVPR排名泛AI领域第一
- web逻辑思维题目_逻辑思维训练500题以及答案
- 【校招VIP】产品行测考察之逻辑推理
- Netty实现自定义协议和源码分析
- 史上最健康的养胃时间表
- 手把手带你从0完成医疗行业影像图像检测三大经典模型InceptionV3-RestNet50-VGG16(附python源代码及数据库)——改变世界经典人工智能项目实战(一)手把手教学迁移学习
- 【AI应用】NVIDIA GeForce RTX 3060的详情参数
- 【建议收藏】一文了解FPC柔性电路板(5.29更新)
- uniapp微信公众号h5接入网易七鱼客服系统
- 前端模块化 AMD 详解
- 搜索网站/论坛内容帖子
- 如何在独显电脑上让PotPlayer输出5.1声道音频到JBL CINEMA 615音响