前言:我对编码很新。使用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保存,比如按空格键。我知道人们之前已经这样做但我找不到示例代码。有人能指出我正确的方向吗?
答案 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服务器。然后在另一个终端,运行
播放包文件:
$ rosbag play pcl_sample1.bag
这将让ROS系统回放您刚录制的数据,就像设备仍在工作一样。然后,您可以使用kinect2_viewer查看数据,例如:
运行Kinect实际插入的任何命令。
$ rosrun kinect2_viewer kinect2_viewer sd cloud
注意:如果您想录制特定主题,请访问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行放在程序的其他部分