激光雷达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