28 #ifndef opengl_CAngularObservationMesh_H
29 #define opengl_CAngularObservationMesh_H
44 using namespace mrpt::utils;
45 using namespace mrpt::slam;
46 using namespace mrpt::poses;
97 rangeData.mode0.initial=a;
98 rangeData.mode0.final=b;
99 rangeData.mode0.increment=c;
105 rangeData.mode1.initial=a;
106 rangeData.mode1.final=b;
107 rangeData.mode1.amount=c;
113 rangeData.mode2.aperture=a;
114 rangeData.mode2.amount=b;
115 rangeData.mode2.negToPos=c;
123 if (increment==0)
throw std::logic_error(
"Invalid increment value.");
124 return TDoubleRange(initial,
final,increment);
130 return TDoubleRange(initial,
final,amount);
136 return TDoubleRange(aperture,amount,negToPos);
144 case 0:
return (
sign(rangeData.mode0.increment)==
sign(rangeData.mode0.final-rangeData.mode0.initial))?fabs(rangeData.mode0.final-rangeData.mode0.initial):0;
145 case 1:
return rangeData.mode1.final-rangeData.mode1.initial;
146 case 2:
return rangeData.mode2.aperture;
147 default:
throw std::logic_error(
"Unknown range type.");
157 case 1:
return rangeData.mode0.initial;
158 case 2:
return rangeData.mode2.negToPos?-rangeData.mode2.aperture/2:rangeData.mode2.aperture/2;
159 default:
throw std::logic_error(
"Unknown range type.");
168 case 0:
return (
sign(rangeData.mode0.increment)==
sign(rangeData.mode0.final-rangeData.mode0.initial))?rangeData.mode0.final:rangeData.mode0.initial;
169 case 1:
return rangeData.mode1.final;
170 case 2:
return rangeData.mode2.negToPos?rangeData.mode2.aperture/2:-rangeData.mode2.aperture/2;
171 default:
throw std::logic_error(
"Unknown range type.");
180 case 0:
return rangeData.mode0.increment;
181 case 1:
return (rangeData.mode1.final-rangeData.mode1.initial)/
static_cast<double>(rangeData.mode1.amount-1);
182 case 2:
return rangeData.mode2.negToPos?rangeData.mode2.aperture/
static_cast<double>(rangeData.mode2.amount-1):-rangeData.mode2.aperture/static_cast<double>(rangeData.mode2.amount-1);
183 default:
throw std::logic_error(
"Unknown range type.");
192 case 0:
return (
sign(rangeData.mode0.increment)==
sign(rangeData.mode0.final-rangeData.mode0.initial))?1+
static_cast<size_t>(ceil((rangeData.mode0.final-rangeData.mode0.initial)/rangeData.mode0.increment)):1;
193 case 1:
return rangeData.mode1.amount;
194 case 2:
return rangeData.mode2.amount;
195 default:
throw std::logic_error(
"Unknown range type.");
202 void values(std::vector<double> &vals)
const;
209 case 0:
return sign(rangeData.mode0.increment)>0;
210 case 1:
return sign(rangeData.mode1.final-rangeData.mode1.initial)>0;
211 case 2:
return rangeData.mode2.negToPos;
212 default:
throw std::logic_error(
"Unknown range type.");
220 void updateMesh()
const;
228 mutable std::vector<CSetOfTriangles::TTriangle>
triangles;
264 CAngularObservationMesh():mWireframe(true),meshUpToDate(false),mEnableTransparency(true),actualMesh(0,0),validityMatrix(0,0),pitchBounds(),scanSet() {}
283 return mEnableTransparency;
289 mEnableTransparency=enabled;
296 virtual void render_dl()
const;
305 void setPitchBounds(
const double initial,
const double final);
309 void setPitchBounds(
const std::vector<double> bounds);
313 void getPitchBounds(
double &initial,
double &
final)
const;
317 void getPitchBounds(std::vector<double> &bounds)
const;
321 void getScanSet(std::vector<CObservation2DRangeScan> &scans)
const;
325 bool setScanSet(
const std::vector<CObservation2DRangeScan> &scans);
334 void generatePointCloud(
CPointsMap *out_map)
const;
349 void generateSetOfTriangles(std::vector<TPolygon3D> &res)
const;
354 if (!meshUpToDate) updateMesh();
356 validity=validityMatrix;
369 FTrace1D(
const T &s,
const CPose3D &p,std::vector<double> &v,std::vector<char> &v2):initial(p),e(s),values(v),valid(v2) {}
373 if (e->traceRay(pNew,dist)) {
374 values.push_back(dist);
391 std::vector<CObservation2DRangeScan> &
vObs;
394 FTrace2D(
const T &s,
const CPose3D &p,
CAngularObservationMeshPtr &om,
const CAngularObservationMesh::TDoubleRange &y,std::vector<CObservation2DRangeScan> &obs,
const CPose3D &b):e(s),initial(p),caom(om),yaws(y),vObs(obs),pBase(b) {}
396 std::vector<double> yValues;
397 yaws.values(yValues);
400 std::vector<double> values;
401 std::vector<char> valid;
402 size_t nY=yValues.size();
405 for_each(yValues.begin(),yValues.end(),
FTrace1D<T>(e,pNew,values,valid));
423 std::vector<double> pValues;
425 std::vector<CObservation2DRangeScan> vObs;
426 vObs.reserve(pValues.size());
427 for_each(pValues.begin(),pValues.end(),
FTrace2D<T>(e,initial,caom,yaws,vObs,initial));
428 caom->mWireframe=
false;
429 caom->mEnableTransparency=
false;
430 caom->setPitchBounds(pValues);
431 caom->setScanSet(vObs);
439 std::vector<double> yValues;
441 std::vector<double> scanValues;
442 std::vector<char> valid;
444 scanValues.reserve(nV);
446 for_each(yValues.begin(),yValues.end(),
FTrace1D<T>(e,initial,scanValues,valid));