iCub-main
Loading...
Searching...
No Matches
objectsthread.h
Go to the documentation of this file.
1/*
2 * objectsthread.h
3 */
4
5/*
6 * Copyright (C) 2009 RobotCub Consortium
7 * Author: Alessandro Scalzo alessandro.scalzo@iit.it
8 * CopyPolicy: Released under the terms of the GNU GPL v2.0.
9 *
10 * Based on:
11 *
12 * Qavimator
13 * Copyright (C) 2006 by Zi Ree *
14 * Zi Ree @ SecondLife *
15 * Released under the terms of the GNU GPL v2.0.
16 */
17
18#ifndef OBJECTSTHREAD_H
19#define OBJECTSTHREAD_H
20
21#include <string>
22#include <qstring.h>
23#include <qthread.h>
24#include <vector>
25#include <yarp/os/Log.h>
26#include <yarp/sig/Vector.h>
28
29#include "bvhnoderoot.h"
30
31#ifdef __APPLE__
32#include <OpenGL/glu.h>
33#else
34#include <GL/glu.h>
35#endif
36
37#include <string.h>
38extern std::string GUI_NAME;
39
41{
42public:
43 ObjectsManager(const char *objPortName,const char *texPortName,const char *forcePortName)
44 {
45 mObjPort.open((GUI_NAME+objPortName).c_str());
46 mForcePort.open((GUI_NAME+forcePortName).c_str());
47
48 mObjPort.setStrict();
49 mForcePort.setStrict();
50
51 /*
52 mPx=mPy=mPz=0.0;
53 mRx=mRy=mRz=0.0;
54 for (int i=0; i<3; ++i)
55 for (int j=0; j<3; ++j)
56 R[i][j]=(double)(i==j);
57 */
58 }
59
61 {
62 mObjPort.interrupt();
63 mObjPort.close();
64
65 mForcePort.interrupt();
66 mForcePort.close();
67
68 for (int i=0; i<(int)mObjectsRoot.size(); ++i)
69 {
70 if (mObjectsRoot[i]) delete mObjectsRoot[i];
71 }
72
73 for (int i=0; i<(int)mObjectsWorld.size(); ++i)
74 {
75 if (mObjectsWorld[i]) delete mObjectsWorld[i];
76 }
77
78 for (int i=0; i<(int)mTrajectoriesRoot.size(); ++i)
79 {
80 if (mTrajectoriesRoot[i]) delete mTrajectoriesRoot[i];
81 }
82
83 for (int i=0; i<(int)mTrajectoriesWorld.size(); ++i)
84 {
85 if (mTrajectoriesWorld[i]) delete mTrajectoriesWorld[i];
86 }
87 }
88
90 {
91 mAB=ab;
92 }
93
94 inline void manage(yarp::os::Bottle *msg);
95 inline void manage(iCub::skinDynLib::skinContactList &forces);
96
97 /*
98 void readEncoders(double *enc)
99 {
100 static const double DEG2RAD=M_PI/180.0;
101
102 mPx=enc[3];
103 mPy=enc[4];
104 mPz=enc[5];
105
106 mRz=enc[0];
107 mRy=enc[1];
108 mRx=enc[2];
109
110 double Rz=DEG2RAD*mRz;
111 double Ry=DEG2RAD*mRy;
112 double Rx=DEG2RAD*mRx;
113
114 double cA=cos(Rz),sA=sin(Rz);
115 double cB=cos(Ry),sB=sin(Ry);
116 double cY=cos(Rx),sY=sin(Rx);
117
118 R[0][0]=cA*cB; R[0][1]=cA*sB*sY-sA*cY; R[0][2]=cA*sB*cY+sA*sY;
119 R[1][0]=sA*cB; R[1][1]=sA*sB*sY+cA*cY; R[1][2]=sA*sB*cY-cA*sY;
120 R[2][0]= -sB; R[2][1]= cB*sY; R[2][2]= cB*cY;
121 }
122 */
123
124 void update()
125 {
126 // objects
127 for (yarp::os::Bottle *botObj; botObj=mObjPort.read(false);)
128 {
129 manage(botObj);
130 }
131
132 // textures
133 // NOT MANAGED FOR NOW
134
135 for (iCub::skinDynLib::skinContactList *forces; forces=mForcePort.read(false);)
136 {
137 manage(*forces);
138 }
139 }
140
142 {
143 for (int i=0; i<(int)mObjectsRoot.size(); ++i)
144 {
145 if (mObjectsRoot[i]) mObjectsRoot[i]->draw();
146 }
147
148 for (int i=0; i<(int)mTrajectoriesRoot.size(); ++i)
149 {
150 if(mTrajectoriesRoot[i]) mTrajectoriesRoot[i]->draw();
151 }
152 }
153
155 {
156 for (int i=0; i<(int)mObjectsWorld.size(); ++i)
157 {
158 if (mObjectsWorld[i]) mObjectsWorld[i]->draw();
159 }
160
161 for (int i=0; i<(int)mTrajectoriesWorld.size(); ++i)
162 {
163 if(mTrajectoriesWorld[i]) mTrajectoriesWorld[i]->draw();
164 }
165 }
166
167protected:
168 std::vector<VisionObj*> mObjectsRoot;
169 std::vector<VisionObj*> mObjectsWorld;
170 std::vector<TrajectoryObj*> mTrajectoriesRoot;
171 std::vector<TrajectoryObj*> mTrajectoriesWorld;
172
173 //double mPx,mPy,mPz;
174 //double mRx,mRy,mRz;
175 //double R[3][3];
176
178
179 yarp::os::BufferedPort<yarp::os::Bottle> mObjPort;
180 yarp::os::BufferedPort<iCub::skinDynLib::skinContactList> mForcePort;
181};
182
183void ObjectsManager::manage(yarp::os::Bottle *msg)
184{
185 std::string cmd=msg->get(0).asString();
186
187 if (cmd=="reset")
188 {
189 for (int i=0; i<(int)mObjectsRoot.size(); ++i) delete mObjectsRoot[i];
190 mObjectsRoot.clear();
191
192 for (int i=0; i<(int)mObjectsWorld.size(); ++i) delete mObjectsWorld[i];
193 mObjectsWorld.clear();
194
195 for (int i=0; i<(int)mTrajectoriesRoot.size(); ++i) delete mTrajectoriesRoot[i];
196 mTrajectoriesRoot.clear();
197
198 for (int i=0; i<(int)mTrajectoriesWorld.size(); ++i) delete mTrajectoriesWorld[i];
199 mTrajectoriesWorld.clear();
200
201 return;
202 }
203
204 if (cmd=="delete")
205 {
206 std::string name(msg->get(1).asString().c_str());
207
208 int size=(int)mObjectsRoot.size();
209 for (int i=0; i<size; ++i)
210 {
211 if (mObjectsRoot[i] && *mObjectsRoot[i]==name)
212 {
213 --size;
214 delete mObjectsRoot[i];
215 for (int j=i; j<size; ++j) mObjectsRoot[j]=mObjectsRoot[j+1];
216 mObjectsRoot.resize(size);
217 return;
218 }
219 }
220
221 size=(int)mObjectsWorld.size();
222 for (int i=0; i<(int)mObjectsWorld.size(); ++i)
223 {
224 if (mObjectsWorld[i] && *mObjectsWorld[i]==name)
225 {
226 --size;
227 delete mObjectsWorld[i];
228 for (int j=i; j<size; ++j) mObjectsWorld[j]=mObjectsWorld[j+1];
229 mObjectsWorld.resize(size);
230 return;
231 }
232 }
233
234 size=(int)mTrajectoriesRoot.size();
235 for (int i=0; i<(int)mTrajectoriesRoot.size(); ++i)
236 {
237 if (mTrajectoriesRoot[i] && *mTrajectoriesRoot[i]==name)
238 {
239 --size;
240 delete mTrajectoriesRoot[i];
241 for (int j=i; j<size; ++j) mTrajectoriesRoot[j]=mTrajectoriesRoot[j+1];
242 mTrajectoriesRoot.resize(size);
243 return;
244 }
245 }
246
247 size=(int)mTrajectoriesWorld.size();
248 for (int i=0; i<(int)mTrajectoriesWorld.size(); ++i)
249 {
250 if (mTrajectoriesWorld[i] && *mTrajectoriesWorld[i]==name)
251 {
252 --size;
253 delete mTrajectoriesWorld[i];
254 for (int j=i; j<size; ++j) mTrajectoriesWorld[j]=mTrajectoriesWorld[j+1];
255 mTrajectoriesWorld.resize(size);
256 return;
257 }
258 }
259
260 return;
261 }
262
263 if (cmd=="object" || cmd=="object_with_label")
264 {
265 int idd=1;
266
267 std::string name(msg->get(idd++).asString().c_str());
268 std::string label(cmd=="object_with_label"?msg->get(idd++).asString().c_str():"");
269
270 double dx=msg->get(idd++).asFloat64();
271 double dy=msg->get(idd++).asFloat64();
272 double dz=msg->get(idd++).asFloat64();
273
274 double px=msg->get(idd++).asFloat64();
275 double py=msg->get(idd++).asFloat64();
276 double pz=msg->get(idd++).asFloat64();
277
278 double rx=msg->get(idd++).asFloat64();
279 double ry=msg->get(idd++).asFloat64();
280 double rz=msg->get(idd++).asFloat64();
281
282 int r=msg->get(idd++).asInt32();
283 int g=msg->get(idd++).asInt32();
284 int b=msg->get(idd++).asInt32();
285
286 double alpha=msg->get(idd++).asFloat64();
287
288 for (int i=0; i<(int)mObjectsRoot.size(); ++i)
289 {
290 if (mObjectsRoot[i] && *mObjectsRoot[i]==name)
291 {
292 mObjectsRoot[i]->set(dx,dy,dz,px,py,pz,rx,ry,rz,r,g,b,alpha,label);
293 return;
294 }
295 }
296
297 for (int i=0; i<(int)mObjectsWorld.size(); ++i)
298 {
299 if (mObjectsWorld[i] && *mObjectsWorld[i]==name)
300 {
301 mObjectsWorld[i]->set(dx,dy,dz,px,py,pz,rx,ry,rz,r,g,b,alpha,label);
302 return;
303 }
304 }
305
306 bool bWorld=(msg->size()>idd && msg->get(idd).asString()=="WORLD");
307
308 if (bWorld)
309 {
310 mObjectsWorld.push_back(new VisionObj(name,dx,dy,dz,px,py,pz,rx,ry,rz,r,g,b,alpha,label));
311 }
312 else
313 {
314 mObjectsRoot.push_back(new VisionObj(name,dx,dy,dz,px,py,pz,rx,ry,rz,r,g,b,alpha,label));
315 }
316
317 return;
318 }
319
320 if (cmd=="trajectory")
321 {
322 std::string name(msg->get(1).asString().c_str());
323 std::string label(msg->get(2).asString().c_str());
324
325 int bufflen=msg->get(3).asInt32();
326 double persistence=msg->get(4).asFloat64();
327
328 int R=msg->get(5).asInt32();
329 int G=msg->get(6).asInt32();
330 int B=msg->get(7).asInt32();
331
332 double alpha=msg->get(8).asFloat64();
333 GLfloat width=(GLfloat)msg->get(9).asFloat64();
334
335 for (int i=0; i<(int)mTrajectoriesRoot.size(); ++i)
336 {
337 if (mTrajectoriesRoot[i] && *mTrajectoriesRoot[i]==name)
338 {
339 mTrajectoriesRoot[i]->set(label,bufflen,persistence,R,G,B,alpha,width);
340 return;
341 }
342 }
343
344 for (int i=0; i<(int)mTrajectoriesWorld.size(); ++i)
345 {
346 if (mTrajectoriesWorld[i] && *mTrajectoriesWorld[i]==name)
347 {
348 mTrajectoriesWorld[i]->set(label,bufflen,persistence,R,G,B,alpha,width);
349 return;
350 }
351 }
352
353 bool bWorld=(msg->size()>10 && msg->get(10).asString()=="WORLD");
354
355 if (bWorld)
356 {
357 mTrajectoriesWorld.push_back(new TrajectoryObj(name,label,bufflen,persistence,R,G,B,alpha,width,bWorld));
358 }
359 else
360 {
361 mTrajectoriesRoot.push_back(new TrajectoryObj(name,label,bufflen,persistence,R,G,B,alpha,width,bWorld));
362 }
363
364 return;
365 }
366
367 if (cmd=="addpoint")
368 {
369 std::string name(msg->get(1).asString().c_str());
370
371 double x=msg->get(2).asFloat64();
372 double y=msg->get(3).asFloat64();
373 double z=msg->get(4).asFloat64();
374
375 for (int i=0; i<(int)mTrajectoriesRoot.size(); ++i)
376 {
377 if (mTrajectoriesRoot[i] && *mTrajectoriesRoot[i]==name)
378 {
379 mTrajectoriesRoot[i]->update(x,y,z);
380 return;
381 }
382 }
383
384 for (int i=0; i<(int)mTrajectoriesWorld.size(); ++i)
385 {
386 if (mTrajectoriesWorld[i] && *mTrajectoriesWorld[i]==name)
387 {
388 mTrajectoriesWorld[i]->update(x,y,z);
389 return;
390 }
391 }
392
393 return;
394 }
395}
396
398{
399 for (int p=0; p<8; ++p)
400 {
401 for (int l=0; l<8; ++l)
402 {
403 if (mAB[p][l]) mAB[p][l]->clearArrows();
404 }
405 }
406
407 for (int i=0; i<(int)forces.size(); ++i)
408 {
409 yarp::sig::Vector P=forces[i].getCoP();
410
411 double f=forces[i].getForceModule();
412 yarp::sig::Vector F=forces[i].getForceDirection();
413 yarp::sig::Vector M=forces[i].getMoment();
414
415 int p=forces[i].getBodyPart();
416 int l=forces[i].getLinkNumber();
417
418 if (p >= 0 && p < 8 && l >= 0 && l < 8)
419 {
420 if (mAB[p][l])
421 {
422 mAB[p][l]->addArrow(new ForceArrow(P[0],P[1],P[2],f,F[0],F[1],F[2],M[0],M[1],M[2]));
423 }
424 }
425 else
426 {
427 yError("iCubGui: unexpected body part %d or link index %d contained in received skinContactList.", p, l);
428 }
429
430 }
431}
432
433#endif
std::string GUI_NAME
yarp::os::BufferedPort< yarp::os::Bottle > mObjPort
void setAddressBook(BVHNode ***ab)
void drawWorldObjects()
void manage(yarp::os::Bottle *msg)
std::vector< TrajectoryObj * > mTrajectoriesWorld
yarp::os::BufferedPort< iCub::skinDynLib::skinContactList > mForcePort
ObjectsManager(const char *objPortName, const char *texPortName, const char *forcePortName)
std::vector< VisionObj * > mObjectsRoot
std::vector< TrajectoryObj * > mTrajectoriesRoot
BVHNode *** mAB
std::vector< VisionObj * > mObjectsWorld
Class representing a list of external contacts acting on the iCub' skin.
cmd
Definition dataTypes.h:30
std::string GUI_NAME