7 VisThread::VisThread(
int period,
const string &_cloudname):RateThread(period), id(_cloudname){}
10 bool VisThread::threadInit()
12 cloud = pcl::PointCloud<pcl::PointXYZRGB>::Ptr (
new pcl::PointCloud<pcl::PointXYZRGB>);
13 viewer = boost::shared_ptr<pcl::visualization::PCLVisualizer> (
new pcl::visualization::PCLVisualizer(
"Point Cloud Viewer"));
16 printf(
"\nStarting visualizer Thread\n");
22 updatingCloud =
false;
24 displayNormals =
false;
38 if (!viewer->wasStopped ())
42 boost::mutex::scoped_lock updateLock(updateModelMutex);
47 viewer->removePointCloud(
id);
48 viewer->removePointCloud(
"normals");
49 viewer->removeAllShapes();
52 bool colorCloud =
false;
53 for (
int p = 1; p < cloud->points.size(); ++p) {
54 uint32_t rgb = *
reinterpret_cast<int*
>(&cloud->points[p].rgb);
61 pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZRGB> cloud_color_handler(cloud, 230, 20, 0);
62 viewer->addPointCloud (cloud, cloud_color_handler,
id);
64 pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> cloud_color_handler (cloud);
65 viewer->addPointCloud (cloud, cloud_color_handler,
id);
67 viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2,
id);
68 updatingCloud =
false;
81 plotNormals(radiusSearch);
82 displayNormals =
false;
87 viewer->removePointCloud(
id);
88 viewer->removePointCloud(
"normals");
89 viewer->removeAllShapes();
98 printf(
"Closing Visualizer\n");
100 viewer->removePointCloud(
id);
107 void VisThread::threadRelease()
109 printf(
"Closing Visualizer Thread\n");
113 void VisThread::updateVis()
116 boost::mutex::scoped_lock updateLock(updateModelMutex);
120 printf(
"Visualizer updated\n");
124 void VisThread::clearVisualizer()
131 void VisThread::updateCloud(
const pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_in)
133 printf(
"Updating displayed cloud\n");
142 viewer->setBackgroundColor (0.05, 0.05, 0.05, 0);
143 viewer->addCoordinateSystem (0.05);
147 updatingCloud =
true;
149 printf(
"Cloud updated\n");
153 void VisThread::addNormals(
double rS)
156 displayNormals =
true;
160 printf(
"Please load a cloud before trying to compute the normals\n");
165 void VisThread::plotNormals(
double rS)
168 pcl::NormalEstimation<pcl::PointXYZRGB, pcl::Normal> ne;
169 ne.setInputCloud (cloud);
173 pcl::search::KdTree<pcl::PointXYZRGB>::Ptr tree (
new pcl::search::KdTree<pcl::PointXYZRGB> ());
174 ne.setSearchMethod (tree);
177 pcl::PointCloud<pcl::Normal>::Ptr cloud_normals (
new pcl::PointCloud<pcl::Normal>);
180 ne.setRadiusSearch (rS);
183 ne.compute (*cloud_normals);
185 viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal> (cloud, cloud_normals, 30, rS,
"normals");
189 void VisThread::addBoundingBox(
bool minBB)
198 printf(
"Minimal Bounding Box added to display\n");
200 printf(
"Axis Aligned Bounding Box added to display\n");
202 printf(
"Please load cloud to compute Bounding box from.\n");
207 void VisThread::plotBB(
bool minBB)
210 pcl::MomentOfInertiaEstimation <pcl::PointXYZRGB> feature_extractor;
211 feature_extractor.setInputCloud (cloud);
212 feature_extractor.compute ();
216 pcl::PointXYZRGB min_point_OBB;
217 pcl::PointXYZRGB max_point_OBB;
218 pcl::PointXYZRGB position_OBB;
219 Eigen::Matrix3f rotational_matrix_OBB;
222 feature_extractor.getOBB (min_point_OBB, max_point_OBB, position_OBB, rotational_matrix_OBB);
223 Eigen::Vector3f position (position_OBB.x, position_OBB.y, position_OBB.z);
224 Eigen::Quaternionf quat (rotational_matrix_OBB);
227 viewer->addCube (position, quat, max_point_OBB.x - min_point_OBB.x, max_point_OBB.y - min_point_OBB.y, max_point_OBB.z - min_point_OBB.z,
"OBB");
231 pcl::PointXYZRGB min_point_AABB;
232 pcl::PointXYZRGB max_point_AABB;
235 feature_extractor.getAABB (min_point_AABB, max_point_AABB);
238 viewer->addCube (min_point_AABB.x, max_point_AABB.x, min_point_AABB.y, max_point_AABB.y, min_point_AABB.z, max_point_AABB.z, 1.0, 1.0, 0.0,
"AABB");
243 void VisThread::accumulateClouds(
bool accum)
247 printf(
"Clouds plotted together now\n");
250 printf(
"Clouds plotted separately now\n");