PCL:可视化点云
PCL: Visualize a point cloud
我正在尝试使用PCL CloudViewer可视化点云。问题是我对C++很陌生,我找到了两个教程,第一个演示了PointCloud的创建,第二个演示了PointCloud的可视化。但是,我无法将这两个教程结合起来。
这是我想到的:
#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
更改为cloud->foo
s。
看看你给出的第二个例子,他们也这样做:
pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGBA>);
直接给出答案:
pcl::PointCloud<pcl::PointXYZRGB>::Ptr ptrCloud(&cloud);
然后在查看器中放入ptrCloud,这就是它所期望的:
viewer.showCloud (ptrCloud);
如果其他人只是在 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;
}
内含物可能可以清理得更:)
CloudViewer pcl cloudviewer tutorialhttp://pointclouds.org/documentation/tutorials/cloud_viewer.php#cloud-viewer 教程对点云的定义如下:
pcl::PointCloud<pcl::PointXYZRGB>**::Ptr** cloud;
但是你已经写过:
pcl::PointCloud<pcl::PointXYZ> cloud;
因此,请尝试将云传递为 &cloud 而不是 cloud,或者将其声明为指针。
- 可视化 如何在 c++ 中制作特定大小的文件?
- 可视化C++:发布模式的运行时库作为'Multi-threaded Debug DLL'
- 提升如何在图形可视化中写入边缘的权重?
- 如何在大型c++项目的可视化代码中设置调试
- 可视化编译与 C++ 中的 Extern 变量
- 可视化 Bazel C++预编译标头实现
- 无法为 X.radio 创建中等可视化,因为找不到网络节点可视化 - Omnet++
- C++合并排序可视化工具
- 可视化 使用 VS Code 查找C++应用程序中的内存泄漏
- 可视化 将字符串解析为数组以进行C++
- 可视化 如何在C++中将字符数组转换为 FILE 类型
- 如何在ROS中使用PCL可视化动力学数据的表面法线
- 增加 PCL 中点云的点大小以实现可视化
- 在Visual Studio 2019中构建简单的点云可视化代码时,来自PCL的第三方库的多个错误
- PCL云可视化Visual Studio 2010
- 在PCL的Project Tango中可视化点云
- PCL:可视化点云
- 使用PCL的浊点可视化流
- PCL可视化错误
- PCL可视化器-退出可视化器窗口时从Eigen抛出异常