如何从Kinect保存PCD文件?

时间:2014-05-20 20:03:55

标签: c++ kinect openni point-cloud-library

前言:我对编码很新。使用Ubuntu 12.04和从他们的网站下载的最新PCL(我相信PCL 1.7)我已成功编译并构建了此处列出的iograbber程序:http://pointclouds.org/documentation/tutorials/openni_grabber.php

我在pointclouds.org的教程中上下翻阅,并且没有任何内容可以解释如何添加几行代码以将当前的Kinect点云保存为PCD文件。在“作家”教程中它说

pcl::io::savePCDFileASCII ("test_pcd.pcd", cloud)

但这只是为了保存随机示例点。我想用按键执行PCD保存,比如按空格键。我知道人们之前已经这样做但我找不到示例代码。有人能指出我正确的方向吗?

3 个答案:

答案 0 :(得分:2)

使用相同的教程,您可以添加

 void cloud_cb_ (const pcl::PointCloud<pcl::PointXYZ>::ConstPtr &cloud)
 {
   if (!viewer.wasStopped())
     viewer.showCloud (cloud);
 }

您之前在回调(从抓取器接收点云的功能)中编写的行,具有以下内容

 void cloud_cb_ (const pcl::PointCloud<pcl::PointXYZ>::ConstPtr &cloud)
 {
   if (!viewer.wasStopped()){
     viewer.showCloud (cloud);
     pcl::io::savePCDFile ("test_pcd.pcd", cloud);
   }
 }

此代码应保存您可视化的云。如果您没有想象点云,请留下评论。

注意:您也可以使用

pcl::io::savePCDFile ("test_pcd.pcd", cloud, true);

以二进制模式保存更快(但您可能无法在文本编辑器中读取文件)

希望这有帮助

答案 1 :(得分:1)

对于从事ROS工作的人来说,这是一个理想的解决方案。因此,我将解决方案分为两部分 - 一部分,将其存储为ROS包文件(用于存储来自ros主题的任何类型数据的便利工具)和两部分,将rosbag文件写入pcd文件。现在这很简单。

(参考文献:http://wiki.ros.org/Bags

A)在BAG文件中存储数据。 (ROS文件类型)

首先将数据(任何类型的数据都可以存储)存储为ROSBAG。 ROSBAG只记录主题数据。

1.要开始使用kinect,请打开终端并运行

 $roslaunch kinect2_bridge kinect2_bridge.launch publish_tf:=true

这将让ROS系统开始从kinect获取数据。您应该看到系统启动和停止“等待客户端连接”。

2.要查看点云,请打开一个新终端。运行

$ rosrun kinect2_viewer kinect2_viewer sd cloud

您将看到一个带有点云视图的新窗口。这是解释kinect2_viewer函数参数的链接:https://github.com/code-iai/iai_kinect2/tree/master/kinect2_viewer

3.在新的终端运行中记录数据

$ rosbag record -O pcl_sample1.bag -a 

此处“-a”表示您将订阅所有可用的ros主题并从中记录数据。在您认为数据足够之后,您可以通过ctrl-C来停止它。数据将存储在.bag文件中,此处为name.bag。可以在此处找到更多设置:http://wiki.ros.org/rosbag/Commandline#record

现在拔掉kinect。包文件包含通过启动kinect2_bridge运行的所有主题的数据。现在,您可以使用主题中的数据,就像实际插入了kinect一样。

4.要播放数据,您需要在第一个终端(启动文件)中停止该程序。然后你运行

$ roscore

这将启动ROS服务器。然后在另一个终端,运行

  1. 播放包文件:

    $ rosbag play pcl_sample1.bag

  2. 这将让ROS系统回放您刚录制的数据,就像设备仍在工作一样。然后,您可以使用kinect2_viewer查看数据,例如:

    1. 运行Kinect实际插入的任何命令。

      $ rosrun kinect2_viewer kinect2_viewer sd cloud

    2. 注意:如果您想录制特定主题,请访问http://wiki.ros.org/Bags

      B)将包转换为PCD文件:(现在只有一个命令。)

      将适当的主题写入相应的文件夹:

      rosrun pcl_ros bag_to_pcd pcl_sample1.bag /kinect2/sd/image_color_rect src/
      
      rosrun pcl_ros bag_to_pcd pcl_sample1.bag /kinect2/sd/image_depth_rect src/PCD\ Files/
      

答案 2 :(得分:-1)

我有同样的问题,但我得到了解决方案。

在此代码中:

     void cloud_cb_ (const pcl::PointCloud<pcl::PointXYZ>::ConstPtr &cloud)
 {
   if (!viewer.wasStopped())
     viewer.showCloud (cloud);
 }

您必须添加此行

pcl::io::savePCDFileASCII ("test_pcd.pcd", *cloud);
像这样

 void cloud_cb_ (const pcl::PointCloud<pcl::PointXYZ>::ConstPtr &cloud)
 {
   if (!viewer.wasStopped())
   {
       viewer.showCloud (cloud);
       pcl::io::savePCDFileASCII ("test_pcd.pcd", *cloud);
   }
 }

它会减慢.exe,但你可以尝试将thi行放在程序的其他部分