17 #if MRPT_HAS_OPENGL_GLUT    18         #ifdef MRPT_OS_WINDOWS    24                 #include <OpenGL/gl.h>    31 #if MRPT_HAS_OPENGL_GLUT && defined(MRPT_OS_WINDOWS)    33                 #if defined(_MSC_VER) || defined(__BORLANDC__)    34                         #pragma comment (lib,"opengl32.lib")    35                         #pragma comment (lib,"GlU32.lib")    37 #endif // MRPT_HAS_OPENGL_GLUT    53         const TPoint3D *arr[3]={&p1,&p2,&p3};
    55         for (
size_t i=0;i<3;i++)        {
    59                 t.r[i]=m_color.R*(1.f/255);
    60                 t.g[i]=m_color.G*(1.f/255);
    61                 t.b[i]=m_color.B*(1.f/255);
    62                 t.a[i]=m_color.A*(1.f/255);
    64         triangles.push_back(
t);
    65         CRenderizableDisplayList::notifyChange();
    68 void CAngularObservationMesh::updateMesh()
 const        {
    69         CRenderizableDisplayList::notifyChange();
    71         size_t numRows=scanSet.size();
    74                 actualMesh.setSize(0,0);
    75                 validityMatrix.setSize(0,0);
    79         if (pitchBounds.size()!=numRows&&pitchBounds.size()!=2) 
return;
    80         size_t numCols=scanSet[0].scan.size();
    81         actualMesh.setSize(numRows,numCols);
    82         validityMatrix.setSize(numRows,numCols);
    83         double *pitchs=
new double[numRows];
    84         if (pitchBounds.size()==2)      {
    85                 double p1=pitchBounds[0];
    86                 double p2=pitchBounds[1];
    87                 for (
size_t i=0;i<numRows;i++) pitchs[i]=p1+(p2-p1)*
static_cast<double>(i)/static_cast<double>(numRows-1);
    88         }       
else for (
size_t i=0;i<numRows;i++) pitchs[i]=pitchBounds[i];
    89         const bool rToL=scanSet[0].rightToLeft;
    90         for (
size_t i=0;i<numRows;i++)  {
    91                 const std::vector<float> &scan=scanSet[i].scan;
    92                 const std::vector<char> valid=scanSet[i].validRange;
    93                 const double pitchIncr=scanSet[i].deltaPitch;
    94                 const double aperture=scanSet[i].aperture;
    95                 const CPose3D origin=scanSet[i].sensorPose;
    97                 for (
size_t j=0;j<numCols;j++) 
if ((validityMatrix(i,j)=(valid[j]!=0))) {
    98                         double pYaw=aperture*((
static_cast<double>(j)/static_cast<double>(numCols-1))-0.5);
   100                         actualMesh(i,j)=(origin+
CPose3D(0,0,0,rToL?pYaw:-pYaw,pitchIncr))+
CPoint3D(scan[j],0,0);
   104         triangles.reserve(2*(numRows-1)*(numCols-1));
   105         for (
size_t k=0;k<numRows-1;k++)        {
   106                 for (
size_t j=0;j<numCols-1;j++)        {
   107                         int b1=validityMatrix(k,j)?1:0;
   108                         int b2=validityMatrix(k,j+1)?1:0;
   109                         int b3=validityMatrix(k+1,j)?1:0;
   110                         int b4=validityMatrix(k+1,j+1)?1:0;
   117                                         if (!
b1) addTriangle(actualMesh(k,j+1),actualMesh(k+1,j),actualMesh(k+1,j+1));
   118                                         else if (!
b2) addTriangle(actualMesh(k,j),actualMesh(k+1,j),actualMesh(k+1,j+1));
   119                                         else if (!
b3) addTriangle(actualMesh(k,j),actualMesh(k,j+1),actualMesh(k+1,j+1));
   120                                         else if (!b4) addTriangle(actualMesh(k,j),actualMesh(k,j+1),actualMesh(k+1,j));
   123                                         addTriangle(actualMesh(k,j),actualMesh(k,j+1),actualMesh(k+1,j));
   124                                         addTriangle(actualMesh(k+1,j+1),actualMesh(k,j+1),actualMesh(k+1,j));
   131 void CAngularObservationMesh::render_dl()
 const {
   132 #if MRPT_HAS_OPENGL_GLUT   133         if (mEnableTransparency)        {
   142         if (!meshUpToDate) updateMesh();
   144         for (
size_t i=0;i<triangles.size();i++) {
   146                 float ax=
t.
x[1]-
t.x[0];
   147                 float bx=
t.x[2]-
t.x[0];
   148                 float ay=
t.y[1]-
t.y[0];
   149                 float by=
t.y[2]-
t.y[0];
   150                 float az=
t.z[1]-
t.z[0];
   151                 float bz=
t.z[2]-
t.z[0];
   154                 for (
int i=0;i<3;i++)   {
   158                 if (mWireframe) 
glEnd();
   160         if (!mWireframe) 
glEnd();
   173 bool CAngularObservationMesh::setScanSet(
const std::vector<mrpt::obs::CObservation2DRangeScan> &scans)  {
   174         CRenderizableDisplayList::notifyChange();
   177         if (scans.size()>0)     {
   178                 size_t setSize=scans[0].scan.size();
   179                 bool rToL=scans[0].rightToLeft;
   181                         if (it->scan.size()!=
setSize) 
return false;
   182                         if (it->rightToLeft!=rToL) 
return false;
   190 void CAngularObservationMesh::setPitchBounds(
const double initial,
const double final)   {
   191         CRenderizableDisplayList::notifyChange();
   194         pitchBounds.push_back(initial);
   195         pitchBounds.push_back(
final);
   198 void CAngularObservationMesh::setPitchBounds(
const std::vector<double> &bounds) {
   199         CRenderizableDisplayList::notifyChange();
   204 void CAngularObservationMesh::getPitchBounds(
double &initial,
double &
final)
 const {
   205         initial=pitchBounds.front();
   206         final=pitchBounds.back();
   208 void CAngularObservationMesh::getPitchBounds(std::vector<double> &bounds)
 const {
   211 void CAngularObservationMesh::getScanSet(std::vector<CObservation2DRangeScan> &scans)
 const     {
   215 void CAngularObservationMesh::generateSetOfTriangles(CSetOfTrianglesPtr &
res)
 const     {
   216         if (!meshUpToDate) updateMesh();
   217         res->insertTriangles(triangles.begin(),triangles.end());
   229 void CAngularObservationMesh::generatePointCloud(
CPointsMap *out_map)
 const {
   253                 writeToStreamRender(out);
   255                 out<<pitchBounds<<scanSet<<mWireframe<<mEnableTransparency;
   266                         readFromStreamRender(
in);
   267                         in>>pitchBounds>>scanSet>>mWireframe>>mEnableTransparency;
   276         double value=initialValue();
   277         double incr=increment();
   280         for (
size_t i=0;i<am-1;i++,
value+=incr) vals[i]=
value;
   281         vals[am-1]=finalValue();
   284 void CAngularObservationMesh::getTracedRays(CSetOfLinesPtr &
res)
 const  {
   285         if (!meshUpToDate) updateMesh();
   287         for (
size_t i=0;i<validityMatrix.getRowCount();i++) 
for (
size_t j=0;j<validityMatrix.getColCount();j++) 
if (validityMatrix(i,j)) 
count++;
   289         for (
size_t i=0;i<actualMesh.getRowCount();i++) 
for (
size_t j=0;j<actualMesh.getColCount();j++) 
if (validityMatrix(i,j)) 
res->appendLine(
TPose3D(scanSet[i].sensorPose),actualMesh(i,j));
   298                 pitchs.reserve(pi.size());
   299                 for (std::vector<double>::const_reverse_iterator it=pi.rbegin();it!=pi.rend();++it) pitchs.push_back(*it);
   306                         double yaw=obs.
aperture*((
static_cast<double>(i)/static_cast<double>(obs.
scan.
size()-1))-0.5);
   312 void CAngularObservationMesh::getUntracedRays(CSetOfLinesPtr &
res,
double dist)
 const    {
   318         for (
size_t i=0;i<3;i++)        {
   326 void CAngularObservationMesh::generateSetOfTriangles(std::vector<TPolygon3D> &
res)
 const        {
   327         if (!meshUpToDate) updateMesh();
   328         res.resize(triangles.size());
   334         if (!meshUpToDate) updateMesh();
   336         bb_min = 
mrpt::math::TPoint3D(std::numeric_limits<double>::max(),std::numeric_limits<double>::max(), std::numeric_limits<double>::max());
   337         bb_max = 
mrpt::math::TPoint3D(-std::numeric_limits<double>::max(),-std::numeric_limits<double>::max(),-std::numeric_limits<double>::max());
   339         for (
size_t i=0;i<triangles.size();i++)
   357         m_pose.composePoint(bb_min, bb_min);
   358         m_pose.composePoint(bb_max, bb_max);
 void clear()
Erase all the contents of the map. 
 
GLuint GLuint GLsizei count
 
void operator()(const CObservation2DRangeScan &obs)
 
A mesh built from a set of 2D laser scan observations. 
 
Classes for serialization, sockets, ini-file manipulation, streams, list of properties-values, timewatch, extensions to STL. 
 
GLAPI void GLAPIENTRY glEnable(GLenum cap)
 
GLboolean GLenum GLenum GLvoid * values
 
#define IMPLEMENTS_SERIALIZABLE(class_name, base, NameSpace)
This must be inserted in all CSerializable classes implementation files. 
 
bool BASE_IMPEXP traceRay(const std::vector< TPolygonWithPlane > &vec, const mrpt::poses::CPose3D &pose, double &dist)
Fast ray tracing method using polygons' properties. 
 
STLCONTAINER::const_iterator begin() const
 
GLAPI void GLAPIENTRY glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz)
 
const Scalar * const_iterator
 
#define GL_ONE_MINUS_SRC_ALPHA
 
double z
X,Y,Z coordinates. 
 
#define GL_COLOR_MATERIAL
 
GLAPI void GLAPIENTRY glShadeModel(GLenum mode)
 
GLsizei GLsizei GLuint * obj
 
GLAPI void GLAPIENTRY glBlendFunc(GLenum sfactor, GLenum dfactor)
 
A renderizable object suitable for rendering with OpenGL's display lists. 
 
This base class is used to provide a unified interface to files,memory buffers,..Please see the deriv...
 
A cloud of points in 2D or 3D, which can be built from a sequence of laser scans or other sensors...
 
std::vector< double > pitchs
 
This base provides a set of functions for maths stuff. 
 
#define MRPT_UNUSED_PARAM(a)
Can be used to avoid "not used parameters" warnings from the compiler. 
 
#define MRPT_THROW_UNKNOWN_SERIALIZATION_VERSION(__V)
For use in CSerializable implementations. 
 
This namespace contains representation of robot actions and observations. 
 
EIGEN_STRONG_INLINE void setSize(size_t row, size_t col)
Changes the size of matrix, maintaining its previous content as possible and padding with zeros where...
 
mrpt::utils::ContainerReadOnlyProxyAccessor< std::vector< char > > validRange
It's false (=0) on no reflected rays, referenced to elements in scan. 
 
CAngularObservationMesh_fnctr(CPointsMap *p)
 
GLAPI void GLAPIENTRY glBegin(GLenum mode)
 
A class used to store a 3D point. 
 
void keep_max(T &var, const K test_val)
If the second argument is above the first one, set the first argument to this higher value...
 
Classes for 2D/3D geometry representation, both of single values and probability density distribution...
 
GLAPI void GLAPIENTRY glVertex3f(GLfloat x, GLfloat y, GLfloat z)
 
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries. 
 
STLCONTAINER::const_iterator end() const
 
A "CObservation"-derived class that represents a 2D range scan measurement (typically from a laser sc...
 
TPolygon3D createFromTriangle(const CSetOfTriangles::TTriangle &t)
 
void keep_min(T &var, const K test_val)
If the second argument is below the first one, set the first argument to this lower value...
 
A class used to store a 3D pose (a 3D translation + a rotation in 3D). 
 
double deltaPitch
If the laser gathers data by sweeping in the pitch/elevation angle, this holds the increment in "pitc...
 
Lightweight 3D pose (three spatial coordinates, plus three angular coordinates). 
 
The namespace for 3D scene representation and rendering. 
 
float aperture
The "aperture" or field-of-view of the range finder, in radians (typically M_PI = 180 degrees)...
 
void operator()(const CObservation2DRangeScan &obj)
 
GLAPI void GLAPIENTRY glEnd(void)
 
typedef void(APIENTRYP PFNGLBLENDCOLORPROC)(GLclampf red
 
GLsizei const GLfloat * value
 
GLAPI void GLAPIENTRY glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
 
mrpt::utils::ContainerReadOnlyProxyAccessor< std::vector< float > > scan
The range values of the scan, in meters. Must have same length than validRange. 
 
GLuint GLenum GLenum transform
 
GLAPI void GLAPIENTRY glDisable(GLenum cap)
 
bool insertObservation(const mrpt::obs::CObservation *obs, const mrpt::poses::CPose3D *robotPose=NULL)
Insert the observation information into this map. 
 
mrpt::poses::CPose3D sensorPose
The 6D pose of the sensor on the robot at the moment of starting the scan. 
 
FAddUntracedLines(CSetOfLinesPtr &l, const CPoint3D &p, const std::vector< double > &pi)
 
3D polygon, inheriting from std::vector<TPoint3D> 
 
bool rightToLeft
The scanning direction: true=counterclockwise; false=clockwise.