示例#1
0
int
carmen_parse_arm_joint_types(char *joint_string, carmen_arm_joint_t *joint_types,
			     int num_joints)
{
  char *s;
  int n, i;

  if (!joint_string || !joint_types)
    {
      carmen_warn("Bug in carmen_parse_arm_joint_types: a pointer arg was "
		  "passed as NULL\n");
      return -1;
    }

  s = joint_string;

  for (i = 0; i < num_joints; i++) {
    s += strspn(s, " \t");
    if (strlen(s) == 0) {
      carmen_warn("Too few arguments in joint types string.\n");
      return -1;
    }
    n = strcspn(s, " \t");
    if (!carmen_strncasecmp(s, "motor", n))
      joint_types[i] = CARMEN_MOTOR;
    else if (!carmen_strncasecmp(s, "servo", n))
      joint_types[i] = CARMEN_SERVO;
    else {
      carmen_warn("Bad argument (#%d) in joint types string.\n", i+1);
      return -1;
    }
  }

  return 0;
}
示例#2
0
int 
main(int argc, char** argv)
{
  double length;
  char *dev;
  int num_items;
  char **modules;
  int num_modules;

  carmen_param_t param_list[] = {
    {"robot", "length", CARMEN_PARAM_DOUBLE, &length, 1, handler},
    {"scout", "dev", CARMEN_PARAM_STRING, &dev, 1, handler},
  };

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

  signal(SIGINT, shutdown_module);
  
  num_items = sizeof(param_list)/sizeof(param_list[0]);

  carmen_param_install_params(argc, argv, param_list, num_items);
 
  carmen_param_get_robot();
  carmen_param_get_modules(&modules, &num_modules);
 
  carmen_warn("robot_length is %.1f\n", length);
  carmen_warn("scout_dev is %s\n", dev);

  carmen_param_check_unhandled_commandline_args(argc, argv);

  carmen_ipc_dispatch();

  return 0;
}
示例#3
0
unsigned int
carmen_generate_random_seed(void)
{
  FILE *random_fp;
  unsigned int seed;
  int ints;

  random_fp = fopen("/dev/random", "r");
  if (random_fp == NULL) {
    carmen_warn("Could not open /dev/random for reading: %s\n"
                "Using time ^ PID\n", strerror(errno));
    seed = time(NULL) ^ getpid();
    srandom(seed);
    return seed;
  }

  ints = fread(&seed, sizeof(int), 1, random_fp);
  if (ints != 1) {
    carmen_warn("Could not read an int from /dev/random: %s\n"
                "Using time ^ PID\n", strerror(errno));
    seed = time(NULL) ^ getpid();
    srandom(seed);
    return seed;
  }

  fclose(random_fp);

  srandom(seed);

  return seed;
}
示例#4
0
void robot_rearlaser_handler(carmen_robot_laser_message *rear_laser)
{
  carmen_warn("\nrear_laser\n");
  carmen_warn("%.2f %.2f %.2f\n", rear_laser->robot_pose.x, 
	      rear_laser->robot_pose.y, 
	      carmen_radians_to_degrees(rear_laser->robot_pose.theta));
}
示例#5
0
void robot_frontlaser_handler(carmen_robot_laser_message *front_laser)
{
  carmen_warn("front_laser\n");
  carmen_warn("%.2f %.2f %.2f\n", front_laser->robot_pose.x, 
	      front_laser->robot_pose.y, 
	      carmen_radians_to_degrees(front_laser->robot_pose.theta));
}
示例#6
0
unsigned int
carmen_randomize(int *argc, char ***argv)
{
  long long int user_seed;
  unsigned int seed;
  int bytes_to_move;
  int i;
  char *endptr;

  for (i = 0; i < *argc-1; i++) {
    if (strcmp((*argv)[i], "--seed") == 0) {
      user_seed = strtoll((*argv)[i+1], &endptr, 0);
      seed = (unsigned int)user_seed;
      if (endptr && *endptr != '\0') {
	carmen_warn("Bad random seed %s.\n", (*argv)[i+1]);
	seed = carmen_generate_random_seed();
      } else if (seed != user_seed) {
	carmen_warn("Random seed too large: %s.\n", (*argv)[i+1]);
	seed = carmen_generate_random_seed();
      } else {
	if (i < *argc-2) {
	  bytes_to_move = (*argc-2-i)*sizeof(char *);
	  memmove((*argv)+i, (*argv)+i+2, bytes_to_move);
	}
	(*argc) -= 2;
	srandom(seed);
      }
      return seed;
    }
  }
  seed = carmen_generate_random_seed();
  return seed;
}
示例#7
0
void carmen_velodyne_set_spin_rate(int spin_rate) {
  SerialConnection serialConnection(dev_name);
  Controller control(serialConnection);

  try {
    control.setRPM(spin_rate);
  }
  catch (IOException& exception) {
    carmen_warn("\nWarning: Failed to set spin rate\n");
  }
  catch (OutOfBoundException<size_t>& exception) {
    carmen_warn("\nWarning: Spin rate %d is invalid\n", spin_rate);
  }
}
void
visual_tracker_test_message_handler(carmen_visual_tracker_test_message* message)
{
	IplImage *frame = cvCreateImage(cvSize(message->width, message->height), IPL_DEPTH_8U, message->channels);

	copy_RGB_image_to_BGR_image(message->image, frame, message->channels);

	if (m_tld && m_tld->initialized())
	{
		static int fn = 0;
		m_tld->process(frame);

		message_output.confidence = m_tld->getOutputConfidence();

		TLDRect box = m_tld->getOutputRect();

		message_output.rect.x = box.x();
		message_output.rect.y = box.y();
		message_output.rect.width = box.width();
		message_output.rect.height = box.height();

		carmen_warn("[%d; %.1f; %.1f]\n", ++fn,
				box.x()+box.width()/2.0, box.y()+box.height()/2.0);

		message_output.host = message->host;
		message_output.timestamp = message->timestamp;

		publish_visual_tracker_output_message();
	}
	cvReleaseImage(&frame);
}
void
visual_tracker_train_message_handler(carmen_visual_tracker_train_message* message)
{
	IplImage *frame = cvCreateImage(cvSize(message->width, message->height), IPL_DEPTH_8U, message->channels);

	copy_RGB_image_to_BGR_image(message->image, frame, message->channels);

	TLDRect box(message->rect.x, message->rect.y, message->rect.width, message->rect.height);

	if (m_tld)
	{
		free(m_tld);
		m_tld = NULL;
	}
	m_tld = new Detector();
	if (m_tld)
	{
		m_tld->init(frame, &box);
		m_tld->signalBoundingBox(true);
		m_tld->signalConfidence(true);
		carmen_warn("[%d; %.1f; %.1f]\n", 0,
				box.x()+box.width()/2.0, box.y()+box.height()/2.0);
	}
	cvReleaseImage(&frame);
}
示例#10
0
int main(int argc, char *argv[]) 
{
  unsigned int seed;
  
  carmen_initialize_ipc(argv[0]);

  carmen_param_check_version(argv[0]);
  IPC_setVerbosity(IPC_Print_Warnings);  
  
  seed = carmen_randomize(&argc, &argv);
  carmen_warn("Seed: %u\n", seed);
  carmen_simulator_subscribe_truepos_message
    (&truepose, NULL, CARMEN_SUBSCRIBE_LATEST);

  carmen_simulator_subscribe_objects_message
    (NULL, (carmen_handler_t)simulator_objects_handler, 
     CARMEN_SUBSCRIBE_LATEST);

  map = (carmen_map_t *)calloc(1, sizeof(carmen_map_t));
  carmen_test_alloc(map);
  carmen_map_get_gridmap(map);

  IPC_dispatch();

  return 0;
}
示例#11
0
void carmen_robot_correct_bumper_and_publish(void) 
{  
  double bumper_skew;
  double fraction;
  int low, high;
  
  if(!bumper_ready)
    return;

  check_message_data_chunk_sizes();
  
  bumper_ready = carmen_robot_get_skew(bumper_count, &bumper_skew,
				       &bumper_average, 
				       base_bumper.host);
  if (!bumper_ready) {
    carmen_warn("Waiting for bumper data to accumulate\n");
    return;
  }

  fraction = carmen_robot_get_fraction(base_bumper.timestamp, bumper_skew,
				       &low, &high);

  if (!carmen_robot_config.interpolate_odometry)
    fraction=0;

  construct_bumper_message(&robot_bumper, low, high, fraction);
    
  IPC_RETURN_TYPE err;
  err = IPC_publishData(CARMEN_ROBOT_BUMPER_NAME, &robot_bumper);
  carmen_test_ipc_exit(err, "Could not publish", CARMEN_ROBOT_BUMPER_NAME);

  fprintf(stderr, "b");
  bumper_ready = 0;  
}
示例#12
0
void bumblebee_message_handler(carmen_bumblebee_basic_stereoimage_message *message)
{
	static int fn = 1;
	char name[255];
	CvRect rect_translate = cvRect(160, 90, 10, 12);
	CvRect rect_rotate = cvRect(177, 84, 10, 12);
	CvRect rect_scale = cvRect(162, 94, 10, 12);
//	CvRect *rect = NULL;
	CvRect *rect = &rect_translate;
	sprintf(name, "camshift-translate-%05d.jpg", fn++);
//	CvRect *rect = &rect_rotate;
//	sprintf(name, "camshift-rotate-%05d.jpg", fn++);
//	CvRect *rect = &rect_scale;
//	sprintf(name, "camshift-scale-%05d.jpg", fn++);

	CvSize size = cvSize(message->width, message->height);
	IplImage *frame_left = cvCreateImage(size, IPL_DEPTH_8U, 3);
	copy_RGB_image_to_BGR_image(message->raw_left, frame_left, 3);

	cvSaveImage(name, frame_left, 0);

	if (camshift)
		camshift->trackVisualControl(frame_left);
	else
	{
		camshift = new VisualControl(frame_left->width, frame_left->height);
		camshift->startVisualControl(frame_left, rect);
	}
	carmen_warn("%.1f,%.1f,%.1f,%.1f\n",
			camshift->getRectCoordLeftUp().x,
			camshift->getRectCoordLeftUp().y,
			camshift->getRectCoordRightDown().x,
			camshift->getRectCoordRightDown().y);
}
示例#13
0
carmen_camera_image_t *carmen_camera_start(int argc, char **argv)
{
  carmen_camera_image_t *image;

  read_parameters(argc, argv);

  carmen_warn("Opening camera\n");

  camera_fd = open(camera_dev, O_RDONLY | O_NOCTTY);
  if (camera_fd < 0)
    carmen_die_syserror("Could not open %s as camera device", camera_dev);

  check_camera_type();
  setup_camera();

  image = (carmen_camera_image_t *)calloc(1, sizeof(carmen_camera_image_t));

  image->width = image_width;
  image->height = image_height;
  image->bytes_per_pixel = 3;

  image->image_size = image->width*image->height*image->bytes_per_pixel;
  image->is_new = 0;
  image->timestamp = 0;
  image->image = (char *)calloc(image->image_size, sizeof(char));
  carmen_test_alloc(image->image);
  memset(image->image, 0, image->image_size*sizeof(char));

  return image;
}
示例#14
0
static void toppm(int argc, char *argv[]) 
{
  int err;
  int next_arg;
  int force;
  char *input_filename, *output_filename;
  carmen_map_t map;

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

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

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

  if(carmen_map_read_gridmap_chunk(input_filename, &map) < 0) 
    carmen_die("Error: %s did not contain a gridmap.\n", input_filename);
  carmen_map_read_offlimits_chunk_into_map(input_filename, &map);

  err = carmen_map_write_to_ppm(&map, output_filename);
  if (err < 0)
    carmen_die_syserror("Could not write ppm to %s", output_filename);
}
示例#15
0
int main(int argc, char **argv)
{
  carmen_ipc_initialize(argc, argv);
  carmen_param_check_version(argv[0]);
  
  signal(SIGINT, shutdown_module);

#ifndef COMPILE_WITHOUT_LASER_SUPPORT
  carmen_robot_subscribe_frontlaser_message
    (NULL, (carmen_handler_t)robot_frontlaser_handler,
     CARMEN_SUBSCRIBE_LATEST);
  carmen_robot_subscribe_rearlaser_message
    (NULL,(carmen_handler_t)robot_rearlaser_handler,
     CARMEN_SUBSCRIBE_LATEST);
#endif
  carmen_robot_subscribe_sonar_message
    (NULL, (carmen_handler_t)robot_sonar_handler,
     CARMEN_SUBSCRIBE_LATEST);
  carmen_base_subscribe_odometry_message
    (NULL, (carmen_handler_t)base_odometry_handler,
     CARMEN_SUBSCRIBE_LATEST);

  carmen_robot_move_along_vector(0, M_PI/2);
  
  sleep(10);
  carmen_robot_move_along_vector(2, 0);

  while(1) {
    carmen_ipc_sleep(0.1);
    carmen_warn(".");
  }
  return 0;
}
示例#16
0
int carmen_velodyne_read_parameters(int argc, char **argv) {
  char module[] = "velodyne";
  int num_params;

  char dev_name_var [256], spin_rate_var[256];
  char calib_filename_var[256], dump_enabled_var[256], dump_dirname_var[256];
  char points_publish_var[256];

  if (argc == 2)
    id = atoi(argv[1]);

  sprintf(dev_name_var, "velodyne%d_dev", id);
  sprintf(spin_rate_var, "velodyne%d_spin_rate", id);
  sprintf(calib_filename_var, "velodyne%d_calib_file", id);
  sprintf(dump_enabled_var, "velodyne%d_dump_enable", id);
  sprintf(dump_dirname_var, "velodyne%d_dump_dir", id);
  sprintf(points_publish_var, "velodyne%d_points_publish", id);

  carmen_param_t params[] = {
    {module, dev_name_var, CARMEN_PARAM_STRING, &dev_name, 1, 0},
    {module, spin_rate_var, CARMEN_PARAM_INT, &spin_rate, 1,
      carmen_velodyne_spin_rate_handler},
    {module, calib_filename_var, CARMEN_PARAM_FILE, &calib_filename, 1, 0},
    {module, dump_enabled_var, CARMEN_PARAM_ONOFF, &dump_enabled, 1,
      carmen_velodyne_dump_handler},
    {module, dump_dirname_var, CARMEN_PARAM_DIR, &dump_dirname, 1,
      carmen_velodyne_dump_handler},
    {module, points_publish_var, CARMEN_PARAM_ONOFF, &points_publish, 1,
      carmen_velodyne_points_handler},
  };

  num_params = sizeof(params)/sizeof(carmen_param_t);
  carmen_param_install_params(argc, argv, params, num_params);

  if (!realpath(calib_filename, calib_path)) {
    calib_path[0] = '\0';
    carmen_warn("\nWarning: Calibration filename %s is invalid\n",
      calib_filename);
  }

  if (!realpath(dump_dirname, dump_path)) {
    dump_path[0] = '\0';
    carmen_warn("\nWarning: Dump directory %s is invalid\n", dump_dirname);
  }

  return num_params;
}
示例#17
0
static void 
shutdown_cerebellum(int signo) 
{
  carmen_warn("Inside shutdown_cerebellum\n");
  carmen_cerebellum_shutdown(signo);
  close_ipc();
  exit(-1);
}
示例#18
0
static void 
laser_handler(void)
{
  received_laser = 1;
  laser_count++;
  carmen_warn("%d", laser.id);
  Redraw();
}
示例#19
0
static carmen_inline void 
push_state(int x, int y, double new_utility, queue state_queue)
{
  state_ptr new_state = carmen_conventional_create_state(x, y, new_utility);
  insert_into_queue(new_state, state_queue);
  *(utility_value(x, y)) = new_utility;
  if (*(costs+x*y_size+y) > 0.9)
    carmen_warn("Bad utility\n");
} 
示例#20
0
void carmen_velodyne_dump_handler(char* module, char* variable, char* value) {
  if (dump_file.is_open())
    dump_file.close();
  
  if (!realpath(dump_dirname, dump_path)) {
    dump_path[0] = '\0';
    carmen_warn("\nWarning: Dump directory %s is invalid\n", dump_dirname);
  }
}
static void carmen_map_read_gridmap(carmen_FILE *fin, carmen_FILE *fout)
{
  int size_x, size_y;
  float resolution;
  float *complete_map = NULL;
  carmen_map_t map;

  int chunk_type, chunk_size;
  char chunk_description[12];

  if(carmen_map_advance_to_chunk(fin, CARMEN_MAP_GRIDMAP_CHUNK) < 0) {
      fprintf(stderr, "Error: Could not find a gridmap chunk.\n");
      fprintf(stderr, "       This file is probably not a map file.\n");
      carmen_fclose(fin);
    }

  chunk_type = carmen_fgetc(fin);
  carmen_fread(&chunk_size, sizeof(int), 1, fin);
  carmen_fread(chunk_description, 10, 1, fin);

  chunk_description[10] = '\0';

  if(CARMEN_MAP_CHUNK_IS_NAMED(chunk_type)) {
    if(read_string(NULL, -1, fin) < 0) {
      carmen_warn("Error: Unexpected EOF.\n");
      carmen_fclose(fin);
    }
  }

  carmen_fread(&size_x, sizeof(int), 1, fin);
  carmen_fread(&size_y, sizeof(int), 1, fin);
  carmen_fread(&resolution, sizeof(float), 1, fin);

  printf("%d %d %lf\n", size_x, size_y, resolution);

  carmen_grid_mapping_create_new_map(&map, size_x, size_y, resolution);
  complete_map = (float *)calloc(map.config.x_size * map.config.y_size, sizeof(float));

  carmen_fread(complete_map, sizeof(float) * size_x * size_y, 1, fin);

  for (int i = 0; i < map.config.x_size * map.config.y_size; i++)
  {
	  map.complete_map[i] = complete_map[i];
  }


  carmen_map_write_all(fout, map.map,
  			map.config.x_size,
  			map.config.y_size,
  			map.config.resolution,
  			(char *)"",	(char *)"", (char *)"", (char *)"Generated by LCAD-UFES",
  			NULL, 0, NULL, 0, NULL, 0);
  free(complete_map);
  free(map.complete_map);
  free(map.map);
}
示例#22
0
bool LogFile::load(const char* filename, bool verbose) {
  char line[100000];

  carmen_FILE *logfile = NULL;
  carmen_logfile_index_p logfile_index = NULL;

  logfile = carmen_fopen(filename, "r");
  if(logfile == NULL) {
    if (verbose)
      carmen_warn("Error: could not open file %s for reading.\n", filename);
    return false;
  }

  /* index the logfile */
  logfile_index = carmen_logfile_index_messages(logfile);

  for(int i = 0; i < logfile_index->num_messages; i++) {
    
    /* read i-th line */
    carmen_logfile_read_line(logfile_index, logfile, i, 100000, line);

    /* create messages */
    if(strncmp(line, "ODOM ", 5) == 0) {
      push_back(new OdometryMessage(line));
    }
    else if(strncmp(line, "RAWLASER", 8) == 0) {
      push_back(new LaserMessage(line));
    }
    else if(strncmp(line, "ROBOTLASER", 10) == 0) {
      push_back(new RobotLaserMessage(line));
    }
    else if(strncmp(line, "FLASER ", 7) == 0) {
      push_back(new RobotLaserMessage(line));
    }
    else if(strncmp(line, "RLASER ", 7) == 0) {
      push_back(new RobotLaserMessage(line));
    }
    else if(strncmp(line, "TRUEPOS ", 8) == 0) {
      push_back(new TrueposMessage(line));
    }
    else if(strncmp(line, "IMU ", 4) == 0) {
      push_back(new IMUMessage(line));
    }
    else if(strncmp(line, "SCANMARK ", 9) == 0) {
      push_back(new ScanmarkMessage(line));
    }
    else if(strncmp(line, "POSITIONLASER ", 14) == 0) {
      push_back(new LaserposMessage(line));
    }
    else if(strlen(line) > 1) {
      push_back(new UnknownMessage(line));
    }
  }
  carmen_fclose(logfile);  
  return true;
}
示例#23
0
carmen_ackerman_traj_point_p
carmen_planner_util_get_path_point(int index, carmen_planner_path_p path) 
{
	if (index >= path->length || index < 0)
	{
		carmen_warn("Bad path id in %s : requested %d but max id is %d.\n",
				__FUNCTION__, index, path->length-1);
		return NULL;
	}

	return path->points+index;
}
示例#24
0
double
carmen_get_time(void)
{
  struct timeval tv;
  double t;

  if (gettimeofday(&tv, NULL) < 0)
    carmen_warn("carmen_get_time encountered error in gettimeofday : %s\n",
		strerror(errno));
  t = tv.tv_sec + tv.tv_usec/1000000.0;
  return t;
}
static void
fill_laser_config_data(localize_ackerman_velodyne_laser_config_t *lasercfg)
{
	lasercfg->num_lasers = 1 + carmen_round(lasercfg->fov / lasercfg->angular_resolution);
	lasercfg->start_angle = -0.5 * lasercfg->fov;

	/* give a warning if it is not a standard configuration */

	if (fabs(lasercfg->fov - M_PI) > 1e-6 &&
			fabs(lasercfg->fov - 100.0/180.0 * M_PI) > 1e-6 &&
			fabs(lasercfg->fov -  90.0/180.0 * M_PI) > 1e-6)
		carmen_warn("Warning: You are not using a standard SICK configuration (fov=%.4f deg)\n",
				carmen_radians_to_degrees(lasercfg->fov));

	if (fabs(lasercfg->angular_resolution - carmen_degrees_to_radians(1.0)) > 1e-6 &&
			fabs(lasercfg->angular_resolution - carmen_degrees_to_radians(0.5)) > 1e-6 &&
			fabs(lasercfg->angular_resolution - carmen_degrees_to_radians(0.25)) > 1e-6)
		carmen_warn("Warning: You are not using a standard SICK configuration (res=%.4f deg)\n",
				carmen_radians_to_degrees(lasercfg->angular_resolution));

}
void carmen_roadmap_plan(carmen_roadmap_t *roadmap, carmen_world_point_t *goal)
{
  double dist, best_dist;
  carmen_map_point_t map_goal;
  int closest_node;
  int i;
  carmen_roadmap_vertex_t *node_list;
  carmen_roadmap_edge_t *edges;

  if (roadmap->nodes->length == 0)
    return;

  carmen_warn("Replan\n");

  carmen_world_to_map(goal, &map_goal);

  if (map_goal.x < 0 || map_goal.x >= goal->map->config.x_size ||
      map_goal.y < 0 || map_goal.y >= goal->map->config.y_size ||
      goal->map->map[map_goal.x][map_goal.y] > .001)
    return;
  
  node_list = (carmen_roadmap_vertex_t *)(roadmap->nodes->list);

  best_dist = FLT_MAX;
  closest_node = 0;
  for (i = 0; i < roadmap->nodes->length; i++) {
    node_list[i].utility = FLT_MAX;
    dist = hypot(node_list[i].x-map_goal.x,node_list[i].y-map_goal.y);
    if (dist < best_dist) {
      best_dist = dist;
      closest_node = i;
    }
  }
	
  if (best_dist >= 1) {
    add_node(roadmap->nodes, map_goal.x, map_goal.y);
    node_list = (carmen_roadmap_vertex_t *)(roadmap->nodes->list);
    roadmap->goal_id = roadmap->nodes->length-1;
    construct_edges(roadmap, roadmap->goal_id);
    edges = (carmen_roadmap_edge_t *)
      node_list[roadmap->goal_id].edges->list;
    for (i = 0; i < node_list[roadmap->goal_id].edges->length; i++) {
      if (node_list[edges[i].id].edges->length) {
	add_edge(node_list+roadmap->goal_id, node_list+edges[i].id,
		 edges[i].cost);
      }
    }
  } else 
    roadmap->goal_id = closest_node;

  for (i = 0; i < roadmap->nodes->length; i++) 
    node_list[i].utility = FLT_MAX;
}
示例#27
0
static void strip(int argc, char *argv[])
{
  char *input_filename, *output_filename, *chunk_type;
  carmen_FILE *fp_in, *fp_out;
  int next_arg;
  int force;

  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 strip <in map filename> "
	       "<out map filename> <chunk type>\n\n", argv[0]);
  }

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

  fp_in = carmen_fopen(input_filename, "r");
  if(fp_in == NULL) 
    carmen_die_syserror("Could not open %s for reading", input_filename);

  fp_out = carmen_fopen(output_filename, "w");
  if(fp_out == NULL) 
    carmen_die_syserror("Could not open %s for writing", output_filename);
  
  if (carmen_strcasecmp(chunk_type, "laserscans") == 0) {
    if (carmen_map_strip(fp_in, fp_out, CARMEN_MAP_LASERSCANS_CHUNK) < 0) 
      carmen_die_syserror("Error: could not strip file");
  }
  else if (carmen_strcasecmp(chunk_type, "gridmap") == 0) {
    if (carmen_map_strip(fp_in, fp_out, CARMEN_MAP_GRIDMAP_CHUNK) < 0) 
      carmen_die_syserror("Error: could not strip file");
  }
  else if (carmen_strcasecmp(chunk_type, "offlimits") == 0) {
    if (carmen_map_strip(fp_in, fp_out, CARMEN_MAP_OFFLIMITS_CHUNK) < 0) 
      carmen_die_syserror("Error: could not strip file");
  }
  else if (carmen_strcasecmp(chunk_type, "expected") == 0) {
    if (carmen_map_strip(fp_in, fp_out, CARMEN_MAP_EXPECTED_CHUNK) < 0) 
      carmen_die_syserror("Error: could not strip file");
  }
  else if (carmen_strcasecmp(chunk_type, "places") == 0) {
    if (carmen_map_strip(fp_in, fp_out, CARMEN_MAP_PLACES_CHUNK) < 0) 
      carmen_die_syserror("Error: could not strip file");
  }

  carmen_fclose(fp_in);
  carmen_fclose(fp_out); 
}
示例#28
0
void
convert_depthmap_to_beams(double* beams, float fov_horiz_in_degrees, int number_of_angular_steps, float max_range,
		float* depthmap, int depthmap_width, int depthmap_height, int depthmap_size)
{
	int j, i = number_of_angular_steps-1;
	float alpha, alpha_step, z;
	float focal_length_in_pixels = ((float)depthmap_width ) / (2.0 * tan(carmen_degrees_to_radians(fov_horiz_in_degrees/ 2.0)));
	int x, y = depthmap_height/2;

	alpha_step = fov_horiz_in_degrees / (float) number_of_angular_steps;
	for (alpha = -fov_horiz_in_degrees/2.0; alpha < fov_horiz_in_degrees/2.0; alpha += alpha_step, i--)
	{
		float alpha_in_radians = carmen_degrees_to_radians(alpha);
		float tan_alpha_in_radians = tan(alpha_in_radians);
		float cos_alpha_in_radians = cos(alpha_in_radians);

		x = (int)(((float)depthmap_width)/2.0) + (int)floor(focal_length_in_pixels * tan_alpha_in_radians);
		j = y * depthmap_width + x;

		if (j < depthmap_size)
			z = depthmap[j];
		else
		{
			carmen_warn("Laser beams range greater than depthmap size.");
			continue;
		}

		if (z < 0.5)
			z = max_range;

		if (fabs(cos_alpha_in_radians) > 1e-5)
			beams[i] = z / cos_alpha_in_radians;
		else
			beams[i] = z;

	}
	if(i>0)
		carmen_warn("Laser beams does not fulfill entirely FOV: total range %d, not filled range %d.\n", number_of_angular_steps, i);
}
示例#29
0
static void tomap(int argc, char *argv[]) 
{
  int next_arg;
  int force;
  double resolution;
  char *input_filename, *output_filename;
  carmen_map_t *map;
  carmen_FILE *out_fp;
  char buf[1024];

  gtk_init (&argc, &argv);

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

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

  resolution = (double)atof(argv[next_arg+1]);

  if (resolution == 0) 
    carmen_die("%s translated to a resolution of 0.\n"
		"A positive, non-zero resolution is required.\n", 
		argv[next_arg+1]);
  
  input_filename = argv[next_arg+2];
  if(!carmen_file_exists(input_filename)) 
     carmen_die("Image file %s does not exist.\n", input_filename);

  output_filename = check_output(argv[next_arg+3], force);

  map = carmen_map_imagefile_to_map(input_filename, resolution);

  out_fp = carmen_fopen(output_filename, "w");
  if (carmen_map_write_id(out_fp) < 0)
    carmen_die_syserror("Couldn't write map id to %s", output_filename);

  sprintf(buf, "Created from %s", input_filename);
  if (carmen_map_write_creator_chunk(out_fp, "img_to_map", buf) < 0)
    carmen_die_syserror("Couldn't write creator chunk 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 chunk to %s", output_filename);

  carmen_fclose(out_fp);
}
static inline double get_cost(carmen_roadmap_vertex_t *node, 
			      carmen_roadmap_vertex_t *parent_node,
			      carmen_roadmap_t *roadmap)
{
  carmen_roadmap_edge_t *edges;
  int i, j;
  int length;
  double cost = 0;
  carmen_map_p c_space;

  c_space = roadmap->c_space;

  edges = (carmen_roadmap_edge_t *)(parent_node->edges->list);
  length = parent_node->edges->length;
  for (i = 0; i < length; i++) {
    if (edges[i].id == node->id) {
      cost = edges[i].cost;
      break;
    }
  }  

  if (0)
    carmen_warn("Cost from %d %d to %d %d is %f\n",
		parent_node->x, parent_node->y, node->x, node->y, cost);

  if (edges[i].blocked)
    return 1e6;

  if (cost > 1e5)
    return edges[i].cost;

  if (carmen_dynamics_test_for_block(node, parent_node, 
				     roadmap->avoid_people)) {
    edges[i].blocked = 1;
    length = parent_node->edges->length;
    edges = (carmen_roadmap_edge_t *)(parent_node->edges->list);
    for (j = 0; j < length; j++) {
      if (edges[j].id == node->id)
	break;
    }
    if (j < length) {
      edges[j].blocked = 1;
      carmen_dynamics_mark_blocked(node->id, i, parent_node->id, j);
    }
    return 1e6;
  }

  return edges[i].cost;
}