⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mapview.cpp.svn-base

📁 采用网格地图SLAM算法
💻 SVN-BASE
字号:
#include "mapview.h"#ifdef __cplusplusextern "C" {#endif#include "map2d.h"extern MAP2                              * global_map;extern MAP2                              * local_map;extern logtools_lasersens2_data_t        * current_scan;extern logtools_rmove2_t                 * current_movement;#ifdef __cplusplus}#endifint scale = 1;double beam_factor = 5.0;  MapView::MapView( QWidget* parent, const char * )  : QScrollView( parent ){#if QT_VERSION >= 300  setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7,			      (QSizePolicy::SizeType)7,			      1, 1,			      sizePolicy().hasHeightForWidth() ) );#else  setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7,			      (QSizePolicy::SizeType)7,			      sizePolicy().hasHeightForWidth() ) );#endif    viewport()->setBackgroundMode( PaletteBase );  pt = new QPainter( viewport() );}voidMapView::setGlobalSize( int size_x, int size_y ){  if (settings.use_global_map) {    gimage = new QImage( size_x, size_y, 8, 256 );        for (int i=0; i<256; i++) {      gimage->setColor( i, qRgb( i, i, i ) );    }    gimage->setColor( 0, qRgb( 200, 200, 255 ) );    gimage->setColor( 1, qRgb( 0, 255, 0 ) );  }}voidMapView::setLocalSize( int size_x, int size_y ){  if (settings.use_correction) {    limage = new QImage( size_x*scale, size_y*scale, 8, 256 );        for (int i=0; i<250; i++) {      limage->setColor( i, qRgb( (int) (255-(i*2.55)),				 (int) (255-(i*2.55)),				 (int) (255-(i*2.55)) ) );    }    limage->setColor( 255, qRgb( 255, 0, 0 ) );    limage->setColor( 254, qRgb( 0, 0, 255 ) );  }}QStringnumber2str( int num ){  if (num<10) {    return("000"+QString::number( num ));  } else if (num<100) {    return("00"+QString::number( num ));  } else if (num<1000) {    return("0"+QString::number( num ));  }  return(QString::number( num ));}char *dumpMapName( char * prefix ){  static int dumpCtr = 0;    static char name[MAX_NAME_LENGTH];  QString str = "/dev/null";  QFileInfo  fi;  do {    str = QString( QString( prefix ) + number2str( dumpCtr ) + ".png" );    fi = str;    dumpCtr++;  } while( fi.exists());  strncpy( name, str.ascii(), MAX_NAME_LENGTH );  return( name );}voidMapView::drawContents( QPainter *p, int cx, int cy, int cw, int ch ){  p->fillRect( cx, cy, cw, ch, colorGroup().brush( QColorGroup::Base ) );  switch(maptype) {  case GLOBAL_MAP:    if (settings.use_global_map) {      p->drawImage( 0, 0, *gimage );    }    break;  case LOCAL_MAP:    if (settings.use_correction) {      p->drawImage( 0, 0, *limage );    }    break;  case SHOW_RAYS:    break;  }}voidMapView::plotRobotPosition( logtools_rpos2_t pos  ){  logtools_ivector2_t  mpos;  map_pos_from_rpos( pos, global_map, &mpos );  gimage->setPixel( global_map->mapsize.x-1-mpos.x,		    mpos.y, 1 );  fprintf( stderr, "(%d:%d)", mpos.x, mpos.y );}voidMapView::updateMap(  ){  int       x, y, i, j;  switch (maptype) {  case GLOBAL_MAP:    if (settings.use_global_map) {      compute_probs_of_global_map( global_map );      for (x=0;x<global_map->mapsize.x;x++) {	for (y=0;y<global_map->mapsize.y;y++) {	  if (global_map->mapsum[x][y]>0) {	    gimage->setPixel( (int) (global_map->mapsize.x-1-x), (int) y,			      (int) (255-253*global_map->mapprob[x][y]) );	  } else {	    global_map->mapprob[x][y] = settings.global_map_std_val;	    gimage->setPixel( (int) (global_map->mapsize.x-1-x), (int) y, 0 );	  }	}      }      resizeContents( gimage->size().width(), gimage->size().height() );    }    break;  case LOCAL_MAP:    if (settings.use_correction) {      for (x=0;x<local_map->mapsize.x;x++) {	for (y=0;y<local_map->mapsize.y;y++) {	  for (i=0;i<scale;i++) {	    for (j=0;j<scale;j++) {	      limage->setPixel( (int) (x*scale+i),				(int) ((local_map->mapsize.y-y-1)*scale+j),				(int) (200.0 * local_map->mapprob[x][y]) );	    }	  }	}      }      resizeContents( limage->size().width(),		      limage->size().height() );    }    break;  case SHOW_RAYS:    resizeContents( viewport()->size().width(),		    viewport()->size().height() );    break;  }    viewport()->repaint( FALSE );  //      plot_robot_path();}voidMapView::clearMap( void ){  int x, y;  for (x=0;x<global_map->mapsize.x;x++) {    for (y=0;y<global_map->mapsize.y;y++) {      global_map->mapsum[x][y]  = 0;      global_map->maphit[x][y]  = 0;      global_map->mapprob[x][y] = settings.global_map_std_val;    }  }  global_map->offset = rpos;  updateMap();}voidMapView::paintRobot( logtools_rpos2_t pos ){  int       rsize;  logtools_ivector2_t  mpos;  QBrush    brush( yellow );  int       vx, vy;  switch (maptype) {  case GLOBAL_MAP:    if (map_pos_from_rpos( pos, global_map, &mpos )) {      contentsToViewport( global_map->mapsize.x-1-mpos.x, mpos.y, vx, vy );        if ( vx>=0 && vx<global_map->mapsize.x &&	   vy>=0 && vy<global_map->mapsize.y) {	pt->setBrush( brush );	pt->setPen(red);	pt->drawEllipse( vx, vy,			 settings.display_pixel_robot_size,			 settings.display_pixel_robot_size );      }      rpos = pos;    }    break;  case LOCAL_MAP:    rsize = (int) ( ( settings.display_robot_size * scale )  /		    settings.local_map_resolution );    if (map_pos_from_rpos( pos, local_map, &mpos )) {      contentsToViewport( mpos.x, local_map->mapsize.y*scale-mpos.y-1,			  vx, vy );        if ( vx>=0 && vx<local_map->mapsize.x &&	   vy>=0 && vy<local_map->mapsize.y) {	pt->setBrush( brush );	pt->setPen(red);	pt->drawEllipse( vx, vy, rsize, rsize );      }    }    break;  }}voidMapView::showRays( void ){  int c, i, sy;    pt->eraseRect ( 0, 0,		  viewport()->size().width(),		  viewport()->size().height() );  sy = (int) (viewport()->size().height() / 2.0);  if (current_scan != NULL) {    for (i=0; i<current_scan->laser.numvalues; i++) {      c = 255;      pt->setPen( QPen( qRgb( c, c, c ), 3 ) );      pt->drawLine( 5, sy,		    (int) (5+( current_scan->coord[i].relpt.x ) / beam_factor),		    (int) (sy-( current_scan->coord[i].relpt.y ) / beam_factor) );    }  }}voidMapView::centerRobot( void ){  logtools_ivector2_t mpos;  switch(maptype) {  case GLOBAL_MAP:    if (map_pos_from_rpos( rpos, global_map, &mpos )) {      center( (int) (global_map->mapsize.x-1-mpos.x), (int) mpos.y );    }    break;  case LOCAL_MAP:    center( (int) ( local_map->center.x * scale ),	    (int) ( local_map->center.y * scale ) );        break;  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -