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

📄 map2d.c.svn-base

📁 采用网格地图SLAM算法
💻 SVN-BASE
字号:
#include "map2d.h"logtools_vector2_tmap2d_compute_laser_abs_point( logtools_rpos2_t rpos, double val,			       logtools_rmove2_t offset, double angle ){  logtools_vector2_t abspt;  abspt.x =    rpos.x +     cos( angle+offset.rotation+rpos.o ) * val;  abspt.y =    rpos.y +     sin( angle+offset.rotation+rpos.o ) * val;  return(abspt);}logtools_laser_coord2_tmap2d_compute_laser2d_coord_with_offset( logtools_lasersens2_data_t lsens,					 int i ){  double        val;  logtools_laser_coord2_t  coord = { {0.0,0.0},{0.0,0.0},0,0 };  logtools_rpos2_t         rpos, npos;  rpos  = logtools_rpos2_with_movement2( lsens.estpos,					 lsens.laser.offset );  npos.x = 0.0;  npos.y = 0.0;  npos.o = 0.0;  val = lsens.laser.val[i];  coord.relpt = logtools_compute_laser_points( npos, val,					       lsens.laser.offset,					       lsens.laser.angle[i] );  coord.abspt = logtools_compute_laser_points( rpos, val,					       lsens.laser.offset,					       lsens.laser.angle[i] );  return(coord);}logtools_laser_coord2_tmap2d_compute_laser2d_coord( logtools_lasersens2_data_t lsens, int i ){  static double        val;  static logtools_laser_coord2_t  coord;  static logtools_rpos2_t         npos;  static logtools_rmove2_t        nomove = {0.0, 0.0, 0.0};    npos.x = 0.0;  npos.y = 0.0;  npos.o = 0.0;  val = lsens.laser.val[i];  coord.relpt = logtools_compute_laser_points( npos, val,					       nomove,					       lsens.laser.angle[i] );  coord.abspt = logtools_compute_laser_points( lsens.estpos, val,					       nomove,					       lsens.laser.angle[i] );  return(coord);}voidcompute_laser2d_points( logtools_log_data_t *rec, int laserID ){  int i, j;  fprintf( stderr, "compute points ...\n" );  for (j=0;j<rec->numlaserscans;j++) {    if (rec->lsens[j].id == laserID) {      if (rec->lsens[j].coord==NULL) {	rec->lsens[j].coord =	  (logtools_laser_coord2_t *) malloc( rec->lsens[j].laser.numvalues *					      sizeof(logtools_laser_coord2_t) );	for (i=0;i<rec->lsens[j].laser.numvalues;i++) {	  rec->lsens[j].coord[i] = map2d_compute_laser2d_coord(rec->lsens[j], i);	}      }    }  }}logtools_vector2_tcompute_rel_coord2_with_offset( logtools_lasersens2_data_t lsens, int i,				logtools_rmove2_t offset ){  double angle, val, rot;  logtools_vector2_t origin;  logtools_vector2_t relpt;  angle = lsens.laser.angle[i];  val   = lsens.laser.val[i];  origin.x = lsens.laser.offset.forward  + offset.forward;  origin.y = lsens.laser.offset.sideward + offset.sideward;  rot      = lsens.laser.offset.rotation + offset.rotation;  if (val>settings.local_map_max_range)    val = settings.local_map_max_range;  relpt.x =    origin.x + cos( (angle+rot) ) * val;  relpt.y =    origin.y + sin( (angle+rot) ) * val;  return(relpt);}intminimal_rpos_diff( logtools_rpos2_t pos1, logtools_rpos2_t pos2, 		   double pos_diff_min_dist, 		   double pos_diff_min_rot ){  logtools_vector2_t v1, v2;  v1.x = pos1.x;    v1.y = pos1.y;  v2.x = pos2.x;    v2.y = pos2.y;  if ( logtools_vector2_distance(v1,v2) > pos_diff_min_dist )    return(TRUE);  if ( compute_orientation_diff(pos1.o,pos2.o) > pos_diff_min_rot )     return(TRUE);  return(FALSE);}intminimal_rmove_diff( logtools_rmove2_t move,		    double pos_diff_min_dist, 		    double pos_diff_min_rot ){  logtools_vector2_t v1;  v1.x = move.forward;    v1.y = move.sideward;  if ( logtools_vector2_length(v1) > pos_diff_min_dist )    return(TRUE);  if ( move.rotation > pos_diff_min_rot )     return(TRUE);  return(FALSE);}#define BOX_MAX_SIZE   600.0#define BOX_ADD_SIZE   0.0#define TIME_HIST      200#define MIN_VEL        20.0intisInBox( logtools_vector2_t p, logtools_vector2_t ll, logtools_vector2_t ur ){  double w, h, cx, cy;  w = ur.x - ll.x;  h = ur.y - ll.y;  if (w>BOX_MAX_SIZE || h>BOX_MAX_SIZE) {    cx = ll.x + w/2.0;    cy = ll.y + h/2.0;    if ( p.x > cx-(BOX_MAX_SIZE/2.0) &&	 p.x < cx+(BOX_MAX_SIZE/2.0) &&	 p.y > cy-(BOX_MAX_SIZE/2.0) &&	 p.y < cy+(BOX_MAX_SIZE/2.0) )      return(1);    else      return(0);  } else {    if ( p.x > ll.x-BOX_ADD_SIZE &&	 p.x < ur.x+BOX_ADD_SIZE &&	 p.y > ll.y-BOX_ADD_SIZE &&	 p.y < ur.y+BOX_ADD_SIZE )      return(1);    else      return(0);  }}voidremove_rear_scans( logtools_log_data_t * rec, int laserID ){  int    i, fstart = 0, remove = 0;    fprintf( stderr, "remove all rear scans\n" );  for (i=0; i<rec->numlaserscans;i++) {    if (rec->lsens[i].id == laserID) {      if (i!=fstart) {	rec->lsens[fstart] = rec->lsens[i];      }      fstart++;    } else {      remove++;    }  }  fprintf( stderr, "found    %d front scans\n", fstart );  fprintf( stderr, "removed  %d rear  scans\n", remove );  rec->numlaserscans = fstart;}voidsave_rec2_movements( logtools_log_data_t rec, REC2_MOVEMENTS * save, int laserID ){  int i, cnt;  logtools_rmove2_t nomove;  save->nummovements = rec.numlaserscans;  save->pos   = (logtools_rpos2_t *) malloc( rec.numlaserscans * sizeof(logtools_rpos2_t) );  save->move  = (logtools_rmove2_t *) malloc( rec.numlaserscans * sizeof(logtools_rmove2_t) );  cnt = -1;  for (i=0; i<rec.numlaserscans;i++) {    save->pos[i] = rec.lsens[i].estpos;  }  nomove.forward   = 0.0;  nomove.sideward  = 0.0;  nomove.rotation  = 0.0;  for (i=0; i<rec.numlaserscans;i++) {    if (rec.lsens[i].id == laserID) {      if (cnt != -1) {	save->move[i] = logtools_movement2_between_rpos2( save->pos[cnt],							  save->pos[i] );      } else {	save->move[i] = nomove;      }      cnt = i;    }  }}voidadd_noise( logtools_log_data_t * rec, REC2_MOVEMENTS orig, int laserID ){  int        i;  logtools_rmove2_t     move, noise, nmove;  double     trans_factor, rot_factor;    for (i=1; i<rec->numlaserscans;i++) {    if (rec->lsens[i].id == laserID) {      srand(settings.random_number);            move = orig.move[i];            if (settings.noise_type == GAUSS_NOISE) {	noise.forward  = random_gauss();	noise.sideward = random_gauss();	noise.rotation = deg2rad(random_gauss());	trans_factor   = settings.add_noise_val;	rot_factor     = settings.add_noise_val;      } else {	noise.forward = rand()/(double) RAND_MAX;	if (rand()%2==1)	  noise.forward *= -1.0;	noise.sideward = rand()/(double) RAND_MAX;	if (rand()%2==1)	  noise.sideward *= -1.0;	noise.rotation = rand()/(double) RAND_MAX;	if (rand()%2==1)	  noise.rotation *= -1.0;	trans_factor =	  ( settings.add_noise_val *	    sqrt( move.forward*move.forward + move.sideward*move.sideward ) ) /	  sqrt( noise.forward*noise.forward + noise.sideward*noise.sideward );	rot_factor =	  ( settings.add_noise_val * fabs( move.rotation ) ) /	  fabs( noise.rotation );      }            nmove.forward   = move.forward  + trans_factor * noise.forward;      nmove.sideward  = move.sideward + trans_factor * noise.sideward;      nmove.rotation  = move.rotation + rot_factor   * noise.rotation;            rec->lsens[i].estpos =	logtools_rpos2_with_movement2( rec->lsens[i-1].estpos, nmove );    }  }}voidcompute_laser2d_bbox( logtools_lasersens2_data_t *lsens ){   int i;    logtools_vector2_t min,max;  min.x = MAXDOUBLE;  min.y = MAXDOUBLE;  max.x = -MAXDOUBLE;  max.y = -MAXDOUBLE;  for (i=0;i<lsens->laser.numvalues;i++) {    if (lsens->laser.val[i]<settings.local_map_max_range) {      if (lsens->coord[i].abspt.x<min.x)	min.x = lsens->coord[i].abspt.x;      if (lsens->coord[i].abspt.y<min.y)	min.y = lsens->coord[i].abspt.y;      if (lsens->coord[i].abspt.x>max.x)	max.x = lsens->coord[i].abspt.x;      if (lsens->coord[i].abspt.y>max.y)	max.y = lsens->coord[i].abspt.y;    }  }  lsens->bbox.min = min;  lsens->bbox.max = max;}logtools_bounding_box_tlaser2d_bbox( int numvalues, float *val, logtools_laser_coord2_t *coord ){   static logtools_bounding_box_t   bbox;  static logtools_vector2_t        min, max;  int i;    min.x = MAXDOUBLE;  min.y = MAXDOUBLE;  max.x = -MAXDOUBLE; max.y = -MAXDOUBLE;    for (i=0;i<numvalues;i++) {    if (val[i]<settings.local_map_max_range) {      if (coord[i].abspt.x<min.x)	min.x = coord[i].abspt.x;      if (coord[i].abspt.y<min.y)	min.y = coord[i].abspt.y;      if (coord[i].abspt.x>max.x)	max.x = coord[i].abspt.x;      if (coord[i].abspt.y>max.y)	max.y = coord[i].abspt.y;    }  }  bbox.min = min;  bbox.max = max;  return(bbox);}intintersect_bboxes( logtools_bounding_box_t box1, logtools_bounding_box_t box2 ){  if (box1.min.x<=box2.min.x) {    /* box1.min.x is smaller that box2 */    if (box1.max.x>box2.min.x) {      /* intersection in x */      if (box1.min.y<=box2.min.y) {	/* box1.min.y is smaller that box2 */	if (box1.max.y>box2.min.y) {	  /* intersection in y */	  return(1);	} else {	  return(0);	}      } else {	/* box2.min.y is smaller that box1 */	if (box2.max.y>=box1.min.y) {	  /* intersection in y */	  return(1);	} else {	  return(0);	}      }    } else {      return(0);    }  } else {    /* box2.min.x is smaller that box1 */    if (box2.max.x>=box1.min.x) {      /* intersection in x */      if (box1.min.y<=box2.min.y) {	/* box1.min.y is smaller that box2 */	if (box1.max.y>box2.min.y) {	  /* intersection in y */	  return(1);	} else {	  return(0);	}      } else {	/* box2.min.y is smaller that box1 */	if (box2.max.y>=box1.min.y) {	  /* intersection in y */	  return(1);	} else {	  return(0);	}      }    } else {      return(0);    }  }  return(0);}

⌨️ 快捷键说明

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