예제 #1
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); 
}
예제 #2
0
static int
query_num_params(char *module_name) {
    int count;
    int index;

    count = 0;
    for (index = 0; index < num_params; index++)
        if (carmen_strcasecmp(param_list[index].module_name, module_name) == 0)
            count++;

    return count;
}
예제 #3
0
static int
lookup_name(char *full_name)
{
    int index;

    for (index = 0; index < num_params; index++)
    {
        if (carmen_strcasecmp(param_list[index].lvalue, full_name) == 0)
            return index;
    }

    return -1;
}
예제 #4
0
void read_parameters(int argc, char **argv)
{
  carmen_param_t camera_params[] = {
    {"camera", "dev", CARMEN_PARAM_STRING, &camera_dev, 0, NULL},
    {"camera", "image_width", CARMEN_PARAM_INT, &image_width, 0, NULL},
    {"camera", "image_height", CARMEN_PARAM_INT, &image_height, 0, NULL},
    {"camera", "brightness", CARMEN_PARAM_INT, &brightness, 0, NULL},
    {"camera", "hue", CARMEN_PARAM_INT, &hue, 0, NULL},
    {"camera", "saturation", CARMEN_PARAM_INT, &saturation, 0, NULL},
    {"camera", "contrast", CARMEN_PARAM_INT, &contrast, 0, NULL},
    {"camera", "gamma", CARMEN_PARAM_INT, &camera_gamma, 0, NULL},
    {"camera", "denoisestrength", CARMEN_PARAM_INT, &denoisestrength, 0, NULL},
    {"camera", "awbmode", CARMEN_PARAM_STRING, &awbmode, 0, NULL},
    {"camera", "antiflicker", CARMEN_PARAM_ONOFF, &antiflicker, 0, NULL},
    {"camera", "backlightcompensation", CARMEN_PARAM_ONOFF, &backlightcompensation, 0, NULL},
    {"camera", "useautosharpen", CARMEN_PARAM_ONOFF, &useautosharpen, 0, NULL},
    {"camera", "useautoshutter", CARMEN_PARAM_ONOFF, &useautoshutter, 0, NULL},
    {"camera", "useagc", CARMEN_PARAM_ONOFF, &useagc, 0, NULL},
    {"camera", "fps", CARMEN_PARAM_INT, &fps, 0, NULL}};

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

  carmen_param_set_module("camera");
  if (!useautosharpen) {
    if (carmen_param_get_int("sharpenstrength", &sharpenstrength,NULL) < 0)
      carmen_die("camera_sharpenstrength must be specified or "
		 "carmen_useautosharpen\nmust be turned on\n");
  }
  if (!useautoshutter) {
    if (carmen_param_get_int("shutterlength", &shutterlength,NULL) < 0)
      carmen_die("camera_shutterlength must be specified or "
		 "carmen_useautoshutter\nmust be turned on\n");
  }
  if (!useagc) {
    if (carmen_param_get_int("gain", &gain,NULL) < 0)
      carmen_die("camera_gain must be specified or carmen_useagc\n"
		 "must be turned on\n");
  }
  if(carmen_strcasecmp(awbmode, "Custom") == 0) {
    if (carmen_param_get_int("awbred", &awbred,NULL) < 0)
      carmen_die("camera_awbred must be specified or carmen_awbmode\n"
		 "cannot be set to custom.\n");
    if (carmen_param_get_int("awbblue", &awbblue,NULL) < 0)
      carmen_die("camera_awbblue must be specified or carmen_awbmode\n"
		 "cannot be set to custom.\n");
  }
}
예제 #5
0
static int
read_commandline(int argc, char **argv)
{
    int index, i;
    int cur_arg;
    char **robot_names = NULL;
    int num_robots = 0;
    int binary;

    //  extern char *optarg;
    //  extern int optind;
    //  extern int optopt;

    static struct option long_options[] = {
        {"help", 0, 0, 0},
        {"robot", 1, NULL, 0},
        {"alphabetize", 0, &alphabetize, 1},
        {0, 0, 0, 0}
    };

    int option_index = 0;
    int c;
    char arg_buffer[255];

    opterr = 0;
    while (1) {
        c = getopt_long (argc, argv, "ahr:",
                         long_options, &option_index);
        if (c == -1)
            break;

        if (c == 0) {
            sprintf(arg_buffer, "--%s", long_options[option_index].name);
            if (carmen_strcasecmp(long_options[option_index].name, "help") == 0)
                c = 'h';
            else if (carmen_strcasecmp(long_options[option_index].name,"robot") == 0)
                c = 'r';
        } else {
            sprintf(arg_buffer, "-%c", c);
        }

        switch (c) {
        case 'r':
            if (optarg == NULL)
                usage(argv[0], "%s requires an argument", arg_buffer);
            if (strlen(optarg) > MAX_ROBOT_NAME_LENGTH)
                usage(argv[0], "argument to %s: %s is invalid (too long).",
                      arg_buffer, optarg);
            selected_robot = (char *)calloc(strlen(optarg)+1, sizeof(char));
            carmen_test_alloc(selected_robot);
            strcpy(selected_robot, optarg);
            break;
        case 'a':
            alphabetize = 1;
            break;
        case 'h':
            help(argv[0]);
            break;
        case ':':
            usage(argv[0], "-%c requires an argument", optopt);
            break;
        case '?':
            //      usage(argv[0], "unknown option character %c", optopt);
            break;
        }
    }

#ifndef COMPILE_WITHOUT_MAP_SUPPORT
    /* look for a map file */
    map_filename = NULL;
    for (cur_arg = optind; cur_arg < argc; cur_arg++) {
        if (carmen_map_file(argv[cur_arg]) && map_filename)
            usage(argv[0], "too many map files given: %s and %s", map_filename,
                  argv[cur_arg]);
        if (carmen_map_file(argv[cur_arg])) {
            map_filename = (char *)calloc(strlen(argv[cur_arg])+1, sizeof(char));
            carmen_test_alloc(map_filename);
            strcpy(map_filename, argv[cur_arg]);
        }
    }
#endif

    param_filename = NULL;
    for (cur_arg = optind; cur_arg < argc; cur_arg++) {
#ifndef COMPILE_WITHOUT_MAP_SUPPORT
        if (map_filename && strcmp(map_filename, argv[cur_arg]) == 0)
            continue;
#endif
        if (param_filename && carmen_file_exists(argv[cur_arg])) {
            usage(argv[0], "Too many ini files given: %s and %s",
                  param_filename, argv[cur_arg]);
        }
        if (!carmen_file_exists(argv[cur_arg]))
            usage(argv[0], "No such file: %s", argv[cur_arg]);

        binary = contains_binary_chars(argv[cur_arg]);
        if (binary < 0)
            usage(argv[0], "Couldn't read from %s: %s", argv[cur_arg],
                  strerror(errno));
        if (binary > 0)
            usage(argv[0], "Invalid ini file %s: (not a valid map file either)",
                  argv[cur_arg]);
        param_filename = (char *)calloc(strlen(argv[cur_arg])+1, sizeof(char));
        carmen_test_alloc(param_filename);
        strcpy(param_filename, argv[cur_arg]);
    }

    if (!param_filename) {
        for (index = 0; default_list[index]; index++) {
            if (carmen_file_exists(default_list[index])) {
                param_filename = default_list[index];
                break;
            }
        }
    }

    robot_names = (char **)calloc(MAX_ROBOTS, sizeof(char *));
    carmen_test_alloc(robot_names);
    find_valid_robots(robot_names, &num_robots, MAX_ROBOTS);

    if (num_robots == 0) {
        carmen_warn("Loading parameters for default robot using param file "
                    "%s\n", param_filename);
        return 0;
    }

    robot_names = (char **)realloc(robot_names, num_robots * sizeof(char *));
    carmen_test_alloc(robot_names);

    if (selected_robot == NULL && num_robots > 1) {
        for (cur_arg = 1; cur_arg < optind; cur_arg++) {
            for (i = 0; i < num_robots; i++)
                if(strcmp(robot_names[i], argv[cur_arg] + 1) == 0) {
                    selected_robot = argv[cur_arg] + 1;
                    break;
                }
        }
    }

    if (selected_robot == NULL && num_robots > 1)
        usage(argv[0], "The ini_file %s contains %d robot definitions.\n"
              "You must specify a robot name on the command line using --robot.",
              param_filename, num_robots);
    if (selected_robot == NULL)
        selected_robot = carmen_new_string("%s", robot_names[0]);

    for(i = 0; i < num_robots; i++)
        free(robot_names[i]);
    free(robot_names);

    carmen_warn("Loading parameters for robot %s using param file "
                "%s\n", selected_robot, param_filename);

    return 0;
}
예제 #6
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]);
}
예제 #7
0
int main(int argc, char **argv)
{
  char *action;

  if (argc < 2) 
    main_usage(argv[0]);
  
  action = argv[1];
  
  if (carmen_strcasecmp(action, "-h") == 0 || 
      carmen_strcasecmp(action, "--help") == 0) 
    main_usage(argv[0]);
  if (carmen_strcasecmp(action, "help") == 0) {
    help(argc, argv);
    return 0;
  }

  if (carmen_strcasecmp(action, "toppm") == 0)
    toppm(argc, argv);
#ifndef NO_GRAPHICS
  else if (carmen_strcasecmp(action, "tomap") == 0)
    tomap(argc, argv);
#endif
  else if (carmen_strcasecmp(action, "rotate") == 0)
    rotate(argc, argv);
  else if (carmen_strcasecmp(action, "minimize") == 0)
    minimize(argc, argv);
  else if (carmen_strcasecmp(action, "add_place") == 0)
    add_place(argc, argv);
  else if (carmen_strcasecmp(action, "add_offset") == 0)
    add_offset(argc, argv);
  else if (carmen_strcasecmp(action, "strip") == 0)
    strip(argc, argv);
  else if (carmen_strcasecmp(action, "info") == 0)
    info(argc, argv);
  else {
    carmen_warn("\nUnrecognized action %s\n", argv[1]);
    main_usage(argv[0]);
  }

  return 0;
}
예제 #8
0
static void setup_camera(void)
{
  struct video_picture svp;
  struct pwc_whitebalance pw;  
  struct video_window svw;  
  int tmp = 1;

  if(ioctl(camera_fd, VIDIOCPWCSCQUAL, &tmp) != 0) 
    carmen_die_syserror("Could not set camera parameters");
	
  if(useagc) {
    tmp = -1;
    if(ioctl(camera_fd, VIDIOCPWCSAGC, &tmp) != 0)
      carmen_die_syserror("Could not set camera parameters");
  } else {
    if(ioctl(camera_fd, VIDIOCPWCSAGC, &gain) != 0)
      carmen_die_syserror("Could not set camera parameters");
  }
	
  if(useautoshutter) {
    tmp = -1;
    if(ioctl(camera_fd, VIDIOCPWCSSHUTTER, &tmp) != 0)
      carmen_die_syserror("Could not set camera parameters");
  } else {
    if(ioctl(camera_fd, VIDIOCPWCSSHUTTER, &shutterlength) != 0)
       carmen_die_syserror("Could not set camera parameters");
  }
	
  if(ioctl(camera_fd, VIDIOCPWCGAWB, &pw) != 0)
    carmen_die_syserror("Could not set camera parameters");
  if (carmen_strcasecmp(awbmode, "Auto") == 0) {
    pw.mode = PWC_WB_AUTO;
  } else if(carmen_strcasecmp(awbmode, "Custom") == 0) {
    pw.mode = PWC_WB_MANUAL;
    pw.manual_red = awbred;
    pw.manual_blue = awbblue;
  } else if(carmen_strcasecmp(awbmode, "Indoor") == 0) {
    pw.mode = PWC_WB_INDOOR;
  } else if(carmen_strcasecmp(awbmode, "Outdoor") == 0) {
    pw.mode = PWC_WB_OUTDOOR;
  } else if(carmen_strcasecmp(awbmode, "Fluorescent") == 0) {
    pw.mode = PWC_WB_FL;
  } else {
    carmen_warn("Unknown white balance mode %s!\n", awbmode);
    pw.mode = PWC_WB_AUTO;
  }
  if(ioctl(camera_fd, VIDIOCPWCSAWB, &pw) != 0)
    carmen_die_syserror("Could not set camera parameters");
  
  // [fix] do something with the led?
  
  if(useautosharpen) {
    tmp = -1;
    if(ioctl(camera_fd, VIDIOCPWCSCONTOUR, &tmp) != 0)
      carmen_die_syserror("Could not set camera parameters");
  } else {
    if(ioctl(camera_fd, VIDIOCPWCSCONTOUR, &sharpenstrength) != 0)
      carmen_die_syserror("Could not set camera parameters");
  }
	
  if(backlightcompensation) {
    tmp = 1;
    if(ioctl(camera_fd, VIDIOCPWCSBACKLIGHT, &tmp) != 0)
      carmen_die_syserror("Could not set camera parameters");
  } else {	
    tmp = 0;
    if(ioctl(camera_fd, VIDIOCPWCSBACKLIGHT, &tmp) != 0)
      carmen_die_syserror("Could not set camera parameters");
  }
  
  if(antiflicker) {
    tmp = 1;
    if(ioctl(camera_fd, VIDIOCPWCSFLICKER, &tmp) != 0)
      carmen_die_syserror("Could not set camera parameters");
  } else {
    tmp = 0;
    if(ioctl(camera_fd, VIDIOCPWCSFLICKER, &tmp) != 0)
      carmen_die_syserror("Could not set camera parameters");
  }
  
  if(ioctl(camera_fd, VIDIOCPWCSDYNNOISE, &denoisestrength) != 0)
    carmen_die_syserror("Could not set camera parameters");
  
  if(ioctl(camera_fd, VIDIOCGPICT, &svp) != 0)
    carmen_die_syserror("Could not set camera parameters");
  
  if(brightness != -1) svp.brightness = brightness;
  if(hue != -1)        svp.hue        = hue;
  if(saturation != -1) svp.colour     = saturation;
  if(contrast != -1)   svp.contrast   = contrast;
  if(camera_gamma != -1)      svp.whiteness  = camera_gamma;
  
  if(dospecial) svp.palette = VIDEO_PALETTE_YUV420P;
  
  if(ioctl(camera_fd, VIDIOCSPICT, &svp) != 0)
    carmen_die_syserror("Could not set camera parameters");
  
  if(ioctl(camera_fd, VIDIOCGWIN, &svw) != 0)
    carmen_die_syserror("Could not set camera parameters");
  
  if(dospecial) svw.width = image_width;
  if(dospecial) svw.height = image_height;
  
  svw.flags &= ~PWC_FPS_FRMASK;
  svw.flags |= (fps << PWC_FPS_SHIFT);
  
  if(ioctl(camera_fd, VIDIOCSWIN, &svw) != 0)
    carmen_die_syserror("Could not set camera parameters");
}