Esempio n. 1
0
carmen_logfile_index_p load_logindex_file(char *index_file_name)
{
	FILE *index_file;
	carmen_logfile_index_p logfile_index;

	index_file = fopen(index_file_name, "r");
	if (index_file == NULL)
		carmen_die("Error: could not open file %s for reading.\n", index_file_name);

	logfile_index = (carmen_logfile_index_p) malloc(sizeof(carmen_logfile_index_t));
	carmen_test_alloc(logfile_index);
	fread(logfile_index, sizeof(carmen_logfile_index_t), 1, index_file);

	// carmen_logfile_index_messages() (in readlog.c) set file size as last offset
	// so, offset array contains one element more than messages
	// it is required by carmen_logfile_read_line to read the last line
	logfile_index->offset = (off_t *) malloc((logfile_index->num_messages + 1) * sizeof(off_t));
	fread(logfile_index->offset, sizeof(off_t), logfile_index->num_messages + 1, index_file);
	logfile_index->current_position = 0;

	fclose(index_file);
	return (logfile_index);
}
Esempio n. 2
0
int carmen_logfile_read_line(carmen_logfile_index_p index, carmen_FILE *infile,
			     int message_num, int max_line_length, char *line)
{
  size_t nread;
  
  /* are we moving sequentially through the logfile?  If not, fseek */
  if(message_num != index->current_position) {
    index->current_position = message_num;
    carmen_fseek(infile, index->offset[index->current_position], SEEK_SET);
  }

  /* check maximum line length */
  if(index->offset[index->current_position + 1] - 
     index->offset[index->current_position] >= max_line_length)
    carmen_die("Error: exceed maximum line length.\n");

  /* read the line of the logfile */
  nread = carmen_fread(line, 1, index->offset[index->current_position + 1] - 
		       index->offset[index->current_position], infile);
  line[nread] = '\0';
  index->current_position++;
  return nread;
}
Esempio n. 3
0
int 
main(int argc, char **argv)
{

	carmen_ipc_initialize(argc, argv);
	carmen_param_check_version(argv[0]);

	read_parameters(argc, argv);

	if (carmen_navigator_ackerman_initialize_ipc() < 0)
		carmen_die("Error: could not connect to IPC Server\n");

	signal(SIGINT, navigator_shutdown);

	carmen_map_server_subscribe_compact_cost_map(NULL, (carmen_handler_t) map_server_compact_cost_map_message_handler, CARMEN_SUBSCRIBE_LATEST);
	carmen_behavior_selector_subscribe_goal_list_message(NULL, (carmen_handler_t) goal_list_handler, CARMEN_SUBSCRIBE_LATEST);
	carmen_behavior_selector_subscribe_current_state_message(NULL, (carmen_handler_t) state_handler, CARMEN_SUBSCRIBE_LATEST);
	carmen_localize_ackerman_subscribe_globalpos_message(NULL, (carmen_handler_t)localize_globalpos_handler, CARMEN_SUBSCRIBE_LATEST);

	carmen_ipc_dispatch();

	return 0;
}
Esempio n. 4
0
static void add_place(int argc, char *argv[])
{
  char *input_filename;
  int next_arg;
  int force;
  char cmd[1024];
  char tmp_filename[1024];
  carmen_FILE *fp_in, *fp_out;
  carmen_map_placelist_t place_list;
  carmen_place_p places;
  int system_err;
  int num_args;

  next_arg = handle_options(argc, argv, &force);
  next_arg++;

  num_args = argc - next_arg;

  if(num_args != 4 && num_args != 5 && num_args != 8) {
    carmen_warn("\nError: wrong number of parameters.\n");    
    carmen_warn("\nUsage: %s <mapfilename> <placename> <place params>\n",
		argv[0]);
    carmen_warn("       2, 3, or 6 place parameters can be given.\n");
  }
     
  input_filename = check_mapfile(argv[next_arg]);
  next_arg++;

  if(!carmen_map_file(input_filename))
    carmen_die("Error: %s does not appear to be a valid carmen map file;\n" 
	       "if it is gzipped, make sure it has a \".gz\" extension.\n",
	       input_filename);

  if(!carmen_map_chunk_exists(input_filename, CARMEN_MAP_PLACES_CHUNK)) {
    place_list.num_places = 1;
    place_list.places = (carmen_place_p)calloc(1, sizeof(carmen_place_t)); 
    carmen_test_alloc(place_list.places);
  } else {
    carmen_map_read_places_chunk(input_filename, &place_list);
    place_list.num_places++;
    place_list.places = (carmen_place_p)realloc
      (place_list.places, sizeof(carmen_place_t) * place_list.num_places); 
    /* check_alloc checked */
  }
  carmen_test_alloc(place_list.places);

  places = place_list.places;

  if(num_args == 4) {
    strcpy(places[place_list.num_places - 1].name, argv[next_arg]);
    places[place_list.num_places - 1].type = CARMEN_NAMED_POSITION_TYPE;
    places[place_list.num_places - 1].x = atof(argv[next_arg+1]);
    places[place_list.num_places - 1].y = atof(argv[next_arg+2]);
  }
  else if(num_args == 5) {
    strcpy(places[place_list.num_places - 1].name, argv[next_arg]);
    places[place_list.num_places - 1].type = CARMEN_NAMED_POSE_TYPE;
    places[place_list.num_places - 1].x = atof(argv[next_arg+1]);
    places[place_list.num_places - 1].y = atof(argv[next_arg+2]);
    places[place_list.num_places - 1].theta = 
      carmen_degrees_to_radians(atof(argv[next_arg+3]));
    fprintf(stderr, "Set (%s %s %s) to (%f.2m, %f.2m, %f.2 rad)\n", argv[4],
	    argv[5], argv[6], places[place_list.num_places - 1].x, 
	    places[place_list.num_places - 1].y,
	    places[place_list.num_places - 1].theta);
  }
  else {
    strcpy(places[place_list.num_places - 1].name, argv[next_arg]);
    places[place_list.num_places - 1].type = CARMEN_LOCALIZATION_INIT_TYPE;
    places[place_list.num_places - 1].x = atof(argv[next_arg+1]);
    places[place_list.num_places - 1].y = atof(argv[next_arg+2]);
    places[place_list.num_places - 1].theta = 
      carmen_degrees_to_radians(atof(argv[next_arg+3]));
    places[place_list.num_places - 1].x_std = atof(argv[next_arg+4]);
    places[place_list.num_places - 1].y_std = atof(argv[next_arg+5]);
    places[place_list.num_places - 1].theta_std = 
      carmen_degrees_to_radians(atof(argv[next_arg+6]));

    fprintf(stderr, "Set (%s %s %s %s %s %s) to:\n(%f.2m +/- %f.2m, %f.2m "
	    "+/- %f.2m, %f.2 +/- %f.2 rad)\n", 
	    argv[next_arg+1], argv[next_arg+2], argv[next_arg+3], 
	    argv[next_arg+4], argv[next_arg+5], argv[next_arg+6], 
	    places[place_list.num_places - 1].x, 
	    places[place_list.num_places - 1].x_std, 
	    places[place_list.num_places - 1].y, 
	    places[place_list.num_places - 1].y_std,
	    places[place_list.num_places - 1].theta, 
	    places[place_list.num_places - 1].theta_std);    
  }
  
  fp_in = carmen_fopen(input_filename, "r");
  if(fp_in == NULL)
    carmen_die_syserror("Error: file %s could not be opened for reading", 
			input_filename);
  
  strcpy(tmp_filename, "/tmp/newmapXXXXXX");
  system_err = mkstemp(tmp_filename);
  if (system_err == -1) 
    carmen_die_syserror("I need to create a temporary file in /tmp, but I "
			"can't for the\n following reason\n");
  
  fp_out = carmen_fopen(tmp_filename, "w");
  if(fp_out == NULL)
    carmen_die_syserror("Error: file could not be opened for writing");

  if(carmen_map_strip(fp_in, fp_out, CARMEN_MAP_PLACES_CHUNK) < 0)
    carmen_die("Error: could not strip places from map file.\n");
  if(carmen_map_write_places_chunk(fp_out, place_list.places, 
				   place_list.num_places) < 0)
    carmen_die("Error: could not write places chunk.\n");

  carmen_fclose(fp_in);
  carmen_fclose(fp_out);

  sprintf(cmd, "mv -f %s %s", tmp_filename, input_filename);
  system_err = system(cmd);
  if (system_err != 0) 
    carmen_die("I created a temporary file contained the map with the new "
	       "place name\nat %s. I tried to copy the new file onto your "
	       "old file, but the copy\nfailed for the following reason: %s\n"
	       "\n"
	       "You will have to copy the new file over yourself.\n", 
	       tmp_filename, strerror(errno));
}
Esempio n. 5
0
static void minimize(int argc, char *argv[])
{
  char *input_filename, *output_filename;
  int next_arg;
  carmen_FILE *in_fp, *out_fp;

  int ret_val;
  carmen_map_t map;
  int x_offset, y_offset;
  carmen_offlimits_list_t offlimits_list;
  carmen_map_placelist_t places;
  int force;
  int previous_num_places;

  next_arg = handle_options(argc, argv, &force);
  next_arg++;

  if(argc - next_arg != 2) {
    carmen_warn("\nError: wrong number of parameters.\n");    
    carmen_die("\nUsage: %s minimize <in map filename> <out map filename>\n\n",
	       argv[0]);
  }

  input_filename = check_mapfile(argv[next_arg]);
  output_filename = check_output(argv[next_arg+1], force);

  /*
   * Read the gridmap, places and offlimits chunks and minimize them
   */ 

  if (carmen_map_read_gridmap_chunk(input_filename, &map) < 0) {
    carmen_die_syserror("Couldn't read GRIDMAP_CHUNK from %s", input_filename);
  }

  carmen_warn("Map size was %d x %d, ",map.config.x_size, map.config.y_size);

  carmen_minimize_gridmap(&map, &x_offset, &y_offset);

  carmen_warn("is now %d x %d (offset %d, %d)\n", map.config.x_size, 
	      map.config.y_size, x_offset, y_offset);


  ret_val = carmen_map_chunk_exists(input_filename, 
				    CARMEN_MAP_OFFLIMITS_CHUNK);
  if (ret_val > 0) {
    ret_val = carmen_map_read_offlimits_chunk
      (input_filename, &(offlimits_list.offlimits), 
       &(offlimits_list.list_length));
    if (ret_val < 0)
      carmen_die_syserror("Couldn't read OFFLIMITS_CHUNK in %s",
			  input_filename);

    carmen_minimize_offlimits(&offlimits_list, x_offset*map.config.resolution, 
			      y_offset*map.config.resolution);
  } else
    offlimits_list.list_length = 0;

  ret_val = carmen_map_chunk_exists(input_filename, CARMEN_MAP_PLACES_CHUNK);
  if (ret_val > 0) {
    ret_val = carmen_map_read_places_chunk(input_filename, &places);
    if (ret_val < 0)
      carmen_die_syserror("Couldn't read PLACES_CHUNK in %s", input_filename);

    previous_num_places = places.num_places;
    carmen_minimize_places(&places, x_offset*map.config.resolution, 
			   y_offset*map.config.resolution, 
			   map.config.x_size*map.config.resolution,
			   map.config.y_size*map.config.resolution);
    if (places.num_places < previous_num_places)
      carmen_warn("%d place locations were dropped from the map after "
		  "minimization.\n", previous_num_places-places.num_places);
  } else
    places.num_places = 0;

  /*
   * Pass everything else through untouched, and then write the rotated
   * chunks at the end.
   */


  in_fp = carmen_fopen(input_filename, "r");
  if (in_fp == NULL)
    carmen_die_syserror("Couldn't open %s for reading", input_filename);

  out_fp = carmen_fopen(output_filename, "w");
  if (out_fp == NULL)
    carmen_die_syserror("Couldn't open %s for writing", output_filename);
  
  if (carmen_map_vstrip(in_fp, out_fp, 3, CARMEN_MAP_GRIDMAP_CHUNK,
			CARMEN_MAP_OFFLIMITS_CHUNK, 
			CARMEN_MAP_PLACES_CHUNK) < 0) 
    carmen_die_syserror("Couldn't strip map to %s", output_filename);
  

  if (carmen_map_write_gridmap_chunk(out_fp, map.map, map.config.x_size, 
				     map.config.y_size, 
				     map.config.resolution) < 0)
    carmen_die_syserror("Couldn't write gridmap to %s", output_filename);

  if (offlimits_list.list_length > 0) {
    if (carmen_map_write_offlimits_chunk(out_fp, offlimits_list.offlimits,
					 offlimits_list.list_length) < 0)
      carmen_die_syserror("Couldn't write offlimits list to %s", 
			  output_filename);
  }

  if (places.num_places > 0) {
    if (carmen_map_write_places_chunk(out_fp, places.places,
				      places.num_places) < 0)
      carmen_die_syserror("Couldn't write places list to %s", output_filename);
  }

  carmen_fclose(in_fp);
  carmen_fclose(out_fp);
}
Esempio n. 6
0
static void rotate(int argc, char *argv[])
{
  int force;
  char *input_filename, *output_filename;
  int next_arg;

  carmen_FILE *in_fp, *out_fp;
  int ret_val;
  carmen_map_t map;
  int rotation = 0;
  double remain;
  int degrees_angle;
  carmen_offlimits_list_t offlimits_list;
  carmen_map_placelist_t places_list;

  next_arg = handle_options(argc, argv, &force);
  next_arg++;

  if(argc - next_arg != 4) {
    carmen_warn("\nError: wrong number of parameters.\n");    
    carmen_die("\nUsage: %s rotate <rotation in degrees> <in map filename> "
	       "<out map filename>\n\n", argv[0]);
  }

  degrees_angle = (int)(atof(argv[next_arg]) / 90);
  remain = fabs(degrees_angle*90 - atof(argv[next_arg]));
  if (carmen_radians_to_degrees(remain) > 2)
    carmen_die("Rotations only supported in increments of 90 degrees.\n");
  else
    rotation = (int)atof(argv[next_arg]) / 90;

  input_filename = check_mapfile(argv[next_arg+1]);
  output_filename = check_output(argv[next_arg+2], force);

  carmen_warn("Rotating by %d degrees\n", rotation*90);

  /*
   * Read the gridmap, places and offlimits chunks and rotate them
   */ 

  ret_val = carmen_map_chunk_exists(input_filename, CARMEN_MAP_GRIDMAP_CHUNK);
  if (ret_val < 0)    
    carmen_die_syserror("Couldn't check existence of GRIDMAP_CHUNK in %s", 
			input_filename);
  
  if (carmen_map_read_gridmap_chunk(input_filename, &map) < 0)
    carmen_die_syserror("Couldn't read GRIDMAP_CHUNK from %s", input_filename);

  carmen_rotate_gridmap(&map, rotation);

  ret_val = carmen_map_chunk_exists(input_filename, 
				    CARMEN_MAP_OFFLIMITS_CHUNK);
  if (ret_val > 0) {
    ret_val = carmen_map_read_offlimits_chunk
      (input_filename, &(offlimits_list.offlimits), 
       &(offlimits_list.list_length));

    if (ret_val < 0)
      carmen_die_syserror("Couldn't read OFFLIMITS_CHUNK in %s",
			  input_filename);

    carmen_rotate_offlimits(map.config, &offlimits_list, rotation);
  } else
    offlimits_list.list_length = 0;

  ret_val = carmen_map_chunk_exists(input_filename, CARMEN_MAP_PLACES_CHUNK);
  if (ret_val > 0) {
    ret_val = carmen_map_read_places_chunk(input_filename, &places_list);
    if (ret_val < 0)
      carmen_die_syserror("Couldn't read PLACES_CHUNK in %s", input_filename);

    carmen_rotate_places(map.config, &places_list, rotation);
  } else
    places_list.num_places = 0;


  /*
   * Pass everything else through untouched, and then write the rotated
   * chunks at the end.
   */

  in_fp = carmen_fopen(input_filename, "r");
  if (in_fp == NULL)
    carmen_die_syserror("Couldn't open %s for reading", input_filename);

  out_fp = carmen_fopen(output_filename, "w");
  if (out_fp == NULL)
    carmen_die_syserror("Couldn't open %s for writing", output_filename);
  
  if (carmen_map_vstrip(in_fp, out_fp, 3, CARMEN_MAP_GRIDMAP_CHUNK,
			CARMEN_MAP_OFFLIMITS_CHUNK, 
			CARMEN_MAP_PLACES_CHUNK) < 0) 
    carmen_die_syserror("Couldn't strip map to %s", output_filename);

  if (carmen_map_write_gridmap_chunk(out_fp, map.map, map.config.x_size, 
				     map.config.y_size, 
				     map.config.resolution) < 0)
    carmen_die_syserror("Couldn't write gridmap to %s", output_filename);

  if (offlimits_list.list_length > 0) {
    if (carmen_map_write_offlimits_chunk(out_fp, offlimits_list.offlimits,
					 offlimits_list.list_length) < 0)
      carmen_die_syserror("Couldn't write offlimits list to %s", 
			  output_filename);
  }

  if (places_list.num_places > 0) {
    if (carmen_map_write_places_chunk(out_fp, places_list.places, 
				      places_list.num_places) < 0)
      carmen_die_syserror("Couldn't write places list to %s", output_filename);
  }

  carmen_fclose(in_fp);
  carmen_fclose(out_fp);
}
Esempio n. 7
0
int
main(int argc, char **argv)
{
	int num_kinect_devices = 1;
	int *flipped=NULL;
	double *resolution=NULL;
	double *fov=NULL;
	double *maxrange=NULL;
	char var_name[256];
	char var_res[256];
	char var_fov[256];
	char var_flipped[256];
	char var_maxrange[256];

	carmen_ipc_initialize(argc, argv);
	carmen_param_check_version(argv[0]);

	carmen_param_t laser_num_devs[] = {{"kinect", "num_kinect_devices", CARMEN_PARAM_INT, &num_kinect_devices, 0, NULL}};

	carmen_param_install_params(argc, argv, laser_num_devs,	sizeof(laser_num_devs) / sizeof(laser_num_devs[0]));

	if (num_kinect_devices<1)
		carmen_die("You have to specify at least one kinect device to run laser.\nPlease check you ini file for the parameter num_kinect_devices.\n");

	resolution     = calloc( num_kinect_devices, sizeof(double) );
	carmen_test_alloc(resolution);

	fov            = calloc( num_kinect_devices, sizeof(double) );
	carmen_test_alloc(fov);

	flipped        = calloc( num_kinect_devices, sizeof(int) );
	carmen_test_alloc(flipped);

	maxrange       = calloc( num_kinect_devices, sizeof(double) );
	carmen_test_alloc(maxrange);

	for(int kinect_id=0; kinect_id<num_kinect_devices; kinect_id++)
	{
	    sprintf(var_name,"laser%d", to_laser_id(kinect_id));
	    strcpy(var_fov,var_name);
	    strcat(var_fov, "_fov");
	    strcpy(var_res,var_name);
	    strcat(var_res, "_resolution");
	    strcpy(var_maxrange,var_name);
	    strcat(var_maxrange, "_maxrange");
	    strcpy(var_flipped,var_name);
	    strcat(var_flipped, "_flipped");

		carmen_param_t laser_params[] = {
		{"laser", var_fov, CARMEN_PARAM_DOUBLE,              &(fov[kinect_id]),            0, NULL},
		{"laser", var_res, CARMEN_PARAM_DOUBLE,              &(resolution[kinect_id]),     0, NULL},
		{"laser", var_maxrange, CARMEN_PARAM_DOUBLE,         &(maxrange[kinect_id]),       0, NULL},
		{"laser", var_flipped, CARMEN_PARAM_INT,             &(flipped[kinect_id]),        0, NULL}};

		carmen_param_install_params(argc, argv, laser_params, sizeof(laser_params) / sizeof(laser_params[0]));

		init_message_laser_params(to_laser_id(kinect_id), 0.02, fov[kinect_id], resolution[kinect_id], maxrange[kinect_id]);

		carmen_laser_define_laser_message(to_laser_id(kinect_id));

		carmen_kinect_subscribe_depth_message(kinect_id, NULL,
				(carmen_handler_t) ipc_kinect_depth_handler,
				CARMEN_SUBSCRIBE_ALL );
	}

	signal(SIGINT, shutdown_camera_view);

	IPC_dispatch();

	free(fov);
	free(flipped);
	free(maxrange);
	free(resolution);

	return 0;
}
void
carmen_planner_util_test_trajectory(carmen_planner_path_p path)
{
	int index;
	carmen_ackerman_traj_point_t point = {0,0,0,0,0};
	carmen_ackerman_traj_point_p point_p;

	carmen_planner_util_clear_path(path);
	if (path->length != 0)
		carmen_die("Test failed: clear should set length to 0, but length is %d\n",
				path->length);

	memset(&point, 0, sizeof(carmen_ackerman_traj_point_t));
	for (index = 0; index < 100; index++)
	{
		point.x = index;
		point.y = index;
		carmen_planner_util_add_path_point(point, path);
	}

	for (index = 0; index < 100; index++)
	{
		point_p = carmen_planner_util_get_path_point(index, path);
		if (point_p->x != index || point_p->y != index)
			carmen_die("Test failed: After 100 set points, get point on %d did not "
					"match: was %.0f %.0f\n", index, point_p->x, point_p->y);
	}

	point.x = 50.5;
	point.y = 50.5;

	carmen_planner_util_insert_blank(50, path);
	carmen_planner_util_set_path_point(50, &point, path);
	point_p = carmen_planner_util_get_path_point(50, path);
	if (fabs(point_p->x - 50.5) > 0.05 || fabs(point_p->y - 50.5) > 0.05)
		carmen_die("Blank then set failed.\n");

	if (path->length != 101)
		carmen_die("Length (%d) not 101 after insert_blank then set.\n",
				path->length);

	point.x = 60.5;
	point.y = 60.5;
	carmen_planner_util_insert_path_point(60, &point, path);

	if (fabs(point_p->x - 50.5) > 0.05 || fabs(point_p->y - 50.5) > 0.05)
		carmen_die("Blank then set failed.\n");

	if (path->length != 102)
		carmen_die("Length (%d) not 102 after insert_blank then set.\n",
				path->length);

	carmen_planner_util_delete_path_point(50, path);
	carmen_planner_util_delete_path_point(60, path);

	if (path->length != 100)
		carmen_die("Length (%d) not 100 after insert_blank then set.\n",
				path->length);

	carmen_planner_util_clip_path(50, path);

	for (index = 0; index < path->length; index++)
		carmen_planner_util_delete_path_point(index, path);

	for (index = 0; index < path->length; index++)
	{
		point_p = carmen_planner_util_get_path_point(index, path);
		if (point_p->x != 2*index+1 || point_p->y != 2*index+1)
			carmen_die("Test failed: After deleting even points, get point on %d "
					"(%d) did not match: was %.0f %.0f %.0f\n", 2*index+1, index,
					point_p->x, point_p->y,
					carmen_radians_to_degrees(point_p->theta));
	}
}
Esempio n. 9
0
//
// This calls the procedures in the other files which do all the real work. 
// If you wanted to not use hierarchical SLAM, you could remove all references here to High*, and make
// certain to set LOW_DURATION in low.h to some incredibly high number.
//
void *Slam(void * /*arg unused */)
{
  TPath *path, *trashPath;
  TSenseLog *obs, *trashObs;
  double oldmC_D = 0;
  double oldmC_T = 0;
  double oldvC_D = 0;
  double oldvC_T = 0;
  double oldmD_D = 0;
  double oldmD_T = 0;
  double oldvD_D = 0;
  double oldvD_T = 0;
  double oldmT_D = 0;
  double oldmT_T = 0;
  double oldvT_D = 0;
  double oldvT_T = 0;

  outFile = fopen("motionModel.txt", "w");
  fprintf(outFile, "This file lists the motion model parameters in the following order : \n");
  fprintf(outFile, "    - mean value from observed translation\n");
  fprintf(outFile, "    - mean value from observed rotation\n");
  fprintf(outFile, "    - variance contributed from observed translation\n");
  fprintf(outFile, "    - variance contributed from observed rotation\n");
  fprintf(outFile, "\n");
  fprintf(outFile, "------------Intermediate Models------------------\n");
  fprintf(outFile, "   m_dist m_turn   v_dist v_turn\n");
  fprintf(outFile, "C: %.4f %.4f   %.4f %.4f\n", meanC_D, meanC_T, varC_D, varC_T);
  fprintf(outFile, "D: %.4f %.4f   %.4f %.4f\n", meanD_D, meanD_T, varD_D, varD_T);
  fprintf(outFile, "T: %.4f %.4f   %.4f %.4f\n", meanT_D, meanT_T, varT_D, varT_T);
  fprintf(outFile, "\n");
  fclose(outFile);

  while ((fabs(oldmC_D-meanC_D) > 0.01)||(fabs(oldmC_T-meanC_T) > 0.03)||(fabs(oldvC_D-varC_D) > 0.01)||(fabs(oldvC_T-varC_T) > 0.1) || 
	 (fabs(oldmD_D-meanD_D) > 0.01)||(fabs(oldmD_T-meanD_T) > 0.03)||(fabs(oldvD_D-varD_D) > 0.01)||(fabs(oldvD_T-varD_T) > 0.1) || 
	 (fabs(oldmT_D-meanT_D) > 0.03)||(fabs(oldmT_T-meanT_T) > 0.01)||(fabs(oldvT_D-varT_D) > 0.03)||(fabs(oldvT_T-varT_T) > 0.01)) {

    readFile = carmen_fopen(PLAYBACK, "r");
    if(readFile == NULL)
      carmen_die("Error: could not open file %s for reading.\n", PLAYBACK);
    logfile_index = carmen_logfile_index_messages(readFile);

    InitLowSlam();
    LowSlam(&path, &obs);
    carmen_fclose(readFile);

    oldmC_D = meanC_D;    
    oldmC_T = meanC_T;
    oldvC_D = varC_D;    
    oldvC_T = varC_T;
    oldmD_D = meanD_D;    
    oldmD_T = meanD_T;
    oldvD_D = varD_D;    
    oldvD_T = varD_T;
    oldmT_D = meanT_D;    
    oldmT_T = meanT_T;
    oldvT_D = varT_D;    
    oldvT_T = varT_T;

    outFile = fopen("motionModel.txt", "a");
    Learn(path);
    fclose(outFile);

    // Get rid of the path and log of observations
    while (path != NULL) {
      trashPath = path;
      path = path->next;
      free(trashPath);
    }
    while (obs != NULL) {
      trashObs = obs;
      obs = obs->next;
      free(trashObs);
    }
  }


  outFile = fopen("motionModel.txt", "a");
  fprintf(outFile, "\n");
  fprintf(outFile, "------------Final Model------------------\n");
  fprintf(outFile, "   m_dist m_turn   v_dist v_turn\n");
  fprintf(outFile, "C: %.4f %.4f   %.4f %.4f\n", meanC_D, meanC_T, varC_D, varC_T);
  fprintf(outFile, "D: %.4f %.4f   %.4f %.4f\n", meanD_D, meanD_T, varD_D, varD_T);
  fprintf(outFile, "T: %.4f %.4f   %.4f %.4f\n", meanT_D, meanT_T, varT_D, varT_T);

  fprintf(outFile, "\n");
  fprintf(outFile, "#define meanC_D %.4f\n#define meanC_T %.4f\n#define varC_D %.4f\n#define varC_T %.4f\n\n", meanC_D, meanC_T, varC_D, varC_T);
  fprintf(outFile, "#define meanD_D %.4f\n#define meanD_T %.4f\n#define varD_D %.4f\n#define varD_T %.4f\n\n", meanD_D, meanD_T, varD_D, varD_T);
  fprintf(outFile, "#define meanT_D %.4f\n#define meanT_T %.4f\n#define varT_D %.4f\n#define varT_T %.4f\n\n", meanT_D, meanT_T, varT_D, varT_T);
  fclose(outFile);

  CloseLowSlam();
  return NULL;
}
Esempio n. 10
0
int main(int argc, char *argv[])
{
  struct stat buf;
  double x, y, theta, tv, rv;  
  double left_disp, right_disp, delta_time;
  int fd;
  int unused_return_value;

  if (argc != 2 || carmen_strncasecmp(argv[1], "-h", 2) == 0 ||
      carmen_strncasecmp(argv[1], "--h", 3) == 0) {
    if (argc > 2) 
      carmen_warn("Too many arguments.\n\n");
    else if (argc < 2)
      carmen_warn("Not enough arguments.\n\n");
    carmen_die("Usage: %s <serial dev name>\n", argv[0]);
  }
  
  // Does the device exist?

  carmen_warn("Device exists test: ");
  if (stat(argv[1], &buf) == 0) 
    carmen_warn("OK\n");
  else {
    carmen_warn("FAILED\n");
    carmen_die_syserror("Device exists test");
  }

  // Can we open the device?

  carmen_warn("Device open test: ");
  fd = open(argv[1], O_RDWR | O_SYNC | O_NOCTTY, 0);
  if (fd >= 0)
    carmen_warn("OK\n");
  else {
    carmen_warn("FAILED\n");
    carmen_die_syserror("Device open test");
  }
  //  close(fd);

  // Can we talk to the orc board properly? 

  carmen_warn("Orc recognized test: ");
  if (carmen_base_direct_initialize_robot("orc", argv[1]) == 0)
    carmen_warn("OK\n");
  else {
    carmen_die("FAILED\n");
  }

  // Can we move the wheels?  

  carmen_warn("Orc drive test: %sMAKE SURE THE ROBOT IS ON BLOCKS%s.\n",
	      carmen_red_code, carmen_normal_code);
  carmen_warn("Hit return to start the orc drive test...."); 
  unused_return_value = scanf("%*c");

  if (1) {
  // Move left wheel 
  carmen_warn("Left wheel forwards test: ");
  carmen_base_command_velocity(1, 0, 0);
  sleep(1);
  carmen_base_command_velocity(0, 0, 0);
  sleep(1);
  carmen_base_query_low_level(&left_disp, &right_disp, &delta_time);
  //  carmen_warn("%f %f %f\n", left_disp, right_disp, delta_time);
  if (0 && fabs(right_disp) > 1e-3) 
    carmen_die("FAILED\nRight encoder moved. The motors need "
	       "to be swapped.\n");
  if (left_disp < -1e-3)
    carmen_die("FAILED\n Left encoder moved backwards. The motor is "
	       "upside-down.\n");
  if (fabs(left_disp) < 1e-3) 
    carmen_die("FAILED\nEncoder failed to move. Did the wheel move?\n");

  carmen_warn("OK\n");

  carmen_warn("Left wheel backwards test: ");
  carmen_base_command_velocity(-1, 0, 0);
  sleep(1);
  carmen_base_command_velocity(0, 0, 0);
  sleep(1);
  carmen_base_query_low_level(&left_disp, &right_disp, &delta_time);
  //  carmen_warn("%f %f %f\n", left_disp, right_disp, delta_time);
  if (0 && fabs(right_disp) > 1e-3) 
    carmen_die("FAILED\nRight encoder moved. Very odd.\n");
  if (left_disp > 1e-3)
    carmen_die("FAILED\n Left encoder moved forwards. Very odd.\n");
  if (fabs(left_disp) < 1e-3) 
    carmen_die("FAILED\nEncoder failed to move. Did the wheel move?\n");

  carmen_warn("OK\n");

  // Move right wheel

  carmen_warn("Right wheel forwards test: ");
  carmen_base_command_velocity(1, 0, 2);
  sleep(1);
  carmen_base_command_velocity(0, 0, 2);
  sleep(1);
  carmen_base_query_low_level(&left_disp, &right_disp, &delta_time);
  //  carmen_warn("%f %f %f\n", left_disp, right_disp, delta_time);
  if (0 && fabs(left_disp) > 1e-3) 
    carmen_die("FAILED\nLeft encoder moved. This is very odd, since it"
	       "also moved with\nthe other wheel.\n");
  if (right_disp < -1e-3)
    carmen_die("FAILED\nRight encoder moved backwards. The motor is "
	       "upside-down.\n");
  if (fabs(right_disp) < 1e-3) 
    carmen_die("FAILED\nEncoder failed to move. Did the wheel move?\n");
  carmen_warn("OK\n");
  
  carmen_warn("Right wheel backwards test: ");
  carmen_base_command_velocity(-1, 0, 2);
  sleep(1);
  carmen_base_command_velocity(0, 0, 2);
  sleep(1);
  carmen_base_query_low_level(&left_disp, &right_disp, &delta_time);
  //  carmen_warn("%f %f %f\n", left_disp, right_disp, delta_time);
  if (0 && fabs(left_disp) > 1e-3) 
    carmen_die("FAILED\nLeft encoder moved. Very odd.\n");
  if (right_disp > 1e-3)
    carmen_die("FAILED\nRight encoder moved forwards. Very odd.\n");
  if (fabs(right_disp) < 1e-3) 
    carmen_die("FAILED\nEncoder failed to move. Did the wheel move?\n");
  }
  carmen_warn("OK\n");

  carmen_base_direct_reset();

  carmen_warn("Orc drive test: ");
  if (carmen_base_direct_set_velocity(1.0, 0.0) == 0)
    carmen_warn("OK\n");
  else 
    carmen_die("FAILED\n");  

  // Let some encoder data build up

  carmen_warn("Sleep\n");
  sleep(1); 
  
  carmen_base_direct_set_velocity(0.0, 0.0);

  // Are we getting encoder data?

  carmen_warn("Orc encoder test: ");
  if (carmen_base_direct_get_integrated_state(&x, &y, &theta, &tv, &rv) == 0)
    carmen_warn("OK\n");
  else
    carmen_die("FAILED\n");
  
  // Is encoder data valid?

  carmen_warn("Orc encoder data validity test: ");
  if (fabs(x) > 0 && fabs(y) < 1e-2 && 
      fabs(carmen_radians_to_degrees(theta)) < 10) 
    carmen_warn("OK (%.2f)\n", x);
  else
    carmen_die("FAILED (%.2f %.2f %.2f)\n", x, y, 
	       carmen_radians_to_degrees(theta));

  carmen_base_direct_shutdown_robot();

  return 0;
}
Esempio n. 11
0
static void help(int argc, char **argv)
{
  char *action;

  if (argc < 3 || argc > 3) 
    main_usage(argv[0]);

  action = argv[2];
  if (carmen_strcasecmp(action, "info") == 0)
    carmen_die("\nUsage: %s info <map filename>\n\n", 
	       argv[0]); 
  else if (carmen_strcasecmp(action, "toppm") == 0)
    carmen_die("\nUsage: %s toppm <map filename> <ppm filename>\n\n", 
	       argv[0]); 
  else if (carmen_strcasecmp(action, "tomap") == 0)
    carmen_die("\nUsage: %s tomap <resolution> <image file> "
	       "<map filename>\n\nThe image file can be in most standard "
	       "formats such as gif, png, jpeg, etc.\n\n", argv[0]); 
  else if (carmen_strcasecmp(action, "rotate") == 0)
    carmen_die("\nUsage: %s rotate <rotation in degrees> <in map filename> "
	       "<out map filename>\n\nThe rotation angle must be in multiples "
	       "of 90degrees -- arbitrary rotations are not\nyet supported."
	       "\n\n", argv[0]);
  else if (carmen_strcasecmp(action, "minimize") == 0)
    carmen_die("\nUsage: %s minimize <in map filename> <out map filename>\n\n",
	       argv[0]);
  else if (carmen_strcasecmp(action, "add_place") == 0) {
    fprintf(stderr, "\nUsage: %s <mapfilename> <placename> <place params>\n",
	    argv[0]);
    fprintf(stderr, "       2, 3, or 6 place parameters can be given.\n");
    fprintf(stderr, "       2 parameters - named position (x, y)\n");
    fprintf(stderr, "       3 parameters - named pose (x, y, theta)\n");
    fprintf(stderr, "       6 parameters - initialization position\n");
    fprintf(stderr, "                      (x, y, theta, std_x, std_y, "
	    "std_theta)\n");
    fprintf(stderr, "\nRemember: The x/y/std_x/std_y co-ordinates are in "
	    "%sMETRES%s, not in\n", carmen_red_code, carmen_normal_code);
    fprintf(stderr, "grid cells. \n");
    fprintf(stderr, "\nAlso: theta is in %sDEGREES%s. I will print out the "
	    "conversion to radians\n", carmen_red_code, carmen_normal_code);
    fprintf(stderr, "automatically for you.\n\n");
    fprintf(stderr, "Note that unlike rotate, minimize, etc., add_place "
	    "performs an in-place edit\nto the map, and creates a backup "
	    "copy.\n\n");
    exit(0);
  } else if (carmen_strcasecmp(action, "add_offset") == 0) {
    carmen_warn("\nUsage: %s <mapfilename> <x> <y> <theta>\n",
		argv[0]);
    carmen_warn("       <theta> should be given in degrees.\n");
    exit(0);
  } else if (carmen_strcasecmp(action, "strip") == 0) {
    fprintf(stderr, "\nUsage: %s strip <in map filename> <in map filename> "
	    "<chunk type>\n\n", argv[0]);
    fprintf(stderr, "If the map file contains a data chunk of this type, "
	    "it will\nbe removed on output. All other chunks will be "
	    "passed through untouched.\n");
    fprintf(stderr, "<chunk type> can be one of \"laserscans\", "
	    "\"places\", \"gridmap\", \"offlimits\", ");
    fprintf(stderr, "                                \"expected\".\n\n");

    exit(0);
  }

  carmen_warn("\nUnrecognized command %s\n", action);
  main_usage(argv[0]);
}
Esempio n. 12
0
carmen_centrallist_p carmen_multicentral_initialize(int argc, char **argv,
						    void (*exit_handler)(void))
{
  FILE *fp = NULL;
  carmen_centrallist_p centrallist;
  int err2, valid, i, one_central;
  char filename[256], *centralhost, *err, line[256];

  centrallist = (carmen_centrallist_p)calloc(1, sizeof(carmen_centrallist_t));
  carmen_test_alloc(centrallist);

  centrallist_copy = centrallist;

  valid = 0;
  if(argc >= 3) 
    for(i = 1; i < argc - 1; i++)
      if(strcmp(argv[i], "-central") == 0) {
	strcpy(filename, argv[i + 1]);
	valid = 1;
	break;
      }
  
  if(valid)
    fp = fopen(filename, "r");

  if(valid && fp != NULL) {
    /* read from the file */
    centrallist->num_centrals = 0;
    centrallist->central = NULL;
    do {
      err = fgets(line, 256, fp);
      if(err != NULL) {
	valid = 0;
	for(i = 0; i < (int)strlen(line); i++)
	  if(isalpha(line[i]))
	    valid = 1;
	if(valid) {
	  (centrallist->num_centrals)++;
	  centrallist->central = 
	    (carmen_central_p)realloc(centrallist->central,
				      centrallist->num_centrals *
				      sizeof(carmen_central_t));
	  carmen_test_alloc(centrallist->central);
	  sscanf(line, "%s", 
		 centrallist->central[centrallist->num_centrals - 1].host);
	  centrallist->central[centrallist->num_centrals - 1].connected = 0;
	  centrallist->central[centrallist->num_centrals - 1].ready_for_reconnect = 0;
	}
      }
    } while(err != NULL);
    fclose(fp);
  }
  else {
    /* if we can't open the list of centrals, default to connecting to
       localhost */
    if(valid)
      carmen_warn("Error: could not open central list %s for reading.\n", 
	       filename);
    centrallist->num_centrals = 1;
    
    centrallist->central = (carmen_central_p)
      calloc(1, sizeof(carmen_central_t));
    carmen_test_alloc(centrallist->central);
    
    centralhost = getenv("CENTRALHOST");
    if(centralhost == NULL)
      strcpy(centrallist->central[0].host, "localhost");
    else
      strcpy(centrallist->central[0].host, centralhost);
    centrallist->central[0].connected = 0;
    centrallist->central[0].ready_for_reconnect = 0;
  }

  fprintf(stderr, "CENTRAL List:\n");
  fprintf(stderr, "-------------\n");
  for(i = 0; i < centrallist->num_centrals; i++)
    fprintf(stderr, "%d : %s\n", i, centrallist->central[i].host);
  fprintf(stderr, "\n");

  /* set verbosity level */
  IPC_setVerbosity(IPC_Silent);

  /* construct unique IPC module name */
  snprintf(module_name, 200, "%s-%d", 
	   carmen_extract_filename(argv[0]), getpid());

  /* attempt to connect to each central */
  one_central = 0;
  for(i = 0; i < centrallist->num_centrals; i++) {
    err2 = carmen_multicentral_ipc_connect(module_name, 
					   centrallist->central[i].host);
    /* if successful, get IPC context */
    if(err2 >= 0) {
      fprintf(stderr, "MULTICENTRAL: central %s connected.\n", 
	      centrallist->central[i].host);
      centrallist->central[i].connected = 1;
      centrallist->central[i].context = IPC_getContext();
      x_ipcRegisterExitProc(carmen_multicentral_ipc_exit_handler);
      one_central = 1;
    }
    else
      centrallist->central[i].context = NULL;
  }
  if(!one_central && carmen_allow_no_centrals)
    carmen_warn("Error: could not connect to any central.\n");
  else  if(!one_central)
    carmen_die("Error: could not connect to any central.\n");
  client_exit_handler = exit_handler;
  return centrallist;
}
Esempio n. 13
0
static void add_new_dot_filter(int *cluster_map, int c, int n,
			       double *x, double *y) {
  int i, id;
  double ux, uy, vx, vy, vxy, cnt;

  for (id = 0; id < num_filters; id++) {
    for (i = 0; i < num_filters; i++)
      if (filters[i].id == id)
	break;
    if (i == num_filters)
      break;
  }

  printf("A%d\n", id);

  for (i = 0; i < n && cluster_map[i] != c; i++);
  if (i == n)
    carmen_die("Error: invalid cluster! (cluster %d not found)\n", c);

  num_filters++;
  filters = (carmen_dot_filter_p) realloc(filters, num_filters*sizeof(carmen_dot_filter_t));
  carmen_test_alloc(filters);

  filters[num_filters-1].id = id;

  ux = uy = 0.0;
  cnt = 0;
  for (i = 0; i < n; i++)
    if (cluster_map[i] == c) {
      ux += x[i];
      uy += y[i];
      cnt++;
    }
  ux /= (double)cnt;
  uy /= (double)cnt;

  vx = vy = vxy = 0.0;
  for (i = 0; i < n; i++)
    if (cluster_map[i] == c) {
      vx += (x[i]-ux)*(x[i]-ux);
      vy += (y[i]-uy)*(y[i]-uy);
      vxy += (x[i]-ux)*(y[i]-uy);
    }
  vx /= (double)cnt;
  vy /= (double)cnt;
  vxy /= (double)cnt;

  filters[num_filters-1].person_filter.x = ux;
  filters[num_filters-1].person_filter.y = uy;
  filters[num_filters-1].person_filter.x0 = ux;
  filters[num_filters-1].person_filter.y0 = uy;
  for (i = 0; i < MAX_PERSON_FILTER_VELOCITY_WINDOW; i++) {
    filters[num_filters-1].person_filter.vx[i] = 0.0;
    filters[num_filters-1].person_filter.vy[i] = 0.0;
  }
  filters[num_filters-1].person_filter.vpos = 0;
  filters[num_filters-1].person_filter.vlen = 0;
  filters[num_filters-1].person_filter.hidden_cnt = 0;
  filters[num_filters-1].person_filter.px = vx; //default_person_filter_px;
  filters[num_filters-1].person_filter.py = vy; //default_person_filter_py;
  filters[num_filters-1].person_filter.pxy = vxy; //default_person_filter_pxy;
  filters[num_filters-1].person_filter.a = default_person_filter_a;
  filters[num_filters-1].person_filter.qx = default_person_filter_qx;
  filters[num_filters-1].person_filter.qy = default_person_filter_qy;
  filters[num_filters-1].person_filter.qxy = default_person_filter_qxy;
  filters[num_filters-1].person_filter.rx = default_person_filter_rx;
  filters[num_filters-1].person_filter.ry = default_person_filter_ry;
  filters[num_filters-1].person_filter.rxy = default_person_filter_rxy;

  for (i = 0; i < n; i++)
    if (cluster_map[i] == c) {
      //printf(" (%.2f, %.2f)", x[i], y[i]);
      person_filter_sensor_update(&filters[num_filters-1].person_filter, x[i], y[i]);
    }
  //printf("\n");

  filters[num_filters-1].trash_filter.x = ux;
  filters[num_filters-1].trash_filter.y = uy;
  filters[num_filters-1].trash_filter.px = vx; //default_trash_filter_px;
  filters[num_filters-1].trash_filter.py = vy; //default_trash_filter_py;
  filters[num_filters-1].trash_filter.py = vxy;
  filters[num_filters-1].trash_filter.a = default_trash_filter_a;
  filters[num_filters-1].trash_filter.qx = default_trash_filter_qx;
  filters[num_filters-1].trash_filter.qy = default_trash_filter_qy;
  filters[num_filters-1].trash_filter.qxy = default_trash_filter_qxy;
  filters[num_filters-1].trash_filter.rx = default_trash_filter_rx;
  filters[num_filters-1].trash_filter.ry = default_trash_filter_ry;
  filters[num_filters-1].trash_filter.rxy = default_trash_filter_rxy;

  for (i = 0; i < n; i++)
    if (cluster_map[i] == c)
      trash_filter_sensor_update(&filters[num_filters-1].trash_filter, x[i], y[i]);

  filters[num_filters-1].door_filter.x = ux;
  filters[num_filters-1].door_filter.y = uy;
  filters[num_filters-1].door_filter.t = bnorm_theta(vx, vy, vxy);
  //    bnorm_theta(filters[num_filters-1].person_filter.px,
  //	filters[num_filters-1].person_filter.py,
  //	filters[num_filters-1].person_filter.pxy);
  filters[num_filters-1].door_filter.px = vx; //default_door_filter_px;
  filters[num_filters-1].door_filter.py = vy; //default_door_filter_py;
  filters[num_filters-1].door_filter.pt = default_door_filter_pt;
  filters[num_filters-1].door_filter.pxy = vxy; //0;  //dbug?
  filters[num_filters-1].door_filter.a = default_door_filter_a;
  filters[num_filters-1].door_filter.qx = default_door_filter_qx;
  filters[num_filters-1].door_filter.qy = default_door_filter_qy;
  filters[num_filters-1].door_filter.qxy = default_door_filter_qxy;
  filters[num_filters-1].door_filter.qt = default_door_filter_qt;  

  for (i = 0; i < n; i++)
    if (cluster_map[i] == c)
      door_filter_sensor_update(&filters[num_filters-1].door_filter, x[i], y[i]);

  filters[num_filters-1].type = dot_classify(&filters[num_filters-1]);
  filters[num_filters-1].allow_change = 1;
  filters[num_filters-1].sensor_update_cnt = 0;
  filters[num_filters-1].do_motion_update = 0;
  filters[num_filters-1].updated = 1;
  filters[num_filters-1].last_type = filters[num_filters-1].type;
  filters[num_filters-1].invisible = 0;
  filters[num_filters-1].invisible_cnt = 0;

  print_filters();
}
Esempio n. 14
0
int
main( int argc, char *argv[] )
{ 
  carmen_point_t                  pos, corrpos, odo;
  double                          time;
  int                             i;
  int                             scancnt;
  carmen_move_t                   pos_move = {0.0, 0.0, 0.0};
  carmen_move_t                   corr_move = {0.0, 0.0, 0.0};
  carmen_point_t                  old_pos = {0.0, 0.0, 0.0};
  carmen_point_t                  old_corrpos = {0.0, 0.0, 0.0};
  int which_laser = 0;

  carmen_FILE stdout_carmen;
  stdout_carmen.compressed = 0;  
  stdout_carmen.fp = stdout;

  if (argc < 2) {
    print_usage();
    exit(1);
  }

  scancnt=0;
  for (i=1; i < argc-1; i++) {
    if (!strcmp(argv[i], "-f")  || !strcmp(argv[i], "--flaser"))
      which_laser = 1;
    if (!strcmp(argv[i], "-r")  || !strcmp(argv[i], "--robotlaser"))
      which_laser = 2;
  }

  carmen_ipc_initialize(argc, argv);
  vascocore_init(argc, argv);

  /*   file handler */
  carmen_FILE *logfile = NULL;

  /*   log file index structure */
  carmen_logfile_index_p logfile_index = NULL;

  /*  open logfile for reading */
  logfile = carmen_fopen(argv[argc-1], "r");
  if(logfile == NULL)
    carmen_die("Error: could not open file %s for reading.\n", argv[1]);

  /* create index structure */
  logfile_index = carmen_logfile_index_messages(logfile);
  
  /*   buffer for reading the lines */
  const int max_line_length=9999;
  char line[max_line_length+1];
  
  /*   used to read the messages. erase stucture before! */
  carmen_robot_laser_message l;
  carmen_erase_structure(&l, sizeof(carmen_robot_laser_message) );

  /*   iterate over all entries in the logfile */
  while (!carmen_logfile_eof(logfile_index)) {

    int correct_msg = 1;
    /*     read the line from the file */
    carmen_logfile_read_next_line(logfile_index, 
				  logfile,
				  max_line_length, 
				  line);
    
    /*     what kind of message it this? */
    if (which_laser != 1 && strncmp(line, "ROBOTLASER1 ", 12) == 0) {
      /*  convert the string using the corresponding read function */
      char* next = carmen_string_to_robot_laser_message(line, &l);
      time = atof( strtok( next, " ") );

    }
    else if (which_laser != 2 && strncmp(line, "FLASER ", 7) == 0) {
      /*  convert the string using the corresponding read function */
      char* next = carmen_string_to_robot_laser_message_orig(line, &l);
      time = atof( strtok( next, " ") );
    }
    else {
      correct_msg = 0;
      fputs(line, stdout);
    }

    if (correct_msg) {
      odo = l.robot_pose;
      pos = l.laser_pose;

      /* using the new scan match function that takes robot laser messages...
      carmen_laser_laser_message scan;
      carmen_erase_structure(&scan,  sizeof(carmen_laser_laser_message) );
      scan.timestamp      = l.timestamp;
      scan.config         = l.config;
      scan.num_readings   = l.num_readings;
      scan.num_remissions = l.num_remissions;
      scan.range          = l.range;
      scan.remission      = l.remission;
      scan.host           = l.host;

      corrpos = vascocore_scan_match( scan, pos );*/
      corrpos = vascocore_scan_match_robot( l );

      scancnt++;
      corr_move = carmen_move_between_points( old_corrpos, corrpos );
      pos_move = carmen_move_between_points( old_pos, pos );

      fprintf( stderr, "expected movement  %.6f m %.6f m %.6f degree\n",
	       corr_move.forward, corr_move.sideward,
	       rad2deg(corr_move.rotation) );
      fprintf( stderr, "corrected movement %.6f m %.6f m %.6f degree\n\n",
	       pos_move.forward, pos_move.sideward,
	       rad2deg(pos_move.rotation) );

      l.laser_pose = corrpos;

      carmen_logwrite_write_robot_laser(&l,1,&stdout_carmen, time);
      fflush(stdout);
   
      old_pos     = pos;
      old_corrpos = corrpos;
    }
    
  }
  
  /* close the file */
  carmen_fclose(logfile);

  fprintf(stderr, "\ndone, corrected %d messages!\n", scancnt);

  /* free index structure */
  carmen_logfile_free_index(&logfile_index);
  
  return(0);
  
}
Esempio n. 15
0
void read_nsick_logfile(char *filename, logdata_p logdata) {
  int buffer_pos, buffer_length, offset = 0;
  int linecount = 0, mark, n, i;
  long int nread, log_bytes = 0;
  carmen_FILE *log_fp = NULL;
  char *current_pos;
  char buffer[10000];
  int laser_num_readings;
  double laser_start_angle, laser_fov;

  /* initialize logdata structure */
  logdata->num_laser = 0;
  logdata->max_laser = 1000;
  logdata->laser = (laser_scan_p)calloc(logdata->max_laser,
    sizeof(laser_scan_t));
  carmen_test_alloc(logdata->laser);
  logdata->num_pos = 0;
  logdata->max_pos = 1000;
  logdata->pos = (laser_pos_p)calloc(logdata->max_pos, sizeof(laser_pos_t));
  carmen_test_alloc(logdata->pos);

  /* compute total number of bytes in logfile */
  log_fp = carmen_fopen(filename, "r");
  if (log_fp == NULL)
    carmen_die("Error: could not open file %s for reading.\n", filename);

  do {
    nread = carmen_fread(buffer, 1, 10000, log_fp);
    log_bytes += nread;
  }
  while (nread > 0);
  carmen_fseek(log_fp, 0L, SEEK_SET);

  /* read the logfile */
  buffer_pos = 0;
  buffer_length = carmen_fread(buffer, 1, 10000, log_fp);

  while (buffer_length > 0) {
    mark = buffer_pos;
    while ((mark < buffer_length) && (buffer[mark] != '\n'))
      ++mark;

    if (mark == buffer_length) {
      memmove(buffer, buffer+buffer_pos, buffer_length-buffer_pos);
      buffer_length -= buffer_pos;
      offset += buffer_pos;
      buffer_pos = 0;
      n = carmen_fread(buffer+buffer_length, 1, 10000-buffer_length-1, log_fp);
      buffer_length += n;
    }
    else {
      ++linecount;
      if (linecount % 100 == 0)
        fprintf(stderr, "\rReading log file %s... (%.0f%%)  ", filename,
        (offset+buffer_pos)/(float)log_bytes*100.0);
      buffer[mark] = '\0';

      if (!strncmp(buffer+buffer_pos, "NSICKLASERPOS", 13)) {
        if (logdata->num_pos == logdata->max_pos) {
          logdata->max_pos += 1000;
          logdata->pos = (laser_pos_p)realloc(logdata->pos,
            logdata->max_pos*sizeof(laser_pos_t));
          carmen_test_alloc(logdata->pos);
        }

        current_pos = buffer+buffer_pos;
        current_pos = carmen_next_word(current_pos);
        logdata->pos[logdata->num_pos].laser_num = atoi(current_pos);
        current_pos = carmen_next_word(current_pos);
        logdata->pos[logdata->num_pos].x = atof(current_pos);
        current_pos = carmen_next_word(current_pos);
        logdata->pos[logdata->num_pos].y = atof(current_pos);
        current_pos = carmen_next_word(current_pos);
        logdata->pos[logdata->num_pos].z = atof(current_pos);
        current_pos = carmen_next_word(current_pos);
        logdata->pos[logdata->num_pos].yaw = atof(current_pos);
        current_pos = carmen_next_word(current_pos);
        logdata->pos[logdata->num_pos].pitch = atof(current_pos);
        current_pos = carmen_next_word(current_pos);
        logdata->pos[logdata->num_pos].roll = atof(current_pos);
        current_pos = carmen_next_word(current_pos);
        logdata->pos[logdata->num_pos].timestamp = atof(current_pos);

        ++logdata->num_pos;
      }
      else if (logdata->num_pos &&
        !strncmp(buffer+buffer_pos, "NSICKLASER", 10) &&
        buffer[buffer_pos+10] ==
          '0'+logdata->pos[logdata->num_pos-1].laser_num) {
        if (logdata->num_laser == logdata->max_laser) {
          logdata->max_laser += 1000;
          logdata->laser = (laser_scan_p)realloc(logdata->laser,
            logdata->max_laser*sizeof(laser_scan_t));
          carmen_test_alloc(logdata->laser);
        }

        current_pos = buffer+buffer_pos;
        logdata->laser[logdata->num_laser].laser_num =
          logdata->pos[logdata->num_pos].laser_num;

        current_pos = carmen_next_n_words(current_pos, 2);
        laser_start_angle = atof(current_pos);
        current_pos = carmen_next_word(current_pos);
        laser_fov = atof(current_pos);
        current_pos = carmen_next_n_words(current_pos, 5);
        
        laser_num_readings = atoi(current_pos);
        logdata->laser[logdata->num_laser].num_readings = laser_num_readings;
        logdata->laser[logdata->num_laser].start_angle = laser_start_angle;
        logdata->laser[logdata->num_laser].fov = laser_fov;
        logdata->laser[logdata->num_laser].range =
          (float*)calloc(laser_num_readings, sizeof(float));
        carmen_test_alloc(logdata->laser[logdata->num_laser].range);
        logdata->laser[logdata->num_laser].endpoint_x =
          (float*)calloc(laser_num_readings, sizeof(float));
        carmen_test_alloc(logdata->laser[logdata->num_laser].endpoint_x);
        logdata->laser[logdata->num_laser].endpoint_y =
          (float*)calloc(laser_num_readings, sizeof(float));
        carmen_test_alloc(logdata->laser[logdata->num_laser].endpoint_y);
        logdata->laser[logdata->num_laser].endpoint_z =
          (float*)calloc(laser_num_readings, sizeof(float));
        carmen_test_alloc(logdata->laser[logdata->num_laser].endpoint_z);
        current_pos = carmen_next_word(current_pos);
        for (i = 0; i < laser_num_readings; i++) {
          logdata->laser[logdata->num_laser].range[i] = atof(current_pos);
          current_pos = carmen_next_word(current_pos);
        }

        current_pos = carmen_next_word(current_pos);
        laser_num_readings = atoi(current_pos);
        logdata->laser[logdata->num_laser].timestamp = atof(current_pos);

        logdata->num_laser++;
      }

      buffer_pos = mark+1;
    }
  }

  fprintf(stderr, "\nRead %d LASER - %d POS\n",
	  logdata->num_laser, logdata->num_pos);
}
Esempio n. 16
0
int main(int argc, char **argv)
{
  int i, j, found, vrml_obj;
  char filename[200], vrml_filename[200];
  vrml_file_t vrml_file;

  if(argc < 2)
    carmen_die("Error: missing arguments\n"
	    "Usage: %s filename\n", argv[0]);
  strcpy(filename, argv[1]);
  strcpy(vrml_filename, filename);
  if(strcmp(filename + strlen(filename) - 7, ".glv.gz") == 0)
    strcpy(vrml_filename + strlen(vrml_filename) - 6, "vrml.gz");
  else if(strcmp(filename + strlen(filename) - 4, ".glv") == 0)
    strcpy(vrml_filename + strlen(vrml_filename) - 3, "vrml.gz");
  else
    carmen_die("Error: file must end in .glv or .glv.gz\n");

  /* open the output file */
  vrml_file_open(&vrml_file, vrml_filename);

  /* read the glv model */
  obj = glv_object_read(argv[1]);

  /* allocate the color list */
  color_list = (glv_color_p)calloc(max_colors, sizeof(glv_color_t));
  carmen_test_alloc(color_list);

  /* make a list of the point colors */
  for(i = 0; i < obj->num_points; i++) {
    found = 0;
    for(j = 0; j < num_colors; j++)
      if(same_color(obj->point[i].c, color_list[j]))
	found = 1;
    if(!found) {
      if(num_colors == max_colors) {
	max_colors += 10;
	color_list = (glv_color_p)realloc(color_list,
					  max_colors * sizeof(glv_color_t));
      }
      color_list[num_colors] = obj->point[i].c;
      num_colors++;
    }
  }

  /* write the point list objects to the vrml file */
  fprintf(stderr, "Converting points (%d colors) : ", num_colors);
  for(i = 0; i < num_colors; i++) {
    vrml_obj = vrml_file_new_object(&vrml_file, VRML_POINTSET,
				    color_list[i].r / 255.0,
				    color_list[i].g / 255.0,
				    color_list[i].b / 255.0);
    for(j = 0; j < obj->num_points; j++)
      if(obj->point[j].c.r == color_list[i].r &&
	 obj->point[j].c.g == color_list[i].g &&
	 obj->point[j].c.b == color_list[i].b)
	vrml_add_point(&vrml_file, vrml_obj, obj->point[j].x,
		       obj->point[j].y, obj->point[j].z);
    vrml_file_close_object(&vrml_file, vrml_obj);
    fprintf(stderr, "%d ", i + 1);
  }
  fprintf(stderr, "\n");

  /* start over with the colors */
  num_colors = 0;

  /* make a list of the line colors */
  for(i = 0; i < obj->num_lines; i++) {
    found = 0;
    for(j = 0; j < num_colors; j++)
      if(same_color(obj->line[i].c, color_list[j]))
	found = 1;
    if(!found) {
      if(num_colors == max_colors) {
	max_colors += 10;
	color_list = (glv_color_p)realloc(color_list,
					  max_colors * sizeof(glv_color_t));
      }
      color_list[num_colors] = obj->line[i].c;
      num_colors++;
    }
  }

  /* write the line list objects to the vrml file */
  fprintf(stderr, "Converting lines (%d colors) : ", num_colors);
  for(i = 0; i < num_colors; i++) {
    vrml_obj = vrml_file_new_object(&vrml_file, VRML_LINESET,
				    color_list[i].r / 255.0,
				    color_list[i].g / 255.0,
				    color_list[i].b / 255.0);
    for(j = 0; j < obj->num_lines; j++)
      if(obj->line[j].c.r == color_list[i].r &&
	 obj->line[j].c.g == color_list[i].g &&
	 obj->line[j].c.b == color_list[i].b)
	vrml_add_line(&vrml_file, vrml_obj,
		      obj->line[j].p1.x,
		      obj->line[j].p1.y,
		      obj->line[j].p1.z,
		      obj->line[j].p2.x,
		      obj->line[j].p2.y,
		      obj->line[j].p2.z);
    vrml_file_close_object(&vrml_file, vrml_obj);
    fprintf(stderr, "%d ", i + 1);
  }
  fprintf(stderr, "\n");

  /* start over with the colors */
  num_colors = 0;

  /* make a list of the line colors */
  for(i = 0; i < obj->num_faces; i++) {
    found = 0;
    for(j = 0; j < num_colors; j++)
      if(same_color(obj->face[i].c, color_list[j]))
	found = 1;
    if(!found) {
      if(num_colors == max_colors) {
	max_colors += 10;
	color_list = (glv_color_p)realloc(color_list,
					  max_colors * sizeof(glv_color_t));
      }
      color_list[num_colors] = obj->face[i].c;
      num_colors++;
    }
  }

  /* write the line list objects to the vrml file */
  fprintf(stderr, "Converting faces (%d colors) : ", num_colors);
  for(i = 0; i < num_colors; i++) {
    if(color_list[i].r == 255 && color_list[i].g == 255 &&
       color_list[i].b == 255)
      vrml_obj = vrml_file_new_object(&vrml_file, VRML_FACESET,
				      -1, -1, -1);
    else
      vrml_obj = vrml_file_new_object(&vrml_file, VRML_FACESET,
				      color_list[i].r / 255.0,
				      color_list[i].g / 255.0,
				      color_list[i].b / 255.0);
    for(j = 0; j < obj->num_faces; j++)
      if(obj->face[j].c.r == color_list[i].r &&
	 obj->face[j].c.g == color_list[i].g &&
	 obj->face[j].c.b == color_list[i].b) {
	vrml_add_face(&vrml_file, vrml_obj,
		      obj->face[j].p1.x,
		      obj->face[j].p1.y,
		      obj->face[j].p1.z,
		      obj->face[j].p2.x,
		      obj->face[j].p2.y,
		      obj->face[j].p2.z,
		      obj->face[j].p3.x,
		      obj->face[j].p3.y,
		      obj->face[j].p3.z);
      }
    vrml_file_close_object(&vrml_file, vrml_obj);
    fprintf(stderr, "%d ", i + 1);
  }
  fprintf(stderr, "\n");

  vrml_file_close(&vrml_file);
  return 0;
}
Esempio n. 17
0
static void add_offset(int argc, char *argv[])
{
  char *input_filename;
  int next_arg;
  int force;
  char cmd[1024];
  char tmp_filename[1024];
  carmen_FILE *fp_in, *fp_out;
  carmen_global_offset_t offset;
  int system_err;
  int num_args;
  int response;

  next_arg = handle_options(argc, argv, &force);
  next_arg++;

  num_args = argc - next_arg;

  if(num_args != 4) {
    carmen_warn("\nError: wrong number of parameters.\n");    
    carmen_warn("\nUsage: %s <mapfilename> <x> <y> <theta>\n",
		argv[0]);
    carmen_warn("       <theta> should be given in degrees.\n");
  }
     
  input_filename = check_mapfile(argv[next_arg]);
  next_arg++;

  if(!carmen_map_file(input_filename))
    carmen_die("Error: %s does not appear to be a valid carmen map file;\n" 
	       "if it is gzipped, make sure it has a \".gz\" extension.\n",
	       input_filename);

  if(carmen_map_chunk_exists(input_filename, CARMEN_MAP_GLOBAL_OFFSET_CHUNK)) {
    carmen_warn("Offset chunk exists already. Replace? [y/n] ");
    response = getchar();
    if (tolower(response) != 'y')
      exit(0);
    carmen_warn("Replacing...\n");
  }

  offset.x = atof(argv[next_arg]);
  offset.y = atof(argv[next_arg+1]);
  offset.theta = carmen_degrees_to_radians(atof(argv[next_arg+2]));

  fprintf(stderr, "Set (%s %s %s) to (%.2f m, %.2f m, %.2f rad)\n", 
	  argv[next_arg], argv[next_arg+1], argv[next_arg+2], 
	  offset.x, offset.y, offset.theta);
  
  fp_in = carmen_fopen(input_filename, "r");
  if(fp_in == NULL)
    carmen_die_syserror("Error: file %s could not be opened for reading", 
			input_filename);
  
  strcpy(tmp_filename, "/tmp/newmapXXXXXX");
  system_err = mkstemp(tmp_filename);
  if (system_err == -1) 
    carmen_die_syserror("I need to create a temporary file in /tmp, but I "
			"can't for the\n following reason\n");
  
  fp_out = carmen_fopen(tmp_filename, "w");
  if(fp_out == NULL)
    carmen_die_syserror("Error: file could not be opened for writing");

  if(carmen_map_strip(fp_in, fp_out, CARMEN_MAP_GLOBAL_OFFSET_CHUNK) < 0)
     carmen_die("Error: could not strip global offset from map file.\n");
  if(carmen_map_write_global_offset_chunk(fp_out, &offset) < 0)
    carmen_die("Error: could not write offset chunk.\n");

  carmen_fclose(fp_in);
  carmen_fclose(fp_out);

  sprintf(cmd, "mv -f %s %s", tmp_filename, input_filename);
  system_err = system(cmd);
  if (system_err != 0) 
    carmen_die("I created a temporary file contained the map with the new "
	       "place name\nat %s. I tried to copy the new file onto your "
	       "old file, but the copy\nfailed for the following reason: %s\n"
	       "\n"
	       "You will have to copy the new file over yourself.\n", 
	       tmp_filename, strerror(errno));
}
Esempio n. 18
0
int main(int argc, char *argv[]) {
  UDPConnectionServer connection(2368);
  AcquisitionThread<DataPacket> thread(connection);
  Calibration calib;
  std::shared_ptr<DataPacket> packet;
  IPC_RETURN_TYPE err;
  char dump_filename[4096];

  carmen_velodyne_ipc_initialize(argc, argv);

  carmen_velodyne_read_parameters(argc, argv);

  carmen_velodyne_set_spin_rate(spin_rate);
  
  calib_file.open(calib_path);
  if (!calib_file.is_open())
    carmen_die("\nError: Could not open %s for reading\n", calib_filename);
  calib_file >> calib;
  calib_file.close();
  
  signal(SIGINT, carmen_velodyne_sigint_handler);
  thread.start();

  double time;
  double start_time = carmen_get_time();
  int num_packets = 0;
  int start_num_packets = 0;
  int num_lost_packets = 0;
  int start_num_lost_packets = 0;
  
  while (!quit) {
    try {
      while (dump_enabled || points_publish) {
        packet = thread.getBuffer().dequeue();
        ++num_packets;

        if (dump_enabled) {
          if (!dump_file.is_open()) {
            char dump_time[1024];
            time_t local = packet->getTimestamp();
            struct tm* time = localtime(&local);

            strftime(dump_time, sizeof(dump_time), "%Y-%m-%d-%H%M%S", time);
            sprintf(dump_filename, "%s/%s.bin", dump_path, dump_time);
            dump_file.open(dump_filename, std::ios::out | std::ios::binary);
          }

          if (dump_file.is_open()) {
            long dump_filepos = dump_file.tellp();
            dump_file << *packet;
            carmen_velodyne_publish_packet(id, dump_filename,
              dump_filepos, packet->getTimestamp());
          }
          else {
            carmen_warn("\nWarning: Could not open %s for writing\n",
              dump_filename);
          }
        }

        if (points_publish) {
          VdynePointCloud pointCloud;
          Converter::toPointCloud(*packet, calib, pointCloud);
          int num_points = pointCloud.getSize();
          float x[num_points], y[num_points], z[num_points];
          std::vector<VdynePointCloud::Point3D>::const_iterator it;
          int i = 0;

          for (it = pointCloud.getPointBegin();
              it != pointCloud.getPointEnd(); ++it, ++i) {
            x[i] = it->mX;
            y[i] = it->mY;
            z[i] = it->mZ;
          }
          carmen_velodyne_publish_pointcloud(id, num_points, x, y, z,
            packet->getTimestamp());
        }

        double time = carmen_get_time();
        if (time-start_time >= 1.0) {
          num_lost_packets = thread.getBuffer().getNumDroppedElements();
          float period_num_packets = num_packets-start_num_packets;
          float period_num_lost_packets = num_lost_packets-
            start_num_lost_packets;
          
          double packet_loss = period_num_lost_packets/
            (period_num_packets+period_num_lost_packets);
          fprintf(stdout, "\rPacket loss: %6.2f%%", packet_loss*100.0);
          fflush(stdout);

          start_time = time;
          start_num_packets = num_packets;
          start_num_lost_packets = num_lost_packets;          
        }
      }
    }
    catch (IOException& exception) {
      // buffer underrun
    }

    carmen_ipc_sleep(0.0);
  }

  if (dump_file.is_open())
    dump_file.close();

  fprintf(stdout, "\n");

  return 0;
}
Esempio n. 19
0
static void info(int argc, char *argv[])
{
  time_t creation_time;
  char *filename;
  char username[100], origin[100], description[100];
  int chunk_size, i;
  carmen_map_config_t config;
  carmen_map_placelist_t place_list;
  carmen_offlimits_t *offlimits_list;
  int list_length;
  carmen_global_offset_t offset;

  /* Check for the appropriate command line argument */
  if(argc != 3) 
    carmen_die("Error in info: wrong number of parameters.\n");

  filename = argv[2];

  /* Make sure the file exists */
  if (!carmen_map_file(filename))
    carmen_die("Error: %s does not appear to be a valid carmen map file;\n"
	       "if it is gzipped, make sure it has a \".gz\" extension.\n" 
	       "Do you have an incompatible file?\n"
	       "Current map version: %s\n", filename, CARMEN_MAP_VERSION);
  
  /* Print the CREATOR information if the chunk exists */
  if(carmen_map_read_creator_chunk(filename, &creation_time,
				 username, origin, description) == 0) {
    printf("\nMap CREATOR information:\n");
    printf("------------------------\n");
    printf("Map author    : %s\n", username);
    printf("Creation date : %s", asctime(localtime(&creation_time)));
    printf("Origin        : %s\n", origin);
    printf("Description   : %s", description);
    printf("\n");
  }

  /* Print the list of chunks in the file */
  printf("Map contains the following CHUNK types:\n");
  printf("---------------------------------------\n");
  chunk_size = carmen_map_chunk_exists(filename, CARMEN_MAP_CREATOR_CHUNK);
  if(chunk_size > 0)
    printf("CREATOR       : yes (%d bytes)\n", chunk_size);
  else
    printf("CREATOR       : no\n");
  chunk_size = carmen_map_chunk_exists(filename, CARMEN_MAP_GRIDMAP_CHUNK);
  if(chunk_size > 0)
    {
      carmen_map_read_gridmap_config(filename, &config);
      printf("GRIDMAP       : yes  size : %4d x %4d, resolution : %.2f m/cell (%d bytes)\n", 
	     config.x_size, config.y_size, config.resolution, chunk_size);
    }
  else
    printf("GRIDMAP       : no\n");
  chunk_size = carmen_map_chunk_exists(filename, CARMEN_MAP_OFFLIMITS_CHUNK);
  if(chunk_size > 0) {
    printf("OFFLIMITS     : yes (%d bytes)\n", chunk_size);
    carmen_map_read_offlimits_chunk(filename, &offlimits_list, &list_length);
    for (i = 0; i < list_length; i++) {
      if (offlimits_list[i].type == CARMEN_OFFLIMITS_POINT_ID)
	carmen_warn("\tOfflimits %d: point: %d %d\n", i, offlimits_list[i].x1,
		    offlimits_list[i].y1);
      else if (offlimits_list[i].type == CARMEN_OFFLIMITS_LINE_ID)
	carmen_warn("\tOfflimits %d: line: %d %d %d %d\n", i, offlimits_list[i].x1,
		    offlimits_list[i].y1, offlimits_list[i].x2, offlimits_list[i].y2);
      else if (offlimits_list[i].type == CARMEN_OFFLIMITS_RECT_ID)
	carmen_warn("\tOfflimits %d: rect: %d %d %d %d\n", i, offlimits_list[i].x1,
		    offlimits_list[i].y1, offlimits_list[i].x2, offlimits_list[i].y2);
    }
  }
  else
    printf("OFFLIMITS     : no\n");
  chunk_size = carmen_map_chunk_exists(filename, CARMEN_MAP_PLACES_CHUNK);
  if(chunk_size > 0)
    printf("PLACES        : yes (%d bytes)\n", chunk_size);
  else
    printf("PLACES        : no\n");
  chunk_size = carmen_map_chunk_exists(filename, CARMEN_MAP_EXPECTED_CHUNK);
  if(chunk_size > 0)
    printf("EXPECTED      : yes (%d bytes)\n", chunk_size);
  else
    printf("EXPECTED      : no\n");
  chunk_size = carmen_map_chunk_exists(filename, CARMEN_MAP_LASERSCANS_CHUNK);
  if(chunk_size > 0)
    printf("LASERSCANS    : yes (%d bytes)\n", chunk_size);
  else
    printf("LASERSCANS    : no\n");

  if(carmen_map_chunk_exists(filename, CARMEN_MAP_PLACES_CHUNK)) {
    printf("\nMap contains the following places:\n");
    printf("----------------------------------\n");
    carmen_map_read_places_chunk(filename, &place_list);
    for(i = 0; i < place_list.num_places; i++)
      if(place_list.places[i].type == CARMEN_NAMED_POSITION_TYPE)
	printf("%-20s (%.1f m, %.1f m)\n", place_list.places[i].name, 
	       place_list.places[i].x, place_list.places[i].y);
      else if(place_list.places[i].type == CARMEN_NAMED_POSE_TYPE)
	printf("%-20s (%.1f m, %.1f m, %.1f deg)\n", 
	       place_list.places[i].name, place_list.places[i].x, 
	       place_list.places[i].y, 
	       carmen_radians_to_degrees(place_list.places[i].theta));
      else if(place_list.places[i].type == CARMEN_LOCALIZATION_INIT_TYPE)
	printf("%-20s (%.1f m, %.1f m, %.1f deg) std = (%.2f m, %.2f m, "
	       "%.2f deg)\n", place_list.places[i].name, 
	       place_list.places[i].x, place_list.places[i].y, 
	       carmen_radians_to_degrees(place_list.places[i].theta), 
	       place_list.places[i].x_std, place_list.places[i].y_std,
	       carmen_radians_to_degrees(place_list.places[i].theta_std));
  }

  chunk_size = carmen_map_chunk_exists(filename, 
				       CARMEN_MAP_GLOBAL_OFFSET_CHUNK);
  if (chunk_size > 0) {
    carmen_map_read_global_offset_chunk(filename, &offset);
    printf("OFFSET        : %10.3f %10.3f %10.3f rads\n", offset.x, 
	   offset.y, offset.theta);
  } else
    printf("OFFSET        : no\n");
}
Esempio n. 20
0
void read_firecam_logfile(char *filename, logdata_p logdata) {
  int buffer_pos, buffer_length, offset = 0;
  int linecount = 0, mark, n;
  long int nread, log_bytes = 0;
  carmen_FILE *log_fp = NULL;
  char *current_pos;
  char buffer[10000];

  /* initialize logdata structure */
  logdata->num_frame = 0;
  logdata->max_frame = 1000;
  logdata->frame = (firecam_frame_p)calloc(logdata->max_frame,
    sizeof(firecam_frame_t));
  carmen_test_alloc(logdata->frame);

  /* compute total number of bytes in logfile */
  log_fp = carmen_fopen(filename, "r");
  if (log_fp == NULL)
    carmen_die("Error: could not open file %s for reading.\n", filename);

  do {
    nread = carmen_fread(buffer, 1, 10000, log_fp);
    log_bytes += nread;
  }
  while (nread > 0);
  carmen_fseek(log_fp, 0L, SEEK_SET);

  /* read the logfile */
  buffer_pos = 0;
  buffer_length = carmen_fread(buffer, 1, 10000, log_fp);

  while (buffer_length > 0) {
    mark = buffer_pos;
    while ((mark < buffer_length) && (buffer[mark] != '\n'))
      ++mark;

    if (mark == buffer_length) {
      memmove(buffer, buffer+buffer_pos, buffer_length-buffer_pos);
      buffer_length -= buffer_pos;
      offset += buffer_pos;
      buffer_pos = 0;
      n = carmen_fread(buffer+buffer_length, 1, 10000-buffer_length-1, log_fp);
      buffer_length += n;
    }
    else {
      ++linecount;
      if (linecount % 100 == 0)
        fprintf(stderr, "\rReading log file %s... (%.0f%%)  ", filename,
        (offset+buffer_pos)/(float)log_bytes*100.0);
      buffer[mark] = '\0';

      if (!strncmp(buffer+buffer_pos, "FIRECAMFRAME", 12)) {
        if (logdata->num_frame == logdata->max_frame) {
          logdata->max_frame += 1000;
          logdata->frame = (firecam_frame_p)realloc(logdata->frame,
            logdata->max_frame*sizeof(firecam_frame_t));
          carmen_test_alloc(logdata->frame);
        }

        current_pos = buffer+buffer_pos;
        current_pos = carmen_next_word(current_pos);
        logdata->frame[logdata->num_frame].cam_id = atoi(current_pos);
        copy_filename_string(&logdata->frame[logdata->num_frame].filename,
          &current_pos);
        current_pos = carmen_next_word(current_pos);
        logdata->frame[logdata->num_frame].timestamp = atof(current_pos);

        ++logdata->num_frame;
      }

      buffer_pos = mark+1;
    }
  }

  fprintf(stderr, "\nRead %d FRAME\n", logdata->num_frame);
}
Esempio n. 21
0
glv_object_p glv_object_read(char *filename) {
  carmen_FILE *fp;
  glv_color_t current_color;
  char buffer[10000];
  long int nread, log_bytes = 0;
  int buffer_pos, buffer_length, offset = 0, n;
  glv_object_p obj;
  float *fmessage;
  int done_reading = 0;
  int i, line_count = 0;
  float min_x, max_x, min_y, max_y, min_z, max_z;

  if(strncmp(filename + strlen(filename) - 4, ".glv", 4) &&
    strncmp(filename + strlen(filename) - 7, ".glv.gz", 7) &&
    strncmp(filename + strlen(filename) - 5, ".pmap", 5) &&
    strncmp(filename + strlen(filename) - 8, ".pmap.gz", 8))
    carmen_die("Error: file name must end in .glv, .glv.gz, .pmap, or .pmap.gz\n");
  fp = carmen_fopen(filename, "r");

  /* compute total number of bytes in logfile */
  do {
    nread = carmen_fread(buffer, 1, 10000, fp);
    log_bytes += nread;
  } while(nread > 0);
  carmen_fseek(fp, 0L, SEEK_SET);

  current_color.r = 255;
  current_color.g = 255;
  current_color.b = 255;

  obj = glv_object_init();

  buffer_pos = 0;
  buffer_length = carmen_fread(buffer, 1, 10000, fp);

  while(!done_reading || buffer_length > buffer_pos) {
    line_count++;
    if(line_count % 100000 == 0)
      fprintf(stderr, "\rReading glv file... (%.0f%%)  ",
        (offset + buffer_pos) / (float)log_bytes * 100.0);

    if(buffer_length - buffer_pos < 50 && !done_reading) {
      memmove(buffer, buffer + buffer_pos, buffer_length - buffer_pos);
      buffer_length -= buffer_pos;
      offset += buffer_pos;
      buffer_pos = 0;
      n = carmen_fread(buffer + buffer_length,
                  1, 10000 - buffer_length - 1, fp);
      if(n == 0)
        done_reading = 1;
      else
        buffer_length += n;
    }
    else {
      if(buffer[buffer_pos] == MESSAGE_ID_COLOR) {
        current_color.r = (unsigned char)buffer[buffer_pos + 1];
        current_color.g = (unsigned char)buffer[buffer_pos + 2];
        current_color.b = (unsigned char)buffer[buffer_pos + 3];
        buffer_pos += 4;
      }
      else if(buffer[buffer_pos] == MESSAGE_ID_POINT) {
        if(obj->num_points == obj->max_points) {
          obj->max_points += 100000;
          obj->point = (glv_point_p)realloc(obj->point, obj->max_points *
                      sizeof(glv_point_t));
          carmen_test_alloc(obj->point);
        }
        fmessage = (float *)(buffer + buffer_pos + 1);
        obj->point[obj->num_points].x = fmessage[0];
        obj->point[obj->num_points].y = fmessage[1];
        obj->point[obj->num_points].z = fmessage[2];
        obj->point[obj->num_points].c = current_color;
        obj->num_points++;
        buffer_pos += 13;
      }
      else if(buffer[buffer_pos] == MESSAGE_ID_LINE) {
        if(obj->num_lines == obj->max_lines) {
          obj->max_lines += 100000;
          obj->line = (glv_line_p)realloc(obj->line, obj->max_lines *
                    sizeof(glv_line_t));
          carmen_test_alloc(obj->line);
        }
        fmessage = (float *)(buffer + buffer_pos + 1);
        obj->line[obj->num_lines].p1.x = fmessage[0];
        obj->line[obj->num_lines].p1.y = fmessage[1];
        obj->line[obj->num_lines].p1.z = fmessage[2];
        obj->line[obj->num_lines].p2.x = fmessage[3];
        obj->line[obj->num_lines].p2.y = fmessage[4];
        obj->line[obj->num_lines].p2.z = fmessage[5];
        obj->line[obj->num_lines].c = current_color;
        obj->num_lines++;
        buffer_pos += 25;
      }
      else if(buffer[buffer_pos] == MESSAGE_ID_FACE) {
        if(obj->num_faces == obj->max_faces) {
          obj->max_faces += 100000;
          obj->face = (glv_face_p)realloc(obj->face, obj->max_faces *
                    sizeof(glv_face_t));
          carmen_test_alloc(obj->face);
        }
        fmessage = (float *)(buffer + buffer_pos + 1);
        obj->face[obj->num_faces].p1.x = fmessage[0];
        obj->face[obj->num_faces].p1.y = fmessage[1];
        obj->face[obj->num_faces].p1.z = fmessage[2];
        obj->face[obj->num_faces].p2.x = fmessage[3];
        obj->face[obj->num_faces].p2.y = fmessage[4];
        obj->face[obj->num_faces].p2.z = fmessage[5];
        obj->face[obj->num_faces].p3.x = fmessage[6];
        obj->face[obj->num_faces].p3.y = fmessage[7];
        obj->face[obj->num_faces].p3.z = fmessage[8];
        obj->face[obj->num_faces].c = current_color;
        compute_normal(&obj->face[obj->num_faces]);
        obj->num_faces++;
        buffer_pos += 37;
      }
    }
  }

  min_x = 1e10;
  max_x = -1e10;
  min_y = 1e10;
  max_y = -1e10;
  min_z = 1e10;
  max_z = -1e10;
  for(i = 0; i < obj->num_points; i++)
    adjust_extrema(obj->point[i], &min_x, &max_x, &min_y, &max_y,
      &min_z, &max_z);
  for(i = 0; i < obj->num_lines; i++) {
    adjust_extrema(obj->line[i].p1, &min_x, &max_x, &min_y, &max_y,
      &min_z, &max_z);
    adjust_extrema(obj->line[i].p2, &min_x, &max_x, &min_y, &max_y,
      &min_z, &max_z);
  }
  for(i = 0; i < obj->num_faces; i++) {
    adjust_extrema(obj->face[i].p1, &min_x, &max_x, &min_y, &max_y,
      &min_z, &max_z);
    adjust_extrema(obj->face[i].p2, &min_x, &max_x, &min_y, &max_y,
      &min_z, &max_z);
    adjust_extrema(obj->face[i].p3, &min_x, &max_x, &min_y, &max_y,
      &min_z, &max_z);
  }
  obj->centroid.x = (min_x + max_x) / 2;
  obj->centroid.y = (min_y + max_y) / 2;
  obj->centroid.z = (min_z + max_z) / 2;
  obj->min.x = min_x;
  obj->min.y = min_y;
  obj->min.z = min_z;
  obj->max.x = max_x;
  obj->max.y = max_y;
  obj->max.z = max_z;

  carmen_fclose(fp);
  fprintf(stderr, "\rReading glv file... (100%%)   \n");
  fprintf(stderr, "%d POINTS - %d LINES - %d FACES\n", obj->num_points,
    obj->num_lines, obj->num_faces);
  return obj;
}
Esempio n. 22
0
int main(int argc, char **argv)
{
	FILE *index_file;
	char index_file_name[2000];

	memset(&odometry_ackerman, 0, sizeof(odometry_ackerman));
	memset(&velocity_ackerman, 0, sizeof(velocity_ackerman));
	
	memset(&visual_odometry, 0, sizeof(visual_odometry));
	memset(&imu, 0, sizeof(imu));
	memset(&truepos_ackerman, 0, sizeof(truepos_ackerman));
	memset(&laser_ackerman1, 0, sizeof(laser_ackerman1));
	memset(&laser_ackerman2, 0, sizeof(laser_ackerman2));
	memset(&laser_ackerman3, 0, sizeof(laser_ackerman3));
	memset(&laser_ackerman4, 0, sizeof(laser_ackerman4));
	memset(&laser_ackerman5, 0, sizeof(laser_ackerman5));
	memset(&laser_ldmrs, 0, sizeof(laser_ldmrs));
	memset(&laser_ldmrs_objects, 0, sizeof(laser_ldmrs_objects));
	memset(&laser_ldmrs_objects_data, 0, sizeof(laser_ldmrs_objects_data));
	memset(&rawlaser1, 0, sizeof(rawlaser1));
	memset(&rawlaser2, 0, sizeof(rawlaser2));
	memset(&rawlaser3, 0, sizeof(rawlaser3));
	memset(&rawlaser4, 0, sizeof(rawlaser4));
	memset(&rawlaser5, 0, sizeof(rawlaser5));
	memset(&gpsgga, 0, sizeof(gpsgga));
	memset(&gpshdt, 0, sizeof(gpshdt));
	memset(&gpsrmc, 0, sizeof(gpsrmc));
	memset(&raw_depth_kinect_0, 0, sizeof(raw_depth_kinect_0));
	memset(&raw_depth_kinect_1, 0, sizeof(raw_depth_kinect_1));
	memset(&raw_video_kinect_0, 0, sizeof(raw_video_kinect_0));
	memset(&raw_video_kinect_1, 0, sizeof(raw_video_kinect_1));
	memset(&velodyne_partial_scan, 0, sizeof(velodyne_partial_scan));
	memset(&velodyne_variable_scan, 0, sizeof(velodyne_variable_scan));
	memset(&velodyne_gps, 0, sizeof(velodyne_gps));
	memset(&xsens_euler, 0, sizeof(xsens_euler));
	memset(&xsens_quat, 0, sizeof(xsens_quat));
	memset(&xsens_matrix, 0, sizeof(xsens_matrix));
	memset(&xsens_mtig, 0, sizeof(xsens_mtig));
	memset(&bumblebee_basic_stereoimage1, 0, sizeof(bumblebee_basic_stereoimage1));
	memset(&bumblebee_basic_stereoimage2, 0, sizeof(bumblebee_basic_stereoimage2));
	memset(&bumblebee_basic_stereoimage3, 0, sizeof(bumblebee_basic_stereoimage3));
	memset(&bumblebee_basic_stereoimage4, 0, sizeof(bumblebee_basic_stereoimage4));
	memset(&bumblebee_basic_stereoimage5, 0, sizeof(bumblebee_basic_stereoimage5));
	memset(&bumblebee_basic_stereoimage6, 0, sizeof(bumblebee_basic_stereoimage6));
	memset(&bumblebee_basic_stereoimage7, 0, sizeof(bumblebee_basic_stereoimage7));
	memset(&bumblebee_basic_stereoimage8, 0, sizeof(bumblebee_basic_stereoimage8));
	memset(&bumblebee_basic_stereoimage9, 0, sizeof(bumblebee_basic_stereoimage9));
	memset(&web_cam_message, 0, sizeof(web_cam_message));
	memset(&ackerman_motion_message, 0, sizeof(ackerman_motion_message));
	memset(&ultrasonic_message, 0, sizeof(ultrasonic_message));

	carmen_ipc_initialize(argc, argv);
	carmen_param_check_version(argv[0]);

	register_ipc_messages ();
	read_parameters (argc, argv);
	carmen_playback_define_messages ();
	signal(SIGINT, shutdown_playback_module);

	logfile = carmen_fopen(argv[1], "r");
	if (logfile == NULL)
		carmen_die("Error: could not open file %s for reading.\n", argv[1]);

	int fadvise_error = posix_fadvise(fileno(logfile->fp), 0, 0, POSIX_FADV_SEQUENTIAL);
	if (fadvise_error)
	{
		printf("Could not advise POSIX_FADV_SEQUENTIAL on playback\n");
		exit(1);
	}

	strcpy(index_file_name, argv[1]);
	strcat(index_file_name, ".index");
	index_file = fopen(index_file_name, "r");
	if (index_file == NULL)
	{
		logfile_index = carmen_logfile_index_messages(logfile);
		save_logindex_file(logfile_index, index_file_name);
	}
	else if (index_file_older_than_log_file(index_file, logfile))
	{
		fclose(index_file);
		logfile_index = carmen_logfile_index_messages(logfile);
		save_logindex_file(logfile_index, index_file_name);
	}
	else
	{
		logfile_index = load_logindex_file(index_file_name);
	}

	main_playback_loop();
	return 0;
}
Esempio n. 23
0
static int
read_parameters_from_file(void)
{
    FILE *fp = NULL;
    char *line;
    char *mark, *token;
    int token_num;
    char lvalue[255], rvalue[MAX_VARIABLE_LENGTH];
    int found_matching_robot = 0;
    int found_desired_robot = 0;
    int expert = 0;
    int line_length;
    int count;

    fp = fopen(param_filename, "r");
    if(fp == NULL)
        return -1;

    line = (char *)calloc(MAX_VARIABLE_LENGTH, sizeof(char));
    carmen_test_alloc(line);

    count = 0;
    while (!feof(fp)) {
        fgets(line, MAX_VARIABLE_LENGTH-1, fp);
        line[MAX_VARIABLE_LENGTH-1] = '\0';
        if (strlen(line) == MAX_VARIABLE_LENGTH-1)
            carmen_die("Line %d of file %s is too long.\n"
                       "Maximum line length is %d. Please correct this line.\n\n"
                       "It is also possible that this file has become corrupted.\n"
                       "Make sure you have an up-to-date version of carmen, and\n"
                       "consult the param_server documentation to make sure the\n"
                       "file format is valid.\n", count, param_filename,
                       MAX_VARIABLE_LENGTH-1);
        count++;
        if (feof(fp))
            break;
        mark = strchr(line, '#');    /* strip comments and trailing returns */
        if (mark != NULL)
            mark[0] = '\0';
        mark = strchr(line, '\n');
        if (mark != NULL)
            mark[0] = '\0';

        // Trim off trailing white space

        line_length = strlen(line) - 1;
        while (line_length >= 0 &&
                (line[line_length] == ' ' || line[line_length] == '\t' )) {
            line[line_length--] = '\0';
        }
        line_length++;

        if (line_length == 0)
            continue;

        // Skip over initial blank space

        mark = line + strspn(line, " \t");
        if (strlen(mark) == 0)
            carmen_die("You have encountered a bug in carmen. Please report it\n"
                       "to the carmen maintainers. \n"
                       "Line %d, function %s, file %s\n", __LINE__, __FUNCTION__,
                       __FILE__);

        token_num = 0;

        /* tokenize line */
        token = mark;

        // Move mark to the first whitespace character.
        mark = strpbrk(mark, " \t");
        // If we found a whitespace character, then turn it into a NULL
        // and move mark to the next non-whitespace.
        if (mark) {
            mark[0] = '\0';
            mark++;
            mark += strspn(mark, " \t");
        }

        if (strlen(token) > 254) {
            carmen_warn("Bad file format of %s on line %d.\n"
                        "The parameter name %s is too long (%d characters).\n"
                        "A parameter name can be no longer than 254 "
                        "characters.\nSkipping this line.\n", param_filename,
                        count, token, (int) strlen(token));
            continue;
        }

        strcpy(lvalue, token);
        token_num++;

        // If mark points to a non-whitespace character, then we have a
        // two-token line
        if (mark) {
            if (strlen(mark) > MAX_VARIABLE_LENGTH-1) {
                carmen_warn("Bad file format of %s on line %d.\n"
                            "The parameter value %s is too long (%d "
                            "characters).\nA parameter value can be no longer "
                            "than %u characters.\nSkipping this line.\n",
                            param_filename, count, mark, (int) strlen(mark),
                            MAX_VARIABLE_LENGTH-1);
                continue;
            }
            strcpy(rvalue, mark);
            token_num++;
        }

        if (lvalue[0] == '[') {
            if (strcspn(lvalue+1,"]") == 6 && !carmen_strncasecmp(lvalue+1, "expert", 6)) {
                found_matching_robot = 1;
                expert = 1;
            }
            else {
                expert = 0;
                if (lvalue[1] == '*')
                    found_matching_robot = 1;
                else if (selected_robot) {
                    if (strlen(lvalue) < strlen(selected_robot) + 2)
                        found_matching_robot = 0;
                    else if (lvalue[strlen(selected_robot)+1] != ']')
                        found_matching_robot = 0;
                    else if (carmen_strncasecmp
                             (lvalue+1, selected_robot, strlen(selected_robot)) == 0) {
                        found_matching_robot = 1;
                        found_desired_robot = 1;
                    } else
                        found_matching_robot = 0;
                }
            }
        }
        else if(token_num == 2 && found_matching_robot == 1)
            set_param(lvalue, rvalue, expert);
    } /* End of while (!feof(fp)) */

    fclose(fp);

    if (selected_robot && !found_desired_robot) {
        carmen_die("Did not find a match for robot %s. Do you have the right\n"
                   "init file? (Reading parameters from %s)\n", selected_robot,
                   param_filename);
    }

    return 0;
}
Esempio n. 24
0
//parses a reading response
void hokuyo_parseReading(HokuyoRangeReading* r, char* buffer, carmen_laser_laser_type_t laser_type){
  char* s=buffer;
  int expectedStatus=0;

  if (s[0]=='M')
    expectedStatus=99;
  if (s[0]=='C')
    expectedStatus=00;

  int beamBytes=0;
  if (s[1]=='D')
    beamBytes=3;
  if (s[0]=='C') {
    beamBytes = 3;
    //printf("got C\n");
  }
  if (s[1] == 'S') {
    beamBytes = 2;
   // printf("got C\n");
  }
//  printf("s[0] = %c s[1] = %c\n",s[0],s[1]);

  if (! beamBytes || ! expectedStatus){
    fprintf(stderr, "Invalid return packet, cannot parse reading\n");
    r->status=-1;
    return;
  }
  s+=2; // jump to "Starting Step"
  char v[5];
  v[4]='\0';
  strncpy(v,s,4); r->startStep=atoi(v); s+=4; // grab StartStep and jump to EndStep
  strncpy(v,s,4); r->endStep=atoi(v);   s+=4; // grab EndStep and jump to ClusterCount
  v[2]='\0'; strncpy(v,s,2); r->clusterCount=atoi(v);

  //printf("startStep = %i, endStep = %i\n",r->startStep, r->endStep);

  s=skipLine(s); // skip over rest of line (ScanInterval, NumberOfScans, StringCharacters, and LF
  if (s==0){
    fprintf(stderr, "error, line broken when reading the range parameters\n");
    r->status=-1;
    return;
  }

  // When the status is 99: The second line starts with '99' (status),
  // followed by a 'b', a LF and the Hokuyo TimeStamp
  strncpy(v,s,2); r->status=atoi(v); s+=2;

  if (r->status==expectedStatus){
  } else {
    fprintf(stderr,"Error, Status=%d",r->status);
    return;
  }
  r->timestamp=parseInt(4,&s);
  s=skipLine(s); // skip over the rest of the line (Sum and LF)

  // The remaining lines begin with a 64B data block, followed by a sum and LF
  int i=0;
  int max_beams =0;
  if (laser_type==HOKUYO_URG)
    max_beams=URG_MAX_BEAMS;
  else if (laser_type==HOKUYO_UTM)
    max_beams=UTM_MAX_BEAMS;
  else{
    carmen_die("UNKNOWN hokuyo type!\n");
  }
  while(s!='\0'){
    if ( i>(max_beams)){
      printf("broke because of max_beams!\n"); //shouldn't happen
      break;
    }
    //r->ranges[i++]=parseInt(beamBytes,&s);
    r->ranges[i]=parseInt(beamBytes,&s);
    i++;
  }
  i--; //i is 1 more than the number we've actually read
  r->n_ranges=i;
}
static void
get_sensors_param(int argc, char **argv)
{
	int i, j;
	int flipped;
	int horizontal_resolution;
	char stereo_velodyne_string[256];

	int stereo_velodyne_vertical_roi_ini;
	int stereo_velodyne_vertical_roi_end;

	int stereo_velodyne_horizontal_roi_ini;
	int stereo_velodyne_horizontal_roi_end;

	int roi_ini, roi_end;


	spherical_sensor_params[0].pose = velodyne_pose;
	spherical_sensor_params[0].sensor_robot_reference = carmen_change_sensor_reference(sensor_board_1_pose.position, spherical_sensor_params[0].pose.position, sensor_board_1_to_car_matrix);

	spherical_sensor_params[0].height = spherical_sensor_params[0].sensor_robot_reference.z + robot_wheel_radius;

	if (spherical_sensor_params[0].height > highest_sensor)
		highest_sensor = spherical_sensor_params[0].height;

	if (spherical_sensor_params[0].alive && !strcmp(spherical_sensor_params[0].name,"velodyne"))
	{
		spherical_sensor_params[0].ray_order = carmen_velodyne_get_ray_order();
		spherical_sensor_params[0].vertical_correction = carmen_velodyne_get_vertical_correction();
		spherical_sensor_params[0].delta_difference_mean = carmen_velodyne_get_delta_difference_mean();
		spherical_sensor_params[0].delta_difference_stddev = carmen_velodyne_get_delta_difference_stddev();

		carmen_param_t param_list[] =
		{
				{spherical_sensor_params[0].name, (char*)"vertical_resolution", CARMEN_PARAM_INT, &spherical_sensor_params[0].vertical_resolution, 0, NULL},
				{(char *)"localize_ackerman", (char*)"velodyne_range_max", CARMEN_PARAM_DOUBLE, &spherical_sensor_params[0].range_max, 0, NULL},
				{spherical_sensor_params[0].name, (char*)"time_spent_by_each_scan", CARMEN_PARAM_DOUBLE, &spherical_sensor_params[0].time_spent_by_each_scan, 0, NULL},

		};

		carmen_param_install_params(argc, argv, param_list, sizeof(param_list) / sizeof(param_list[0]));
		init_velodyne_points(&spherical_sensor_data[0].points, &spherical_sensor_data[0].intensity, &spherical_sensor_data[0].robot_pose,
				&spherical_sensor_data[0].robot_velocity, &spherical_sensor_data[0].robot_timestamp, &spherical_sensor_data[0].robot_phi);
		spherical_sensor_params[0].sensor_to_support_matrix = create_rotation_matrix(spherical_sensor_params[0].pose.orientation);
		spherical_sensor_data[0].point_cloud_index = 0;
		carmen_prob_models_alloc_sensor_data(&spherical_sensor_data[0], spherical_sensor_params[0].vertical_resolution, number_of_threads);

		if (max_range < spherical_sensor_params[0].range_max)
		{
			max_range = spherical_sensor_params[0].range_max;
		}
		spherical_sensor_params[0].current_range_max = spherical_sensor_params[0].range_max;
	}

	for (i = 1; i < number_of_sensors; i++)
	{
		if (spherical_sensor_params[i].alive)
		{
			spherical_sensor_params[i].pose = get_stereo_velodyne_pose_3D(argc, argv, i);

			spherical_sensor_params[i].sensor_robot_reference = carmen_change_sensor_reference(sensor_board_1_pose.position, spherical_sensor_params[i].pose.position, sensor_board_1_to_car_matrix);
			spherical_sensor_params[i].height = spherical_sensor_params[i].sensor_robot_reference.z + robot_wheel_radius;

			if (spherical_sensor_params[i].height > highest_sensor)
				highest_sensor = spherical_sensor_params[i].height;

			sprintf(stereo_velodyne_string, "%s%d", "stereo", i);


			carmen_param_t param_list[] =
			{
					{spherical_sensor_params[i].name, (char*) "vertical_resolution", CARMEN_PARAM_INT, &spherical_sensor_params[i].vertical_resolution, 0, NULL},
					{spherical_sensor_params[i].name, (char*) "horizontal_resolution", CARMEN_PARAM_INT, &horizontal_resolution, 0, NULL},
					{spherical_sensor_params[i].name, (char*) "flipped", CARMEN_PARAM_ONOFF, &flipped, 0, NULL},
					{spherical_sensor_params[i].name, (char*) "range_max", CARMEN_PARAM_DOUBLE, &spherical_sensor_params[i].range_max, 0, NULL},
					{spherical_sensor_params[i].name, (char*) "vertical_roi_ini", CARMEN_PARAM_INT, &stereo_velodyne_vertical_roi_ini, 0, NULL },
					{spherical_sensor_params[i].name, (char*) "vertical_roi_end", CARMEN_PARAM_INT, &stereo_velodyne_vertical_roi_end, 0, NULL },
					{spherical_sensor_params[i].name, (char*) "horizontal_roi_ini", CARMEN_PARAM_INT, &stereo_velodyne_horizontal_roi_ini, 0, NULL },
					{spherical_sensor_params[i].name, (char*) "horizontal_roi_end", CARMEN_PARAM_INT, &stereo_velodyne_horizontal_roi_end, 0, NULL }

			};


			carmen_param_install_params(argc, argv, param_list, sizeof(param_list) / sizeof(param_list[0]));

			if (flipped)
			{
				spherical_sensor_params[i].vertical_resolution = horizontal_resolution;
				roi_ini = stereo_velodyne_horizontal_roi_ini;
				roi_end = stereo_velodyne_horizontal_roi_end;
			}
			else
			{
				roi_ini = stereo_velodyne_vertical_roi_ini;
				roi_end = stereo_velodyne_vertical_roi_end;
			}

			if (spherical_sensor_params[i].vertical_resolution > (roi_end - roi_ini))
			{
				carmen_die("The stereo_velodyne_vertical_resolution is bigger than stereo point cloud height");
			}

			if (max_range < spherical_sensor_params[i].range_max)
			{
				max_range = spherical_sensor_params[i].range_max;
			}

			spherical_sensor_params[i].current_range_max = spherical_sensor_params[i].range_max;

			spherical_sensor_params[i].range_max_factor = 1.0;
			spherical_sensor_params[i].ray_order = generates_ray_order(spherical_sensor_params[i].vertical_resolution);

			spherical_sensor_params[i].vertical_correction = get_variable_velodyne_correction();
//			spherical_sensor_params[i].vertical_correction = get_stereo_velodyne_correction(flipped, i, spherical_sensor_params[i].vertical_resolution, roi_ini, roi_end, 0, 0);

			init_velodyne_points(&spherical_sensor_data[i].points, &spherical_sensor_data[i].intensity, &spherical_sensor_data[i].robot_pose,
					&spherical_sensor_data[i].robot_velocity, &spherical_sensor_data[i].robot_timestamp, &spherical_sensor_data[i].robot_phi);
			spherical_sensor_params[i].sensor_to_support_matrix = create_rotation_matrix(spherical_sensor_params[i].pose.orientation);
			spherical_sensor_data[i].point_cloud_index = 0;
			carmen_prob_models_alloc_sensor_data(&spherical_sensor_data[i], spherical_sensor_params[i].vertical_resolution, number_of_threads);

			//TODO : tem que fazer esta medida para as cameras igual foi feito para o velodyne
			if(i == 8) {
				spherical_sensor_params[i].delta_difference_mean = carmen_velodyne_get_delta_difference_mean();
				spherical_sensor_params[i].delta_difference_stddev = carmen_velodyne_get_delta_difference_stddev();

			} else {
				spherical_sensor_params[i].delta_difference_mean = (double *)calloc(50, sizeof(double));
				spherical_sensor_params[i].delta_difference_stddev = (double *)calloc(50, sizeof(double));
				for (j = 0; j < 50; j++)
					spherical_sensor_params[i].delta_difference_stddev[j] = 1.0;
			}

		}
	}
}
Esempio n. 26
0
int
main(int argc, char **argv)
{
  int width = 0, height = 0;
  double resolution = 0.0;
  char *filename = NULL;
  carmen_map_t map;
  int index;
  carmen_FILE *out_file;

  carmen_read_commandline_parameters(argc, argv);

  if (argc > 1)
    {
      if (strcmp(argv[argc-1], "-w") != 0 && 
	  strcmp(argv[argc-1], "-h") != 0 &&
	  strcmp(argv[argc-2], "-w") != 0 && 
	  strcmp(argv[argc-2], "-h") != 0)
	filename = argv[argc-1];	  
    }

  carmen_process_param_int("w", usage, &width);
  carmen_process_param_int("h", usage, &height);

  carmen_process_param_double("r", usage, &resolution);

  if (width <= 0)
    {
      printf("Map width: ");
      scanf("%d", &width);
    }

  if (height <= 0)
    {
      printf("Map height: ");
      scanf("%d", &height);
    }

  if (resolution <= 0)
    {
      printf("Map resolution: ");
      scanf("%lf", &resolution);
    }

  if (filename == NULL)
    {
      printf("Filename: ");
      filename = (char *)calloc(1024, sizeof(char));
      carmen_test_alloc(filename);
      scanf("%s", filename);
    }

  printf("Creating map %d x %d, resolution %.2f, storing in %s\n", 
	 width, height, resolution, filename);

  map.config.x_size = width;
  map.config.y_size = height;
  map.config.resolution = resolution;
  map.config.map_name = filename;

  map.complete_map = (float *)calloc(width*height, sizeof(float));
  carmen_test_alloc(map.complete_map);
  for (index = 0; index < width*height; index++)
    map.complete_map[index] = -1;

  map.map = (float **)calloc(width, sizeof(float *));
  carmen_test_alloc(map.map);

  for (index = 0; index < width; index++)    
    map.map[index] = map.complete_map+index*height;

  out_file = carmen_fopen(filename, "w");
  if (out_file == NULL)
      carmen_die("Couldn't open %s for writing map: %s\n", filename, 
		 strerror(errno));
  carmen_map_write_id(out_file);
  carmen_map_write_creator_chunk(out_file, "generate_blank", "blank map");
  carmen_map_write_gridmap_chunk(out_file, map.map, width, height, resolution);
  carmen_fclose(out_file);
      
  return 0;
}
Esempio n. 27
0
int main(int argc, char **argv)
{
  char filename[1024];
  char key;
  int num_scanned;

  /* initialize connection to IPC network */
  carmen_ipc_initialize(argc, argv);
  carmen_param_check_version(argv[0]);	

  /* open logfile, check if file overwrites something */
  if(argc < 2) 
    carmen_die("usage: %s <logfile>\n", argv[0]);
  sprintf(filename, "%s", argv[1]);

  outfile = carmen_fopen(filename, "r");
  if (outfile != NULL) {
    fprintf(stderr, "Overwrite %s? ", filename);
    num_scanned = scanf("%c", &key);
    if (toupper(key) != 'Y')
      exit(-1);
    carmen_fclose(outfile);
  }
  outfile = carmen_fopen(filename, "w");
  if(outfile == NULL)
    carmen_die("Error: Could not open file %s for writing.\n", filename);
  carmen_logwrite_write_header(outfile);


  get_logger_params(argc, argv);

  if  ( !(log_odometry && log_laser && log_robot_laser ) )
    carmen_warn("\nWARNING: You are neither logging laser nor odometry messages!\n");
  


  if (log_params)
    get_all_params();

  register_ipc_messages();


  if (log_odometry) 
    carmen_base_subscribe_odometry_message(NULL, (carmen_handler_t)
					   base_odometry_handler, 
					   CARMEN_SUBSCRIBE_ALL);

  if (log_sonars) 
    carmen_base_subscribe_sonar_message(NULL, (carmen_handler_t)
					   base_sonar_handler, 
					   CARMEN_SUBSCRIBE_ALL);
  if (log_bumpers) 
    carmen_base_subscribe_bumper_message(NULL, (carmen_handler_t)
					   base_bumper_handler, 
					   CARMEN_SUBSCRIBE_ALL);

  if (log_arm) 
    carmen_arm_subscribe_state_message(NULL, (carmen_handler_t)
				       arm_state_handler, 
				       CARMEN_SUBSCRIBE_ALL);

  if (log_pantilt) {
    carmen_pantilt_subscribe_scanmark_message (NULL, (carmen_handler_t)
					       pantilt_scanmark_handler, 
					       CARMEN_SUBSCRIBE_ALL);
    
    carmen_pantilt_subscribe_laserpos_message (NULL, (carmen_handler_t)
					       pantilt_laserpos_handler, 
					       CARMEN_SUBSCRIBE_ALL);
  }

  if (log_robot_laser) {
    carmen_robot_subscribe_frontlaser_message(NULL, (carmen_handler_t)
					      robot_frontlaser_handler, 
					      CARMEN_SUBSCRIBE_ALL);
    carmen_robot_subscribe_rearlaser_message(NULL, (carmen_handler_t)
					     robot_rearlaser_handler, 
					     CARMEN_SUBSCRIBE_ALL);
  }

  if (log_laser) {
    carmen_laser_subscribe_laser1_message(NULL, (carmen_handler_t)
					  laser_laser1_handler, 
					  CARMEN_SUBSCRIBE_ALL);
    carmen_laser_subscribe_laser2_message(NULL, (carmen_handler_t)
					  laser_laser2_handler, 
					  CARMEN_SUBSCRIBE_ALL);
    carmen_laser_subscribe_laser3_message(NULL, (carmen_handler_t)
					  laser_laser3_handler, 
					  CARMEN_SUBSCRIBE_ALL);
    carmen_laser_subscribe_laser4_message(NULL, (carmen_handler_t)
					  laser_laser4_handler, 
					  CARMEN_SUBSCRIBE_ALL);
    carmen_laser_subscribe_laser5_message(NULL, (carmen_handler_t)
					  laser_laser5_handler, 
					  CARMEN_SUBSCRIBE_ALL);
  }

  if (log_localize) {
    carmen_localize_subscribe_globalpos_message(NULL, (carmen_handler_t)
						localize_handler,
						CARMEN_SUBSCRIBE_ALL);
  }

  if (log_simulator) {

    carmen_simulator_subscribe_truepos_message(NULL, (carmen_handler_t)  
					       carmen_simulator_truepos_handler,
					       CARMEN_SUBSCRIBE_ALL);
  }

  if (log_imu) {

    carmen_imu_subscribe_imu_message(NULL, (carmen_handler_t)  
				     imu_handler,
				     CARMEN_SUBSCRIBE_ALL);
  }
  
  
  if (log_gps) {
    carmen_gps_subscribe_nmea_message( NULL,
				       (carmen_handler_t) ipc_gps_gpgga_handler,
				       CARMEN_SUBSCRIBE_ALL );
    
    carmen_gps_subscribe_nmea_rmc_message( NULL,
					   (carmen_handler_t) ipc_gps_gprmc_handler,
					   CARMEN_SUBSCRIBE_ALL );
  }
  
  if (log_motioncmds) {
  	 carmen_robot_subscribe_vector_move_message( NULL,
  	 					 (carmen_handler_t) robot_vector_move_handler,
  	 					 CARMEN_SUBSCRIBE_ALL );
  	 carmen_robot_subscribe_follow_trajectory_message( NULL,
  	 					 (carmen_handler_t) robot_follow_trajectory_handler,
  	 					 CARMEN_SUBSCRIBE_ALL );
	 carmen_robot_subscribe_velocity_message( NULL,
	 					 (carmen_handler_t) robot_velocity_handler,
	 					 CARMEN_SUBSCRIBE_ALL );		
	 carmen_base_subscribe_velocity_message( NULL,
	 					 (carmen_handler_t) base_velocity_handler,
	 					 CARMEN_SUBSCRIBE_ALL );							 			 
  }

  carmen_logger_subscribe_comment_message( NULL,
  	 					 (carmen_handler_t) logger_comment_handler,
  	 					 CARMEN_SUBSCRIBE_ALL );

  signal(SIGINT, shutdown_module);
  logger_starttime = carmen_get_time();
  carmen_ipc_dispatch();
  return 0;
}
Esempio n. 28
0
void publish_xsens_global(xsens_global data, /*CmtOutputMode& mode,*/ CmtOutputSettings& settings)
{

    IPC_RETURN_TYPE err;

    switch (settings & CMT_OUTPUTSETTINGS_ORIENTMODE_MASK) {

		case CMT_OUTPUTSETTINGS_ORIENTMODE_QUATERNION:

            carmen_xsens_global_quat_message xsens_quat_message;

            //Acceleration
            xsens_quat_message.m_acc.x = data.acc.x;
            xsens_quat_message.m_acc.y = data.acc.y;
            xsens_quat_message.m_acc.z = data.acc.z;

            //Gyro
            xsens_quat_message.m_gyr.x = data.gyr.x;
            xsens_quat_message.m_gyr.y = data.gyr.y;
            xsens_quat_message.m_gyr.z = data.gyr.z;

            //Magnetism
            xsens_quat_message.m_mag.x = data.mag.x;
            xsens_quat_message.m_mag.y = data.mag.y;
            xsens_quat_message.m_mag.z = data.mag.z;

            xsens_quat_message.quat_data.m_data[0] = data.quatData.data[0];
            xsens_quat_message.quat_data.m_data[1] = data.quatData.data[1];
            xsens_quat_message.quat_data.m_data[2] = data.quatData.data[2];
            xsens_quat_message.quat_data.m_data[3] = data.quatData.data[3];

            //Temperature and Message Count
            xsens_quat_message.m_temp = data.temp;
            xsens_quat_message.m_count = data.count;

            //Timestamp
            xsens_quat_message.timestamp = carmen_get_time();

            //Host
            xsens_quat_message.host = carmen_get_host();

            err = IPC_publishData(CARMEN_XSENS_GLOBAL_QUAT_NAME, &xsens_quat_message);
            carmen_test_ipc_exit(err, "Could not publish", CARMEN_XSENS_GLOBAL_QUAT_NAME);

			break;

		case CMT_OUTPUTSETTINGS_ORIENTMODE_EULER:

            carmen_xsens_global_euler_message xsens_euler_message;

            //Acceleration
            xsens_euler_message.m_acc.x = data.acc.x;
            xsens_euler_message.m_acc.y = data.acc.y;
            xsens_euler_message.m_acc.z = data.acc.z;

            //Gyro
            xsens_euler_message.m_gyr.x = data.gyr.x;
            xsens_euler_message.m_gyr.y = data.gyr.y;
            xsens_euler_message.m_gyr.z = data.gyr.z;

            //Magnetism
            xsens_euler_message.m_mag.x = data.mag.x;
            xsens_euler_message.m_mag.y = data.mag.y;
            xsens_euler_message.m_mag.z = data.mag.z;

            xsens_euler_message.euler_data.m_pitch = data.eulerData.pitch;
            xsens_euler_message.euler_data.m_roll = data.eulerData.roll;
            xsens_euler_message.euler_data.m_yaw = data.eulerData.yaw;


            //Temperature and Message Count
            xsens_euler_message.m_temp = data.temp;
            xsens_euler_message.m_count = data.count;

            //Timestamp
            xsens_euler_message.timestamp = carmen_get_time();

            //Host
            xsens_euler_message.host = carmen_get_host();

            err = IPC_publishData(CARMEN_XSENS_GLOBAL_EULER_NAME, &xsens_euler_message);
            carmen_test_ipc_exit(err, "Could not publish", CARMEN_XSENS_GLOBAL_EULER_NAME);

            break;

		case CMT_OUTPUTSETTINGS_ORIENTMODE_MATRIX:

			carmen_xsens_global_matrix_message xsens_matrix_message;

			//Acceleration
            xsens_matrix_message.m_acc.x = data.acc.x;
            xsens_matrix_message.m_acc.y = data.acc.y;
            xsens_matrix_message.m_acc.z = data.acc.z;

            //Gyro
            xsens_matrix_message.m_gyr.x = data.gyr.x;
            xsens_matrix_message.m_gyr.y = data.gyr.y;
            xsens_matrix_message.m_gyr.z = data.gyr.z;

            //Magnetism
            xsens_matrix_message.m_mag.x = data.mag.x;
            xsens_matrix_message.m_mag.y = data.mag.y;
            xsens_matrix_message.m_mag.z = data.mag.z;


            xsens_matrix_message.matrix_data.m_data[0][0] = data.matrixData.data[0][0];
            xsens_matrix_message.matrix_data.m_data[0][1] = data.matrixData.data[0][1];
            xsens_matrix_message.matrix_data.m_data[0][2] = data.matrixData.data[0][2];

            xsens_matrix_message.matrix_data.m_data[1][0] = data.matrixData.data[1][0];
            xsens_matrix_message.matrix_data.m_data[1][1] = data.matrixData.data[1][1];
            xsens_matrix_message.matrix_data.m_data[1][2] = data.matrixData.data[1][2];

            xsens_matrix_message.matrix_data.m_data[2][0] = data.matrixData.data[2][0];
            xsens_matrix_message.matrix_data.m_data[2][1] = data.matrixData.data[2][1];
            xsens_matrix_message.matrix_data.m_data[2][2] = data.matrixData.data[2][2];

            //Temperature and Message Count
            xsens_matrix_message.m_temp = data.temp;
            xsens_matrix_message.m_count = data.count;

            //Timestamp
            xsens_matrix_message.timestamp = carmen_get_time();
	    xsens_matrix_message.timestamp2 = data.timestamp;

            //Host
            xsens_matrix_message.host = carmen_get_host();

            err = IPC_publishData(CARMEN_XSENS_GLOBAL_MATRIX_NAME, &xsens_matrix_message);
            carmen_test_ipc_exit(err, "Could not publish", CARMEN_XSENS_GLOBAL_MATRIX_NAME);

			break;
      
		default:
            carmen_die("Unknown settings in publish_xsens_global()\n");
      break;
	}
}