激光雷达bag文件播放和转PCD文件,以及基于PCL的PCD文件的读取与显示

一  ros的rviz能够播放bag

1.运行ros: $ roscore

2.运行rviz: $ rosrun rviz rviz

3.运行rosbag: $ rosbag play XXX.bag

rviz需要添加PointCloud2,然后再PointCloud2的属性里面的Topic选择对应的topic。

 

二  bag文件转PCD文件

参考:http://wiki.ros.org/pcl_ros
方法一:
bag_to_pcd
$ rosrun pcl_ros bag_to_pcd <input_file.bag> <topic> <output_directory>

example:
$ rosrun pcl_ros bag_to_pcd data.bag /velodyne_points ./pcd


方法二:pointcloud_to_pcd
一个终端通过ros发送messages,如:$ rosbag play XXX.bag

另一个终端接收,如:$ rosrun pcl_ros pointcloud_to_pcd input:=/velodyne_points

ps:还不清楚为啥方法一生成出来的pcd有点问题,虽然后面看的效果都一样


三  基于PCL的PCD文件的读取与显示

环境:Ubuntu14.04

   PCL通过apt-get安装

 

代码:

  参考:https://www.douban.com/group/topic/43580599/?type=like

这段代码的作用是从@训文 提供的PCD文件读取点云数据,并用PCL的可视化模块PCLVisualizer显示出来。 

PCD文件由文件头和数据域组成,文件头存储了点云数据的字段格式信息,如: 
======================================== 
# .PCD v0.7 - Point Cloud Data file format 
VERSION 0.7 
FIELDS x y z rgba 
SIZE 4 4 4 4 
TYPE F F F U 
COUNT 1 1 1 1 
WIDTH 640 
HEIGHT 480 
VIEWPOINT 0 0 0 0 1 0 0 
POINTS 307200 
DATA binary 
//下面是点云数据段 
… 
======================================== 

通过上面信息可以知道,这个pcd文件存储了每个点的x,y,z坐标以及r,g,b,a颜色信息,共有640*480个数据点,以及它是一个二进制文件。读取pcd时调用loadPCDFile就会自动判断文件的格式类型,我们只需用相应的点云类型进行实例化。点云的类型由pcl/point_types.h这个头文件声明。根据文件信息,我们使用了pcl::PointXYZRGBA导入点云数据。 

读入数据后,可以遍历点云数据,并访问各个域上的值。 

显示使用的是PCL的PCLVisualizer。addCoordinateSystem函数可以加入摄像头的坐标系统(其中红绿蓝分别代表x、y、z轴,对应了正右、正下、正前方)。setCameraPosition函数设定窗口的视角,前三个是视点坐标(x,y,z),设置为(0,0,-3.0)说明当前视点是摄像头的后面3米。后三个是视点的向上方向,(0,-1,0)表明以y轴负方向为正上方。 

我们可以通过旋转缩放等等操作更好地观察输出窗口,按"h"可以查看对应的功能。 

代码: 
#include <iostream> 
#include <string> 
#include <pcl/io/pcd_io.h> 
#include <pcl/point_types.h> 
#include <pcl/visualization/pcl_visualizer.h> 
using namespace std; 

int main (int argc, char** argv){ 
typedef pcl::PointXYZRGBA PointT; 
pcl::PointCloud<PointT>::Ptr cloud (new pcl::PointCloud<PointT>); 

std::string dir = "E:\\PCL\\data\\"; 
std::string filename = "100.pcd"; 

if (pcl::io::loadPCDFile<PointT> ((dir+filename), *cloud) == -1){ 
//* load the file 
PCL_ERROR ("Couldn't read PCD file \n"); 
return (-1); 

printf("Loaded %d data points from PCD\n", 
cloud->width * cloud->height); 

for (size_t i = 0; i < cloud->points.size (); i+=10000) 
printf("%8.3f %8.3f %8.3f %5d %5d %5d %5d\n", 
cloud->points[i].x, 
cloud->points[i].y, 
cloud->points[i].z, 
cloud->points[i].r, 
cloud->points[i].g, 
cloud->points[i].b, 
cloud->points[i].a 
); 

pcl::visualization::PCLVisualizer viewer("Cloud viewer"); 
viewer.setCameraPosition(0,0,-3.0,0,-1,0); 
viewer.addCoordinateSystem(0.3); 

viewer.addPointCloud(cloud); 
while(!viewer.wasStopped()) 
viewer.spinOnce(100); 
return (0); 



这个就是机器人观察到的世界。这个就是机器人观察到的世界。

 

此时需要CMakeLists.txt

cmake_minimum_required(VERSION 2.8.3)
project(test)
find_package(PCL REQUIRED) #配置PCL库
include_directories(${PCL_INCLUDE_DIRS}) #配置头文件路径..例#include
add_executable(test test.cpp)
target_link_libraries(test ${PCL_LIBRARIES}) #链接PCL库
set( CMAKE_BUILD_TYPE Debug ) #如果需要调试就加上这行

参考自:http://blog.sina.com.cn/s/blog_c263b1860102vylc.html

http://pointclouds.org/documentation/tutorials/project_inliers.php

 

posted on 2017-02-08 16:56  半日闲心  阅读(17850)  评论(0编辑  收藏  举报

导航