grasp
All Data Structures Namespaces Functions Modules
visualizationThread.cpp
1 /* Copyright: (C) 2014 iCub Facility - Istituto Italiano di Tecnologia
2  * Authors: Ilaria Gori
3  * email: ilaria.gori@iit.it
4  * Permission is granted to copy, distribute, and/or modify this program
5  * under the terms of the GNU General Public License, version 2 or any
6  * later version published by the Free Software Foundation.
7  *
8  * A copy of the license can be found in the file LICENSE located in the
9  * root directory.
10  *
11  * This program is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
14  * Public License for more details
15 */
16 
17 #include <string.h>
18 #include <sstream>
19 
20 #include "visualizationThread.h"
21 
22 using namespace std;
23 using namespace yarp::os;
24 using namespace yarp::sig;
25 using namespace iCub::data3D;
26 
27 /************************************************************************/
28 VisualizationThread::VisualizationThread(DataToShow &_data) : data(_data)
29 {
30  x=0;
31  y=0;
32  sizex=0;
33  sizey=0;
34 }
35 
36 /************************************************************************/
37 void VisualizationThread::setPosition(int x, int y)
38 {
39  this->x=x;
40  this->y=y;
41 }
42 
43 /************************************************************************/
44 void VisualizationThread::setSize(int sizex, int sizey)
45 {
46  this->sizex=sizex;
47  this->sizey=sizey;
48 }
49 
50 /************************************************************************/
51 void VisualizationThread::run()
52 {
53  boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
54  int scale=15;
55  viewer->initCameraParameters();
56  viewer->setBackgroundColor (0, 0, 0);
57 
58  viewer->setPosition(x,y);
59  if (sizex!=0 && sizey!=0)
60  viewer->setSize(sizex,sizey);
61 
62  for (unsigned int i=0; i<data.goodPointsIndexes->size(); i++)
63  {
64  ostringstream temp;
65  temp<<i;
66  string s=temp.str();
67  pcl::PointXYZ point(data.cloud->points.at((*data.goodPointsIndexes)[i]).x,
68  data.cloud->points.at((*data.goodPointsIndexes)[i]).y,
69  data.cloud->points.at((*data.goodPointsIndexes)[i]).z);
70  viewer->addSphere (point, 0.002, 1, 1, 0, "pointScored"+s);
71  }
72 
73  pcl::PointXYZ origin(data.chosenPoint[0],data.chosenPoint[1],data.chosenPoint[2]);
74  pcl::PointXYZ normalOrigin;
75  pcl::PointXYZ normalOriginScaled;
76  if (data.hand=="left")
77  {
78  normalOrigin.x=origin.x+data.chosenOrientation(0,2);
79  normalOrigin.y=origin.y+data.chosenOrientation(1,2);
80  normalOrigin.z=origin.z+data.chosenOrientation(2,2);
81  normalOriginScaled.x=origin.x+(data.chosenOrientation(0,2)/scale);
82  normalOriginScaled.y=origin.y+(data.chosenOrientation(1,2)/scale);
83  normalOriginScaled.z=origin.z+(data.chosenOrientation(2,2)/scale);
84  }
85  else
86  {
87  normalOrigin.x=origin.x-data.chosenOrientation(0,2);
88  normalOrigin.y=origin.y-data.chosenOrientation(1,2);
89  normalOrigin.z=origin.z-data.chosenOrientation(2,2);
90  normalOriginScaled.x=origin.x-(data.chosenOrientation(0,2)/scale);
91  normalOriginScaled.y=origin.y-(data.chosenOrientation(1,2)/scale);
92  normalOriginScaled.z=origin.z-(data.chosenOrientation(2,2)/scale);
93  }
94 
95  viewer->addSphere (origin, 0.002, 1, 0, 0, "pointChosen");
96  viewer->addArrow<pcl::PointXYZ,pcl::PointXYZ>(origin,normalOriginScaled,0,0,1,0,"pz");
97 
98  pcl::PointXYZ xaxis(normalOrigin.x+data.chosenOrientation(0,0),
99  normalOrigin.y+data.chosenOrientation(1,0),
100  normalOrigin.z+data.chosenOrientation(2,0));
101 
102  pcl::PointXYZ xaxisScaled(normalOriginScaled.x+(data.chosenOrientation(0,0)/scale),
103  normalOriginScaled.y+(data.chosenOrientation(1,0)/scale),
104  normalOriginScaled.z+(data.chosenOrientation(2,0)/scale));
105 
106  viewer->addArrow<pcl::PointXYZ,pcl::PointXYZ>(xaxisScaled,normalOriginScaled,1,0,0,0,"px");
107 
108  pcl::PointXYZ yaxis(normalOrigin.x+data.chosenOrientation(0,1),
109  normalOrigin.y+data.chosenOrientation(1,1),
110  normalOrigin.z+data.chosenOrientation(2,1));
111 
112  pcl::PointXYZ yaxisScaled(normalOriginScaled.x+(data.chosenOrientation(0,1)/scale),
113  normalOriginScaled.y+(data.chosenOrientation(1,1)/scale),
114  normalOriginScaled.z+(data.chosenOrientation(2,1)/scale));
115 
116  viewer->addArrow<pcl::PointXYZ,pcl::PointXYZ>(yaxisScaled,normalOriginScaled,0,1,0,0,"py");
117 
118  BoundingBox bb(data.boundingBox->getBoundingBox());
119  bb.drawBoundingBox(viewer);
120 
121  viewer->addPointCloudNormals<pcl::PointXYZRGB,pcl::Normal>(data.cloud,data.normals,10,0.01,"normals");
122 
123  pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(data.cloud);
124  viewer->addPointCloud<pcl::PointXYZRGB> (data.cloud, rgb, "rgb");
125  viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "rgb");
126 
127  viewer->resetCamera();
128  viewer->setCameraPosition(-0.0611749,-0.040113,0.00667606,-0.105521,0.0891437,0.990413);
129 
130  while (isRunning() && !viewer->wasStopped())
131  {
132  viewer->spinOnce(100);
133  boost::this_thread::sleep(boost::posix_time::microseconds (100000));
134  }
135 
136  viewer->close();
137 }
138 
The Definition of the BoundingBox class.
Definition: boundingBox.h:61
void drawBoundingBox(boost::shared_ptr< pcl::visualization::PCLVisualizer > viewer, int viewport=0)
Draw a 3D box in a PCLVisualizer window.