我试图用可视化点云PCL CloudViewer。 问题是,我是很新的C ++,我发现两个教程第一示范点云的创建和第二示范一个点云的可视化。 不过,我不能在这两个教程结合起来。
这是我跟:
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/cloud_viewer.h>
int main (int argc, char** argv)
{
pcl::PointCloud<pcl::PointXYZ> cloud;
// Fill in the cloud data
cloud.width = 5;
cloud.height = 1;
cloud.is_dense = false;
cloud.points.resize (cloud.width * cloud.height);
for (size_t i = 0; i < cloud.points.size (); ++i)
{
cloud.points[i].x = 1024 * rand () / (RAND_MAX + 1.0f);
cloud.points[i].y = 1024 * rand () / (RAND_MAX + 1.0f);
cloud.points[i].z = 1024 * rand () / (RAND_MAX + 1.0f);
}
pcl::visualization::CloudViewer viewer ("Simple Cloud Viewer");
viewer.showCloud (cloud);
while (!viewer.wasStopped ())
{
}
return (0);
}
但是,即使不进行编译:
error: no matching function for call to
‘pcl::visualization::CloudViewer::showCloud(pcl::PointCloud<pcl::PointXYZ>&)’
你的错误信息告诉你,你需要做的:
error: no matching function for call to ‘pcl::visualization::CloudViewer::showCloud(pcl::PointCloud<pcl::PointXYZ>&)’
所以,去为CloudViewer文档,看看这个成员函数有什么参数: http://docs.pointclouds.org/1.5.1/classpcl_1_1visualization_1_1_cloud_viewer.html
在那里,我们看到,它需要一个const MonochromeCloud::ConstPtr &cloud
,而不是原始引用您传递这是从boost智能指针的类型定义:
typedef boost::shared_ptr<const PointCloud<PointT> > pcl::PointCloud< PointT >::ConstPtr
所以,当你创建你的云,你需要将它包装在这些智能指针,而不是使其成为一个局部变量之一。 喜欢的东西(未经测试):
pcl::MonochromeCloud::ConstPtr cloud(new pcl::PointCloud<pcl::PointXYZ>());
然后,当你在变量云通过,将有正确的类型,你不会得到你报道的那种错误。 你也将不得不改变你的cloud.foo
s到cloud->foo
秒。
纵观第二个例子你给,他们也这么做:
pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGBA>);
为了给出答案马上:
pcl::PointCloud<pcl::PointXYZRGB>::Ptr ptrCloud(&cloud);
然后把在ptrCloud的浏览器,它是什么,它预计:
viewer.showCloud (ptrCloud);
对于CloudViewer教程PCL cloudviewer教程 http://pointclouds.org/documentation/tutorials/cloud_viewer.php#cloud-viewer定义点云如下:
pcl::PointCloud<pcl::PointXYZRGB>**::Ptr** cloud;
但是你写:
pcl::PointCloud<pcl::PointXYZ> cloud;
因此,尝试通过云计算作为云和,而不是云,或声明为指针。
如果别人只是搜索如何在ROS做到这一点可以通过简单地做:
#include <ros/ros.h>
#include <pcl_ros/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/visualization/cloud_viewer.h>
#include <sensor_msgs/PointCloud2.h>
#include <pcl_conversions/pcl_conversions.h>
#include <iostream>
#include <pcl/common/common_headers.h>
#include <pcl/features/normal_3d.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/console/parse.h>
typedef pcl::PointCloud<pcl::PointXYZ> PointCloud;
class cloudHandler
{
public:
cloudHandler():viewer("Cloud Viewer")
{
pcl_sub = nh.subscribe("/camera/depth_registered/points", 10, &cloudHandler::cloudCB, this);
viewer_timer = nh.createTimer(ros::Duration(0.1), &cloudHandler::timerCB,this);
}
void cloudCB(const sensor_msgs::PointCloud2 &input)
{
pcl::PointCloud<pcl::PointXYZRGB> cloud;
pcl::fromROSMsg (input, cloud);
viewer.showCloud(cloud.makeShared());
}
void timerCB(const ros::TimerEvent&)
{
if(viewer.wasStopped())
{
ros::shutdown();
}
}
protected:
ros::NodeHandle nh;
ros::Subscriber pcl_sub;
pcl::visualization::CloudViewer viewer;
ros::Timer viewer_timer;
};
int main(int argc, char** argv)
{
ros::init(argc, argv, "pcl_visualize");
cloudHandler handler;
ros::spin();
return 0;
}
在包括很可能被清洗更:)