Пример #1
0
// Update a dio device
void dio_update(dio_t *dio)
{
  // Update the device subscription
  if (rtk_menuitem_ischecked(dio->subscribe_item))
  {
    if (!dio->proxy->info.subscribed)
      if (playerc_dio_subscribe(dio->proxy, PLAYER_OPEN_MODE) != 0)
        PRINT_ERR1("libplayerc error: %s", playerc_error_str());
  }
  else
  {
    if (dio->proxy->info.subscribed)
      if (playerc_dio_unsubscribe(dio->proxy) != 0)
        PRINT_ERR1("libplayerc error: %s", playerc_error_str());
  }
  rtk_menuitem_check(dio->subscribe_item, dio->proxy->info.subscribed);

  if (dio->proxy->info.subscribed)
  {
    // Draw in the dio scan if it has been changed.
    if (dio->proxy->info.datatime != dio->datatime)
    {
      dio_draw(dio);
      dio->datatime = dio->proxy->info.datatime;
    }
  }
  else
  {
    // Dont draw the dio.
    rtk_fig_show(dio->fig, 0);
  }
}
Пример #2
0
/* Main()*/
int main(int argc, const char **argv)
{
  // Create a client object and connect to the server; the server must
  // be running on "localhost" at port 6665
  client = playerc_client_create(NULL, "gort", 9876);
  if (playerc_client_connect(client) != 0)
  {
    fprintf(stderr, "error: %s\n", playerc_error_str());
    return -1;
  }

  // Create a bumper proxy (device id "bumper:0" and subscribe
   // in read mode
  bumper = playerc_bumper_create(client, 0);
  if(playerc_bumper_subscribe(bumper,PLAYERC_OPEN_MODE)!= 0)
  {
    fprintf(stderr, "error: %s\n", playerc_error_str());
    return -1;
  }

  // Create a position2d proxy (device id "position2d:0") and susbscribe
  // in read/write mode
  position2d = playerc_position2d_create(client, 0);
  if (playerc_position2d_subscribe(position2d, PLAYERC_OPEN_MODE) != 0)
  {
    fprintf(stderr, "error: %s\n", playerc_error_str());
    return -1;
  }
  // Enable the robots motors
  playerc_position2d_enable(position2d, 1);
  playerc_client_read(client);
  
  // Point 1 to Point 2
  Move(client, MOVE1, ANGLE1);
  Turn(client, TURN1);

  // Point 2 to Point 3
  Move(client, MOVE2, ANGLE2);
  Turn(client, TURN2);

  // Point 3 to Point 4
  Move(client, MOVE3, ANGLE3);
  Turn(client, TURN3);

  // Point 4 to Point 5
  Move(client, MOVE4, ANGLE4);

  // Shutdown and tidy up
  playerc_position2d_unsubscribe(position2d);
  playerc_position2d_destroy(position2d);
  playerc_client_disconnect(client);
  playerc_client_destroy(client);

  return 0;
}
Пример #3
0
// Update a actarray device
void actarray_update(actarray_t *actarray)
{
  int ii;
  // Update the device subscription
  if (rtk_menuitem_ischecked(actarray->subscribe_item))
  {
    if (!actarray->proxy->info.subscribed)
    {
      if (playerc_actarray_subscribe(actarray->proxy, PLAYER_OPEN_MODE) != 0)
        PRINT_ERR1("libplayerc error: %s", playerc_error_str());
      playerc_actarray_get_geom(actarray->proxy);
    }
  }
  else
  {
    if (actarray->proxy->info.subscribed)
      if (playerc_actarray_unsubscribe(actarray->proxy) != 0)
        PRINT_ERR1("libplayerc error: %s", playerc_error_str());
  }
  rtk_menuitem_check(actarray->subscribe_item, actarray->proxy->info.subscribed);

  // Draw in the actarray scan if it has been changed.
  if (actarray->proxy->info.subscribed)
  {
    if (actarray->proxy->info.datatime != actarray->datatime)
      actarray_draw(actarray);
    actarray->datatime = actarray->proxy->info.datatime;
  }
  else
  {
    for (ii = 0; ii < actarray->fig_count; ++ii)
    {
      rtk_fig_show(actarray->actuator_fig[ii], 0);
    }
  }

  // Move the actarray
  if (actarray->proxy->info.subscribed && rtk_menuitem_ischecked(actarray->command_item))
  {
    for (ii = 0; ii < actarray->fig_count; ++ii)
    {
      rtk_fig_show(actarray->actuator_fig_cmd[ii], 1);
    }
    actarray_move(actarray);
  }
  else
  {
    for (ii = 0; ii < actarray->fig_count; ++ii)
    {
      rtk_fig_show(actarray->actuator_fig_cmd[ii], 0);
    }
  }
}
Пример #4
0
int main(int argc, const char **argv)
{
    double dist, speed;
    playerc_client_t *client;
    playerc_position2d_t *position2d;

    // Create a client object and connect to the server; the server must
    // be running on "localhost" at port 6665
    client = playerc_client_create(NULL, "gort", 9876);
    if (playerc_client_connect(client) != 0)
    {
        fprintf(stderr, "error: %s\n", playerc_error_str());
        return -1;
    }

    // Create a position2d proxy (device id "position2d:0") and susbscribe
    // in read/write mode
    position2d = playerc_position2d_create(client, 0);
    if (playerc_position2d_subscribe(position2d, PLAYERC_OPEN_MODE) != 0)
    {
        fprintf(stderr, "error: %s\n", playerc_error_str());
        return -1;
    }

    // Enable the robots motors
    playerc_position2d_enable(position2d, 1);

    // Start the robot moving
    dist = 0;
    speed = 1;
    playerc_position2d_set_cmd_vel(position2d, speed, 0, 0, 1);
    while( dist <= 3.048 ) {
        // Read data from the server and display current robot position
        playerc_client_read(client);
        printf("position : %f %f %f\n", position2d->px, position2d->py, position2d->pa);
        dist = position2d->px;
        if(dist > 2.6 && speed > .01) {
            playerc_position2d_set_cmd_vel(position2d, (speed /= 2), 0, 0, 1);
        }
    }

    //stop the robot
    playerc_position2d_set_cmd_vel(position2d, 0, 0, 0, 1);

    // Shutdown and tidy up
    playerc_position2d_unsubscribe(position2d);
    playerc_position2d_destroy(position2d);
    playerc_client_disconnect(client);
    playerc_client_destroy(client);

    return 0;
}
Пример #5
0
// Update a map device
void map_update(map_t *map)
{
  // Update the device subscription
  if (rtk_menuitem_ischecked(map->subscribe_item))
  {
    if (!map->proxy->info.subscribed)
    {
      if (playerc_map_subscribe(map->proxy, PLAYER_OPEN_MODE) != 0)
        PRINT_ERR1("libplayerc error: %s", playerc_error_str());
      // download a map
      if (playerc_map_get_map( map->proxy ) >= 0)
        map_draw( map );
    }
  }
  else
  {
    if (map->proxy->info.subscribed)
      if (playerc_map_unsubscribe(map->proxy) != 0)
        PRINT_ERR1("libplayerc error: %s", playerc_error_str());
  }
  rtk_menuitem_check(map->subscribe_item, map->proxy->info.subscribed);

  if (map->proxy->info.subscribed)
  {
    if(rtk_menuitem_ischecked(map->continuous_item))
    {
			static struct timeval old_time = {0,0};
			struct timeval time;
			double time_diff = 0.0;
			gettimeofday(&time, NULL);
			// i don't use (map->proxy->info.datatime != map->datatime))
			// because some drivers return strange datatimes
			// and the map may change to often for the current map format
			// in playerv.h you can adjust MAP_UPDATE_TIME (default 1 sec)
			time_diff = (double)(time.tv_sec - old_time.tv_sec) +
				(double)(time.tv_usec - old_time.tv_usec)/1000000;
			if (time_diff > MAP_UPDATE_TIME)
			{
				playerc_map_get_map(map->proxy);
				map_draw(map);
				old_time = time;
			}
    }
  }
  else
  {
    // Dont draw the map.
    rtk_fig_show(map->fig, 0);
  }
}
Пример #6
0
// Update a laser device
void laser_update(laser_t *laser)
{
  // Update the device subscription
  if (rtk_menuitem_ischecked(laser->subscribe_item))
  {
    if (!laser->proxy->info.subscribed)
    {
      if (playerc_laser_subscribe(laser->proxy, PLAYER_OPEN_MODE) != 0)
        PRINT_ERR1("libplayerc error: %s", playerc_error_str());

      // Get the laser geometry
      if (playerc_laser_get_geom(laser->proxy) != 0)
        PRINT_ERR1("libplayerc error: %s", playerc_error_str());

      rtk_fig_origin(laser->scan_fig,
                     laser->proxy->pose[0],
                     laser->proxy->pose[1],
                     laser->proxy->pose[2]);

    }
  }
  else
  {
    if (laser->proxy->info.subscribed)
      if (playerc_laser_unsubscribe(laser->proxy) != 0)
        PRINT_ERR1("libplayerc error: %s", playerc_error_str());
  }
  rtk_menuitem_check(laser->subscribe_item, laser->proxy->info.subscribed);

  // Making config changes here causes X to go nuts.  Don't know why - BPG
  // Update the configuration stuff
  if (laser->proxy->info.subscribed)
    laser_update_config(laser);
  
  if (laser->proxy->info.subscribed)
  {
    // Draw in the laser scan if it has been changed.
    if (laser->proxy->info.datatime != laser->datatime)
    {
      laser_draw(laser);
      laser->datatime = laser->proxy->info.datatime;
    }
  }
  else
  {
    // Dont draw the laser.
    rtk_fig_show(laser->scan_fig, 0);
  }
}
Пример #7
0
// Set the robot pose (mean and covariance)
int playerc_localize_set_pose(playerc_localize_t *device, double pose[3], double cov[6])
{
  player_localize_set_pose_t req;

  req.mean.px = pose[0];
  req.mean.py = pose[1];
  req.mean.pa = pose[2];
  
  req.cov[0] = cov[0];
  req.cov[1] = cov[1];
  req.cov[2] = cov[2];
  req.cov[3] = cov[3];
  req.cov[4] = cov[4];
  req.cov[5] = cov[5];

  if(playerc_client_request(device->info.client, 
                            &device->info,
                            PLAYER_LOCALIZE_REQ_SET_POSE,
                            &req, NULL) < 0)
  {
    PLAYERC_WARN1("%s\n", playerc_error_str());
    return -1;
  }

  return 0;
}
Пример #8
0
// Move the actarray
void actarray_move(actarray_t *actarray)
{
  double ox, oy, oa, min, max;
  double value;

  int ii;
  for(ii = 0; ii < actarray->fig_count; ++ii)
  {
    rtk_fig_get_origin(actarray->actuator_fig_cmd[ii], &ox, &oy, &oa);
    value = oy;

    min = -1;
    max = 1;
    if (actarray->proxy->actuators_geom && actarray->proxy->actuators_geom_count == actarray->proxy->actuators_count)
    {
      min = actarray->proxy->actuators_geom[ii].min;
      max = actarray->proxy->actuators_geom[ii].max;
    }
    // now limit and scale the value to the actuator bar
    value = ((oy+1)/2)*(max-min)+min;
    if (value > max) value = max;
    if (value < min) value = min;

    if (actarray->lastvalue[ii] != value)
    {
      if (playerc_actarray_position_cmd(actarray->proxy, ii, value) != 0)
        PRINT_ERR1("libplayerc error: %s", playerc_error_str());
      actarray->lastvalue[ii] = value;
    }
  }
}
Пример #9
0
// Update an ir device
void ir_update(ir_t *ir)
{
  int i;

  // Update the device subscription
  if (rtk_menuitem_ischecked(ir->subscribe_item))
  {
    if (!ir->proxy->info.subscribed)
    {
      if (playerc_ir_subscribe(ir->proxy, PLAYER_OPEN_MODE) != 0)
        PRINT_ERR1("subscribe failed : %s", playerc_error_str());

      // Get the ir geometry
      if (playerc_ir_get_geom(ir->proxy) != 0)
        PRINT_ERR1("get_geom failed : %s", playerc_error_str());

      ir_allocate_figures(ir, ir->proxy->poses.poses_count);
      for (i = 0; i < ir->proxy->poses.poses_count; i++)
	  {
        rtk_fig_origin(ir->scan_fig[i],
                       ir->proxy->poses.poses[i].px,
                       ir->proxy->poses.poses[i].py,
                       ir->proxy->poses.poses[i].pyaw);
	  }
    }
  }
  else
  {
    if (ir->proxy->info.subscribed)
      if (playerc_ir_unsubscribe(ir->proxy) != 0)
        PRINT_ERR1("unsubscribe failed : %s", playerc_error_str());
  }
  rtk_menuitem_check(ir->subscribe_item, ir->proxy->info.subscribed);

  if (ir->proxy->info.subscribed)
  {
    // Draw in the ir scan if it has been changed.
    if (ir->proxy->info.datatime != ir->datatime)
      ir_draw(ir);
    ir->datatime = ir->proxy->info.datatime;
  }
  else
  {
    // Dont draw the ir.
    ir_nodraw(ir);
  }
}
Пример #10
0
int main(int argc, const char **argv)
{
  int i;
  playerc_client_t *client;
  playerc_position2d_t *position2d;

  // Create a client object and connect to the server; the server must
  // be running on "localhost" at port 6665
  client = playerc_client_create(NULL, "localhost", 6665);
  if (playerc_client_connect(client) != 0)
  {
    fprintf(stderr, "error: %s\n", playerc_error_str());
    return -1;
  }

  // Create a position2d proxy (device id "position2d:0") and susbscribe
  // in read/write mode
  position2d = playerc_position2d_create(client, 0);
  if (playerc_position2d_subscribe(position2d, PLAYERC_OPEN_MODE) != 0)
  {
    fprintf(stderr, "error: %s\n", playerc_error_str());
    return -1;
  }

  // Enable the robots motors
  playerc_position2d_enable(position2d, 1);

  // Start the robot turning slowing
  playerc_position2d_set_cmd_vel(position2d, 0, 0, 0.1, 1);

  for (i = 0; i < 200; i++)
  {
    // Read data from the server and display current robot position
    playerc_client_read(client);
    printf("position : %f %f %f\n",
           position2d->px, position2d->py, position2d->pa);
  } 

  // Shutdown and tidy up
  playerc_position2d_unsubscribe(position2d);
  playerc_position2d_destroy(position2d);
  playerc_client_disconnect(client);
  playerc_client_destroy(client);

  return 0;
}
Пример #11
0
// Update a ptz device
void ptz_update(ptz_t *ptz)
{
  // Update the device subscription
  if (rtk_menuitem_ischecked(ptz->subscribe_item))
  {
    if (!ptz->proxy->info.subscribed)
      if (playerc_ptz_subscribe(ptz->proxy, PLAYER_OPEN_MODE) != 0)
        PRINT_ERR1("libplayerc error: %s", playerc_error_str());
  }
  else
  {
    if (ptz->proxy->info.subscribed)
      if (playerc_ptz_unsubscribe(ptz->proxy) != 0)
        PRINT_ERR1("libplayerc error: %s", playerc_error_str());
  }
  rtk_menuitem_check(ptz->subscribe_item, ptz->proxy->info.subscribed);

  // Draw in the ptz scan if it has been changed.
  if (ptz->proxy->info.subscribed)
  {
    if (ptz->proxy->info.datatime != ptz->datatime)
      ptz_draw(ptz);
    ptz->datatime = ptz->proxy->info.datatime;
  }
  else
  {
    rtk_fig_show(ptz->data_fig, 0);
    rtk_fig_show(ptz->data_fig_tilt, 0);

  }

  // Move the ptz
  if (ptz->proxy->info.subscribed && rtk_menuitem_ischecked(ptz->command_item))
  {
    rtk_fig_show(ptz->cmd_fig, 1);
    rtk_fig_show(ptz->cmd_fig_tilt, 1);
    ptz_move(ptz);
  }
  else
  {
    rtk_fig_show(ptz->cmd_fig, 0);
    rtk_fig_show(ptz->cmd_fig_tilt, 0);
  }
}
Пример #12
0
// Move the ptz
void ptz_move(ptz_t *ptz)
{
  double ox, oy, oa, oxt, oyt, oat;
  double pan, tilt, zoom, speed;
    
  rtk_fig_get_origin(ptz->cmd_fig, &ox, &oy, &oa);
  rtk_fig_get_origin(ptz->cmd_fig_tilt, &oxt, &oyt, &oat);

  pan = atan2(oy, ox);
  tilt = atan2(oyt,oxt);
  zoom = 2 * atan2(0.5, sqrt(ox * ox + oy * oy));
  speed = sqrt(oy*oy + ox*ox);

  if (playerc_ptz_set_ws(ptz->proxy, pan, tilt, zoom,speed,0) != 0)
    PRINT_ERR1("libplayerc error: %s", playerc_error_str());
}
Пример #13
0
// Create a ptz device
ptz_t *ptz_create(mainwnd_t *mainwnd, opt_t *opt, playerc_client_t *client,
                  int index, const char *drivername, int subscribe)
{
  char section[64];
  char label[64];
  ptz_t *ptz;
  
  ptz = malloc(sizeof(ptz_t));
  ptz->datatime = 0;
  ptz->drivername = strdup(drivername);
  ptz->proxy = playerc_ptz_create(client, index);

  // Set initial device state
  snprintf(section, sizeof(section), "ptz:%d", index);
  if (subscribe)
  {
    if (playerc_ptz_subscribe(ptz->proxy, PLAYER_OPEN_MODE) != 0)
      PRINT_ERR1("libplayerc error: %s", playerc_error_str());
  }

  // Construct the menu
  snprintf(label, sizeof(label), "ptz:%d (%s)", index, ptz->drivername);
  ptz->menu = rtk_menu_create_sub(mainwnd->device_menu, label);
  ptz->subscribe_item = rtk_menuitem_create(ptz->menu, "Subscribe", 1);
  ptz->command_item = rtk_menuitem_create(ptz->menu, "Command", 1);
  
  // Set the initial menu state
  rtk_menuitem_check(ptz->subscribe_item, ptz->proxy->info.subscribed);

  // Construct figures
  ptz->data_fig = rtk_fig_create(mainwnd->canvas, mainwnd->robot_fig, 10);
  ptz->cmd_fig = rtk_fig_create(mainwnd->canvas, mainwnd->robot_fig, 11);
  ptz->data_fig_tilt = rtk_fig_create(mainwnd->canvas, mainwnd->robot_fig, 12);
  ptz->cmd_fig_tilt = rtk_fig_create(mainwnd->canvas, mainwnd->robot_fig, 13);
  rtk_fig_movemask(ptz->cmd_fig, RTK_MOVE_TRANS);
  rtk_fig_origin(ptz->cmd_fig, 1, 0, 0);
  rtk_fig_color_rgb32(ptz->cmd_fig, COLOR_PTZ_CMD);
  rtk_fig_ellipse(ptz->cmd_fig, 0, 0, 0, 0.2, 0.2, 0);
  
  rtk_fig_movemask(ptz->cmd_fig_tilt, RTK_MOVE_TRANS);
  rtk_fig_origin(ptz->cmd_fig_tilt, 0.8, 0, 0);
  rtk_fig_color_rgb32(ptz->cmd_fig_tilt, COLOR_PTZ_CMD_TILT);
  rtk_fig_ellipse(ptz->cmd_fig_tilt, 0, 0, 0, 0.2, 0.2, 0);
  
  
  return ptz;
}
Пример #14
0
// Create a actarray device
actarray_t *actarray_create(mainwnd_t *mainwnd, opt_t *opt, playerc_client_t *client,
                  int index, const char *drivername, int subscribe)
{
  char section[64];
  char label[64];
  actarray_t *actarray;
  
  actarray = malloc(sizeof(actarray_t));
  actarray->datatime = 0;
  actarray->drivername = strdup(drivername);
  actarray->proxy = playerc_actarray_create(client, index);

  // Set initial device state
  snprintf(section, sizeof(section), "actarray:%d", index);
  if (subscribe)
  {
    if (playerc_actarray_subscribe(actarray->proxy, PLAYER_OPEN_MODE) != 0)
      PRINT_ERR1("libplayerc error: %s", playerc_error_str());
    playerc_actarray_get_geom(actarray->proxy);
  }

  // Construct the menu
  snprintf(label, sizeof(label), "actarray:%d (%s)", index, actarray->drivername);
  actarray->menu = rtk_menu_create_sub(mainwnd->device_menu, label);
  actarray->subscribe_item = rtk_menuitem_create(actarray->menu, "Subscribe", 1);
  actarray->command_item = rtk_menuitem_create(actarray->menu, "Command", 1);
  
  // Set the initial menu state
  rtk_menuitem_check(actarray->subscribe_item, actarray->proxy->info.subscribed);

  // Construct figures
  actarray->actuator_fig = NULL;
  actarray->actuator_fig_cmd = NULL;
  actarray->lastvalue = NULL;
  actarray->mainwnd = mainwnd;
  
  return actarray;
}
Пример #15
0
// Main
int main(int argc, char **argv)
{
  playerc_client_t *client;
  rtk_app_t *app;
  mainwnd_t *mainwnd;
  opt_t *opt;
  const char *host;
  int port;
  int i;
  int count;
  double rate;
  char section[256];
  int device_count;
  device_t devices[PLAYER_MAX_DEVICES];
  device_t *device;
  struct timeval tv, tc = {0, 0};
  struct timespec st = {0, (1.0/GUI_UPDATE_RATE) * 1e9};

  printf("PlayerViewer %s\n", PLAYER_VERSION);

  // Initialise rtk lib (after we have read the program options we
  // want).
  rtk_init(&argc, &argv);

  // Register signal handlers
  signal(SIGINT, sig_quit);
  signal(SIGQUIT, sig_quit);

  // Load program options
  opt = opt_init(argc, argv, NULL);
  if (!opt)
  {
    print_usage();
    return -1;
  }

  // Pick out some important program options
  host = opt_get_string(opt, "", "host", NULL);
  if (!host)
    host = opt_get_string(opt, "", "h", "localhost");

  port = opt_get_int(opt, "", "port", -1);
  if (port < 0)
    port = opt_get_int(opt, "", "p", 6665);

  rate = opt_get_double(opt, "", "rate", 5.0);
  if(rate < 0.0)
    rate = 0.0;

  // Connect to the server
  printf("Connecting to [%s:%d]\n", host, port);
  client = playerc_client_create(NULL, host, port);
  if (playerc_client_connect(client) != 0)
  {
    PRINT_ERR1("%s", playerc_error_str());
    print_usage();
    return -1;
  }

  if(rate == 0.0)
  {
    printf("Setting delivery mode to PLAYER_DATAMODE_PUSH\n");
    // Change the server's data delivery mode.
    if (playerc_client_set_replace_rule(client, -1, -1, -1, -1, 0) != 0)
    {
      PRINT_ERR1("%s", playerc_error_str());
      return -1;
    }

    // Change the server's data delivery mode.
    // PLAYERC_DATAMODE_PUSH, PLAYERC_DATAMODE_PULL
    if (playerc_client_datamode(client, PLAYERC_DATAMODE_PUSH) != 0)
    {
      PRINT_ERR1("%s", playerc_error_str());
      return -1;
    }
  }

  // Get the available devices.
  if (playerc_client_get_devlist(client) != 0)
  {
    PRINT_ERR1("%s", playerc_error_str());
    return -1;
  }

  // Create gui
  app = rtk_app_create();

  // Create a window for most of the sensor data
  mainwnd = mainwnd_create(app, host, port);
  if (!mainwnd)
    return -1;

  // Create a list of available devices, with their gui proxies.
  device_count = 0;
  for (i = 0; i < client->devinfo_count; i++)
  {
    device = devices + device_count;

    device->addr = client->devinfos[i].addr;
    device->drivername = strdup(client->devinfos[i].drivername);

    // See if the device should be subscribed immediately.
    snprintf(section, sizeof(section), "%s:%d",
             interf_to_str(device->addr.interf), device->addr.index);
    device->subscribe = opt_get_int(opt, section, "", 0);
    device->subscribe = opt_get_int(opt, section, "subscribe", device->subscribe);
    if (device->addr.index == 0)
    {
      snprintf(section, sizeof(section), "%s",
               interf_to_str(device->addr.interf));
      device->subscribe = opt_get_int(opt, section, "", device->subscribe);
      device->subscribe = opt_get_int(opt, section, "subscribe", device->subscribe);
    }

    // Allow for --position instead of --position2d
    if(device->addr.interf == PLAYER_POSITION2D_CODE)
    {
      snprintf(section, sizeof(section), "%s:%d",
               PLAYER_POSITION2D_STRING, device->addr.index);
      device->subscribe = opt_get_int(opt, section, "", device->subscribe);
      device->subscribe = opt_get_int(opt, section, "subscribe", device->subscribe);
      if (device->addr.index == 0)
      {
        snprintf(section, sizeof(section), "%s", PLAYER_POSITION2D_STRING);
        device->subscribe = opt_get_int(opt, section, "", device->subscribe);
        device->subscribe = opt_get_int(opt, section, "subscribe", device->subscribe);
      }
    }

    // Create the GUI proxy for this device.
    create_proxy(device, opt, mainwnd, client);

    device_count++;
  }

  // Print the list of available devices.
  printf("Available devices: %s:%d\n", host, port);
  for (i = 0; i < device_count; i++)
  {
    device = devices + i;
    snprintf(section, sizeof(section), "%s:%d",
             interf_to_str(device->addr.interf), device->addr.index);
    printf("%-16s %-40s", section, device->drivername);
    if (device->proxy)
    {
      if (device->subscribe)
        printf("subscribed");
      else
        printf("ready");
    }
    else
      printf("unsupported");
    printf("\n");
  }

  // Print out a list of unused options.
  opt_warn_unused(opt);

  // Start the gui; dont run in a separate thread and dont let it do
  // its own updates.
  rtk_app_main_init(app);

  // start out timer if in pull mode
  if(rate > 0.0)
    gettimeofday(&tv, NULL);

  while (!quit)
  {
    // Let gui process messages
    rtk_app_main_loop(app);

    if(rate == 0.0)  // if we're in push mode
    {
      // see if there's data
      count = playerc_client_peek(client, 50);
      if (count < 0)
      {
        PRINT_ERR1("%s", playerc_error_str());
        break;
      }
      if (count > 0)
      {
        /*proxy = */playerc_client_read_nonblock(client);
      }
    }
    else // we're in pull mode
    {
      // we only want to request new data at the target rate
      gettimeofday(&tc, NULL);
      if(((tc.tv_sec - tv.tv_sec) + (tc.tv_usec - tv.tv_usec)/1e6) > 1.0/rate)
      {
        tv = tc;
        // this requests a round of data from the server to be read
        playerc_client_requestdata(client);
        playerc_client_read_nonblock(client);
       }
       else
       {
        // sleep for the minimum time we can, so we don't use up too much
        // processor
        nanosleep(&st, NULL);
       }
    }


    // Update the devices
    for (i = 0; i < device_count; i++)
    {
      device = devices + i;
      if(device->proxy)
        (*(device->fnupdate)) (device->proxy);
    }
    // Update the main window
    if (mainwnd_update(mainwnd) != 0)
      break;
  }

  // Stop the gui
  rtk_app_main_term(app);

  // Destroy devices
  for (i = 0; i < device_count; i++)
  {
    device = devices + i;
    if (device->proxy)
      (*(device->fndestroy)) (device->proxy);
    free(device->drivername);
  }

  // Disconnect from server
  if (playerc_client_disconnect(client) != 0)
  {
    PRINT_ERR1("%s", playerc_error_str());
    return -1;
  }
  playerc_client_destroy(client);

  // For some reason, either of the following calls makes the program
  // segfault on exit.  I haven't figured out why, so I'm commenting them out.  - BPG

  // Destroy the windows
  //mainwnd_destroy(mainwnd);

  // Destroy the gui
  //rtk_app_destroy(app);

  opt_term(opt);

  return 0;
}
Пример #16
0
int main(int argc, const char **argv)
{
    //Variaveis
    int degrees,PosRelX,PosRelY;
    float radians,Dlaser,ODM_ang, ang;
    int width = 500, height = 500; //Coloque o tamanho do mapa aqui (em pixel)
    int centroX = (width / 2);
    int centroY = (height / 2);
    playerc_client_t *client;
    playerc_laser_t *laser;
    playerc_position2d_t *position2d;
    CvPoint pt,pt1,pt2;
    CvScalar cinzaE,preto,cinzaC;
    char window_name[] = "Mapa";

    IplImage* image = cvCreateImage( cvSize(width,height), 8, 3 );
    cvNamedWindow(window_name, 1 );
    preto = CV_RGB(0, 0, 0);        //Para indicar obstaculos
    cinzaE = CV_RGB(92, 92, 92);    //Para indicar o desconhecido
    cinzaC = CV_RGB(150, 150, 150); //Para indicar espacos livres
printf ("debug: 11 - INICIO\n");
    client = playerc_client_create(NULL, "localhost", 6665);
printf ("debug: 12\n");
    if (playerc_client_connect(client) != 0)
    return -1;
printf ("debug: 13\n");
    laser = playerc_laser_create(client, 0);
printf ("debug: 21\n");
    if (playerc_laser_subscribe(laser, PLAYERC_OPEN_MODE))
    return -1;
printf ("debug: 22\n");

    position2d = playerc_position2d_create(client, 0);
    if (playerc_position2d_subscribe(position2d, PLAYERC_OPEN_MODE) != 0) {
        printf ("err1\n");
        fprintf(stderr, "error: %s\n", playerc_error_str());
        return -1;
    }
    
printf ("debug: 23\n");
    if (playerc_client_datamode (client, PLAYERC_DATAMODE_PULL) != 0) {
        printf ("err2\n");
        fprintf(stderr, "error: %s\n", playerc_error_str());
        return -1;
    }
printf ("debug: 24\n");
    if (playerc_client_set_replace_rule (client, -1, -1, PLAYER_MSGTYPE_DATA, -1, 1) != 0) {
        printf ("err3\n");
        fprintf(stderr, "error: %s\n", playerc_error_str());
        return -1;
    }
    

    playerc_position2d_enable(position2d, 1);  // Liga os motores
printf ("debug: 25\n");    
    playerc_position2d_set_odom(position2d, 0, 0, 0);  // Zera o odômetro

    cvSet(image, cinzaE,0); //Preencha a imagem com fundo cinza escuro
    pt.x = centroX;  // Zera a coordenada X
    pt.y = centroY;  // Zera a coordenada Y

/*
    if( 0 != playerc_position2d_set_cmd_vel(position2d, 0, 0, DTOR(40.0), 1))
        return -1;
  */  
    
    while(1) {
printf ("debug: 26\n");
        playerc_client_read(client);
printf ("debug: 27\n");
        //cvSaveImage("mapa1.jpg",image,0);
printf ("debug: 28\n");        
        //playerc_client_read(client);
printf ("debug: 29\n");
        for (degrees = 2; degrees <= 360; degrees+=2) {
printf ("debug: 30\n");              
            Dlaser = laser->scan[degrees][0];
printf ("debug: 31\n");              
            if (Dlaser < 8) {
                radians = graus2rad (degrees/2);      //Converte o angulo do laser em graus para radianos
printf ("debug: 32\n");                              
                ODM_ang = position2d->pa;             //Obtem o angulo relativo do robo
                ang = ((1.5*PI)+radians+ODM_ang);     //Converte o angulo relativo em global
printf ("debug: 33\n");
                PosRelX = arredonda(position2d->px);  //Posicao X relativa do robo
                PosRelY = arredonda(position2d->py);  //Posicao Y relativa do robo
printf ("debug: 34\n");
                pt1.y = (centroY-PosRelY);            //Coordenada y global do robo
                pt1.x = (centroX+PosRelX);            //Coordenada x global do robo

                //converte coordenadas polares para retangulares (global)
printf ("debug: 35\n");
                pt.y = (int)(pt1.y-(sin(ang)*Dlaser*10));
                pt.x = (int)(pt1.x+(cos(ang)*Dlaser*10));

printf ("debug: 36\n");
                //Desenha a area livre
                cvLine(image, pt1,pt,cinzaC, 1,4,0);

printf ("debug: 37\n");
                //Marca o objeto no mapa
                cvLine(image, pt,pt,preto, 1,4,0);
printf ("debug: 38\n");
                //Mostra o resultado do mapeamento na tela
                //cvShowImage(window_name, image );
printf ("debug: 39\n");
                //cvWaitKey(10);
printf ("debug: 40\n");
            }
        }
    }

    //Desconecta o player
printf ("debug: 41\n");
    playerc_laser_unsubscribe(laser);
printf ("debug: 42\n");
    playerc_laser_destroy(laser);
printf ("debug: 43\n");
    playerc_client_disconnect(client);
printf ("debug: 44\n");
    playerc_client_destroy(client);
printf ("debug: 45\n");

    //Destroi a janela OpenCV
    cvReleaseImage(&image);
printf ("debug: 46\n");
    cvDestroyWindow(window_name);
printf ("debug: 47\n");
    return 0;
}
Пример #17
0
int main(int argc, const char **argv) {
    int i;
    int porta = 6665;
    double x, y;
    char livre;
    char end_ip[20];

    // OpenCV Variables  
    char wndname[30] = "Drawing Demo";
    int line_type = CV_AA; // change it to 8 to see non-antialiased graphics
    CvPoint pt1, pt2;
    IplImage* image;
    int width = MAX_X, height = MAX_Y; // 200 x 100 pixels 

    // Player-Stage Variables
    playerc_client_t *client;
    playerc_position2d_t *position2d;
    playerc_laser_t *laser;

    // Create a window
    image = cvCreateImage(cvSize(width, height), 8, 3);
    cvNamedWindow(wndname, 1);
    cvZero(image);
    pt1.x = 100;
    pt1.y = MAX_Y;
    pt2.x = 100;
    pt2.y = MAX_Y - 80;
    cvLine(image, pt1, pt2, CV_RGB(255, 255, 255), 2, line_type, 0);
    pt2.x = 20;
    pt2.y = MAX_Y;
    cvLine(image, pt1, pt2, CV_RGB(255, 255, 255), 2, line_type, 0);
    pt2.x = 180;
    pt2.y = MAX_Y;
    cvLine(image, pt1, pt2, CV_RGB(255, 255, 255), 2, line_type, 0);
    cvShowImage(wndname, image);
    cvWaitKey(1000);

    cvZero(image);
    pt1.x = 20;
    pt1.y = MAX_Y;
    pt2.x = 160;
    pt2.y = MAX_Y - 80;
    cvRectangle(image, pt1, pt2, CV_RGB(255, 255, 255), 2, line_type, 0);
    cvShowImage(wndname, image);
    cvWaitKey(1000);

    strcpy(end_ip, "localhost");

    if (argc >= 2) /* Get Port */
        porta = atoi(argv[1]);
    if (argc >= 3) /* Get IP Address */
        strcpy(end_ip, argv[2]);

    printf("Porta: %d\n", porta);
    printf("IP: %s\n", end_ip);

    client = playerc_client_create(NULL, end_ip, porta);
    if (playerc_client_connect(client) != 0)
        return -1;

    // Connect to Position
    position2d = playerc_position2d_create(client, 0);
    if (playerc_position2d_subscribe(position2d, PLAYERC_OPEN_MODE) != 0) {
        fprintf(stderr, "error: %s\n", playerc_error_str());
        return -1;
    }

    // Enable motor control
    playerc_position2d_enable(position2d, 1);

    // Connect to Laser
    laser = playerc_laser_create(client, 0);
    if (playerc_laser_subscribe(laser, PLAYERC_OPEN_MODE))
        return -1;

    // Read several times the robot data (delay)
    playerc_client_read(client);
    playerc_client_read(client);
    playerc_client_read(client);
    playerc_client_read(client);
    playerc_client_read(client);

    while (1) {
        playerc_client_read(client);

        // scan for free 100 cm in front of robot
        livre = 1;
        cvZero(image);
        for (i = 0; i < 360; i++) {
            if ((laser->scan[i][0]) < 0.5)
                livre = 0;

            //  Debug: if (laser->scan[i][0] <= 0) printf("#");

            if (laser->scan[i][0] < 7.8) {
                x = laser->scan[i][0] * cos(laser->scan[i][1] + 3.1415926 / 2.0);
                y = laser->scan[i][0] * sin(laser->scan[i][1] + 3.1415926 / 2.0);

                pt1.x = (int) (x * 10 + 100);
                pt1.y = (int) (MAX_Y - y * 10);
                cvCircle(image, pt1, 2, CV_RGB(255, 255, 255), 1, line_type, 0);
            }
        }
        cvShowImage(wndname, image);

        // if free moves, otherwise turns
        if (livre)
            playerc_position2d_set_cmd_vel(position2d, 0.2, 0, 0.0, 1);
        else
            playerc_position2d_set_cmd_vel(position2d, 0.0, 0, 0.4, 1);

        cvWaitKey(10);
    }

    playerc_laser_unsubscribe(laser);
    playerc_laser_destroy(laser);
    playerc_client_disconnect(client);
    playerc_client_destroy(client);

    return 0;
}
Пример #18
0
// Update the laser configuration
void laser_update_config(laser_t *laser)
{
  int update;
  double min, max, range_res, res, scanning_frequency;
  unsigned char  intensity;
  
  min = laser->proxy->scan_start;
  max = laser->proxy->scan_start + laser->proxy->scan_count*laser->proxy->scan_res;
  range_res = laser->proxy->range_res;
  res = laser->proxy->scan_res;
  scanning_frequency = laser->proxy->scanning_frequency;
  intensity = laser->proxy->intensity_on;

  update = 0;
#if 0
  if (rtk_menuitem_isactivated(laser->res025_item))
  {
    res = 25; min = -50*M_PI/180; max = +50*M_PI/180; update = 1;
  }
  if (rtk_menuitem_isactivated(laser->res050_item))
  {
    res = 50; min = -M_PI/2; max = +M_PI/2; update = 1;
  }
  if (rtk_menuitem_isactivated(laser->res100_item))
  {
    res = 100; min = -M_PI/2; max = +M_PI/2; update = 1;
  }
#endif

  if (rtk_menuitem_isactivated(laser->range_mm_item)) {
    range_res = .001;
    update = 1;
  }
  if (rtk_menuitem_isactivated(laser->range_cm_item)) {
    range_res = .010;
    update = 1;
  }
  if (rtk_menuitem_isactivated(laser->range_dm_item)) {
    range_res = .100;
    update = 1;
  }

  // Set the laser configuration.
  if (update)
  {
    if (playerc_laser_set_config(laser->proxy, min, max, res, range_res,
				 intensity, scanning_frequency) != 0)
      PRINT_ERR1("libplayerc error: %s", playerc_error_str());
  }

#if 0
  res = (int) (laser->proxy->scan_res * 180 / M_PI * 100);
  rtk_menuitem_check(laser->res025_item, (res == 25));
  rtk_menuitem_check(laser->res050_item, (res == 50));
  rtk_menuitem_check(laser->res100_item, (res == 100));
#endif

  range_res = laser->proxy->range_res;
  rtk_menuitem_check(laser->range_mm_item, (range_res < .0011));
  rtk_menuitem_check(laser->range_cm_item, (.009 < range_res && range_res < .011));
  rtk_menuitem_check(laser->range_dm_item, (range_res > .090));


  return;
}  
Пример #19
0
int
player_init(int argc, char *argv[])
{
  int csize, usize, i;

  if(get_options(argc, argv) < 0)
  {
    print_usage();
    exit(-1);
  }

  // Create a g_client object and connect to the server; the server must
  // be running on "localhost" at port 6665
  g_client = playerc_client_create(NULL, g_hostname, g_port);
  playerc_client_set_transport(g_client, g_transport);
  if (0 != playerc_client_connect(g_client))
  {
    fprintf(stderr, "error: %s\n", playerc_error_str());
    exit(-1);
  }

/*  if (0 != playerc_client_datafreq(g_client, 20))
  {
    fprintf(stderr, "error: %s\n", playerc_error_str());
    return -1;
  }
*/

  // Create a camera proxy (device id "camera:index") and susbscribe
  g_camera = playerc_camera_create(g_client, g_camera_index);
  if (0 != playerc_camera_subscribe(g_camera, PLAYER_OPEN_MODE))
  {
    fprintf(stderr, "camera error: %s\n", playerc_error_str());
    fprintf(stderr, "playercam will attempt to continue without a camera\n");
    playerc_camera_destroy(g_camera);
    g_camera = NULL;
  }

  // Create a blobfinder proxy (device id "blobfinder:index") and susbscribe
  g_blobfinder = playerc_blobfinder_create(g_client, g_blobfinder_index);
  if (0 != playerc_blobfinder_subscribe(g_blobfinder, PLAYER_OPEN_MODE))
  {
    fprintf(stderr, "blobfinder error: %s\n", playerc_error_str());
    fprintf(stderr, "playercam will attempt to continue without a blobfinder\n");
    playerc_blobfinder_destroy(g_blobfinder);
    g_blobfinder = NULL;
  }

  if ((NULL == g_camera) && (NULL == g_blobfinder))
  {
    fprintf(stderr, "we need either a camera or blobfinder! aborting\n");
    exit(-1);
  }

  // Get up to 10 images until we have a valid frame (g_wdith > 0)
  for (i=0, g_width=0; i < 10 && g_width==0 && NULL != playerc_client_read(g_client); ++i)
  {
    if (NULL != g_camera)
    {
      // Decompress the image
      csize = g_camera->image_count;
      playerc_camera_decompress(g_camera);
      usize = g_camera->image_count;

      g_print("camera: [w %d h %d d %d] [%d/%d bytes]\n",
              g_camera->width, g_camera->height, g_camera->bpp, csize, usize);

      g_width  = g_camera->width;
      g_height = g_camera->height;
      if (allocated_size != usize)
      {
    	  g_img = realloc(g_img, usize);
        allocated_size = usize;
      }
    }
    else // try the blobfinder
    {
      g_print("blobfinder: [w %d h %d]\n",
              g_blobfinder->width, g_blobfinder->height);

      g_width  = g_blobfinder->width;
      g_height = g_blobfinder->height;
      usize = g_width * g_height * 3;
      if (allocated_size != usize)
      {
        g_img = realloc(g_img, usize);
        allocated_size = usize;
      }
      // set the image data to 0 since we don't have a camera
      memset(g_img, 128, usize);
    }
  }

  g_window_width  = g_width;
  g_window_height = g_height;

  assert(g_width>0);
  assert(g_height>0);

  playerc_client_datamode(g_client,PLAYER_DATAMODE_PULL);
  playerc_client_set_replace_rule(g_client,-1,-1,PLAYER_MSGTYPE_DATA,-1,1);

  return 0;
}
Пример #20
0
static gint playerout_open(AFormat fmt, gint rate, gint nch)
{
	gint pos;

	written = 0;
	afmt = fmt;
	sampleRate = rate;
	numChannels = nch;
	startTime = 0.0f;
	pausedTime = 0.0f;

	if (xmms_check_realtime_priority())
	{
		xmms_show_message("Error",
				  "You cannot use the Player Output plugin\n"
				    "when you're running in realtime mode.",
				  "Ok", FALSE, NULL, NULL);
		return 0;
	}

	/* do player server connection here */
	// Create a client object and connect to the server; the server must
	// be running on "localhost" at port 6665
	client = playerc_client_create(NULL, server_address, server_port);
	if (playerc_client_connect(client) != 0)
	{
		fprintf(stderr, "error: %s\n", playerc_error_str());
		client = NULL;
		return 0;
	}

	// Create a audio proxy susbscribe
	audio_proxy = playerc_audio_create(client, server_index);
	if (playerc_audio_subscribe(audio_proxy, PLAYERC_OPEN_MODE) != 0)
	{
		fprintf(stderr, "error: %s\n", playerc_error_str());
		return 0;
	}

	// Set to PULL data mode
	if (playerc_client_datamode (client, PLAYERC_DATAMODE_PULL) != 0)
	{
		fprintf(stderr, "error: %s\n", playerc_error_str());
		return 0;
	}
	if (playerc_client_set_replace_rule (client, -1, -1, PLAYER_MSGTYPE_DATA, -1, 1) != 0)
	{
		fprintf(stderr, "error: %s\n", playerc_error_str());
		return 0;
	}

	bytesPerSecond = rate * nch;
	if (fmt == FMT_S16_LE || fmt == FMT_S16_BE || fmt == FMT_S16_NE ||
		   fmt == FMT_U16_LE || fmt == FMT_U16_BE || fmt == FMT_U16_NE)
		bytesPerSecond *= 2;

	// Allocate a buffer
	bufferLength = (int) (((float) bufferTime / 1000.0f) * bytesPerSecond);
	if (buffer != NULL)
		free (buffer);
	buffer = malloc (bufferLength);
	bufferPos = 0;

	return 1;
}
Пример #21
0
int main(int argc, const char **argv)
{
  playerc_client_t *client;
  playerc_opaque_t *ringLEDs;
  playerc_opaque_t *frontLED;
  playerc_opaque_t *bodyLED;

  client = playerc_client_create(NULL, "localhost", 6665);
  if(playerc_client_connect(client) != 0)
  {
    fprintf(stderr, "error: %s\n", playerc_error_str());
    return -1;
  }
  ringLEDs = playerc_opaque_create(client, 0);
  if(playerc_opaque_subscribe(ringLEDs, PLAYERC_OPEN_MODE) != 0)
  {
    fprintf(stderr, "error: %s\n", playerc_error_str());
    return -1;
  }
  frontLED = playerc_opaque_create(client, 1);
  if(playerc_opaque_subscribe(frontLED, PLAYERC_OPEN_MODE) != 0)
  {
    fprintf(stderr, "error: %s\n", playerc_error_str());
    return -1;
  }
  bodyLED = playerc_opaque_create(client, 2);
  if(playerc_opaque_subscribe(bodyLED, PLAYERC_OPEN_MODE) != 0)
  {
    fprintf(stderr, "error: %s\n", playerc_error_str());
    return -1;
  }

  if(playerc_client_datamode(client, PLAYERC_DATAMODE_PULL) != 0)
  {
    fprintf(stderr, "error: %s\n", playerc_error_str());
    return -1;
  }
  if(playerc_client_set_replace_rule(client, -1, -1,
                                     PLAYER_MSGTYPE_DATA, -1, 1) != 0)
  {
    fprintf(stderr, "error: %s\n", playerc_error_str());
    return -1;
  }

  /* Turn on the ring LEDs 2 and 6, and the front and body LEDs. */
  player_opaque_data_t ringData, frontData, bodyData;
  ringData.data_count = 8;
  int led;
  for(led = 0; led < 8; led++)
  {
    ringData.data[led] = 0;
  }
  ringData.data[2] = 1;
  ringData.data[6] = 1;

  frontData.data_count = 1;
  frontData.data[0] = 1;

  bodyData.data_count = 1;
  bodyData.data[0] = 1;

  playerc_opaque_cmd(ringLEDs, &ringData);
  playerc_opaque_cmd(frontLED, &frontData);
  playerc_opaque_cmd(bodyLED, &bodyData);

  /* Without this sleep there will not be enough time for process all above  *
   * messages. If the camera interface is not in provides section of Player  *
   * configuration file, the time for e-puck initialization will be smaller, *
   * and consequently this sleep time will can be smaller.                   */
  usleep(3e6);

  /* Shutdown and tidy up */
  playerc_opaque_unsubscribe(ringLEDs);
  playerc_opaque_destroy(ringLEDs);
  playerc_opaque_unsubscribe(frontLED);
  playerc_opaque_destroy(frontLED);
  playerc_opaque_unsubscribe(bodyLED);
  playerc_opaque_destroy(bodyLED);
  playerc_client_disconnect(client);
  playerc_client_destroy(client);

  return 0;
}
Пример #22
0
int main(int argc, const char **argv)
{
    //Variables
    int degrees,PosRelX,PosRelY;
    float radians,Dlaser,ODM_ang, ang;
    int width = 500, height = 500; //Create the size of the map here (in pixel)
    int centroX = (width / 2);
    int centroY = (height / 2);
    playerc_client_t *client;
    playerc_laser_t *laser;
    playerc_position2d_t *position2d;
    CvPoint pt,pt1,pt2;
    CvScalar cinzaE,preto,cinzaC;
    char window_name[] = "Map";

    IplImage* image = cvCreateImage( cvSize(width,height), 8, 3 );
    cvNamedWindow(window_name, 1 );
    preto = CV_RGB(0, 0, 0);        //for indicating obstacles
    cinzaE = CV_RGB(92, 92, 92);    //To indicate the stranger
    cinzaC = CV_RGB(150, 150, 150); //To indicate free spaces

    client = playerc_client_create(NULL, "localhost", 6665);
    if (playerc_client_connect(client) != 0)
    return -1;

    laser = playerc_laser_create(client, 0);
    if (playerc_laser_subscribe(laser, PLAYERC_OPEN_MODE))
    return -1;

    position2d = playerc_position2d_create(client, 0);
    if (playerc_position2d_subscribe(position2d, PLAYERC_OPEN_MODE) != 0) {
        fprintf(stderr, "error: %s\n", playerc_error_str());
        return -1;
    }

    if (playerc_client_datamode (client, PLAYERC_DATAMODE_PULL) != 0) {
        fprintf(stderr, "error: %s\n", playerc_error_str());
        return -1;
    }

    if (playerc_client_set_replace_rule (client, -1, -1, PLAYER_MSGTYPE_DATA, -1, 1) != 0) {
        fprintf(stderr, "error: %s\n", playerc_error_str());
        return -1;
    }

    playerc_position2d_enable(position2d, 1);  // initialise motors
    playerc_position2d_set_odom(position2d, 0, 0, 0);  // Set odometer to zero

    cvSet(image, cinzaE,0); //set the image colour to dark
    pt.x = centroX;  // Zero coordinate for x
    pt.y = centroY;  // Zero coordinate for y


    while(1) {
        playerc_client_read(client);
        cvSaveImage("mapa.jpg",image);
        playerc_client_read(client);

        for (degrees = 2; degrees <= 360; degrees+=2) {
            Dlaser = laser->scan[degrees][0];
            if (Dlaser < 8) {
                radians = graus2rad (degrees/2);      //Convert the angle of the laser to radians
                ODM_ang = position2d->pa;             //Obtain the angle relative to the robot
                ang = ((1.5*PI)+radians+ODM_ang);     //Converte the angle relative to the world
                PosRelX = arredonda(position2d->px);  //Position x relative to robot
                PosRelY = arredonda(position2d->py);  //Position y relative to robot
                pt1.y = (centroY-PosRelY);            //Co-ordinated global y of the robot
                pt1.x = (centroX+PosRelX);            //Co-ordinated global x of the robot

 //t converts polar coordinates for rectangular (global)
                pt.y = (int)(pt1.y-(sin(ang)*Dlaser*10));
                pt.x = (int)(pt1.x+(cos(ang)*Dlaser*10));

                //The free area draws cvline
                cvLine(image, pt1,pt,cinzaC, 1,4,0);

                //marks the object in the map
                cvLine(image, pt,pt,preto, 1,4,0);

                //Shows the result of the map to the screen
                cvShowImage(window_name, image );
                cvWaitKey(10);
            }
        }
    }

    //Disconnect player
    playerc_laser_unsubscribe(laser);
    playerc_laser_destroy(laser);
    playerc_client_disconnect(client);
    playerc_client_destroy(client);

    //Destroy the OpenCV window cvReleaseImage
    cvReleaseImage(&image);
    cvDestroyWindow(window_name);
    return 0;
}
Пример #23
0
int main(int argc, const char **argv)
{
	double  actual_result_trans;
	double  actual_result_angle;
	int finished;
	playerc_client_t *client;
	playerc_position2d_t *position2d;
	playerc_bumper_t * bumper;
	
	// Create a client object and connect to the server
	client = playerc_client_create(NULL, SERVER, PORT);
	if (playerc_client_connect(client) != 0)
	{
		fprintf(stderr, "error: %s\n", playerc_error_str());
		return -1;
	}
	printf("Connected...");
	
	// Create a position2d proxy (device id "position2d:0") and susbscribe
	// in read/write mode
	position2d = playerc_position2d_create(client, 0);
	if (playerc_position2d_subscribe(position2d, PLAYERC_OPEN_MODE))
	{
		fprintf(stderr, "error: %s\n", playerc_error_str());
		return -1;
	}
	printf("Position2D Subscribed...");
	
	//Creates a Bumper Device Proxy
	bumper = playerc_bumper_create(client, 0);
	if(playerc_bumper_subscribe(bumper, PLAYERC_OPEN_MODE)) {
		fprintf(stderr, "error: %s\n", playerc_error_str());
		return -1;
	}
	printf("Bumper Subscribed...");
	
	// Enable the robots motors
	playerc_position2d_enable(position2d, 1);
	printf("Motor Enabled\n");
	

	
#ifdef ABSOLUTE_COORD
	//calls our move function to move to second point
	actual_result_trans = Move(client,position2d,bumper,3.2,0.0);
	printf("Results Returned from Move: %f\n",actual_result_trans);
	printPos(client,position2d,bumper);
	
	//rotates robot into position for third point
	actual_result_angle = Turn(client,position2d,bumper,(PI/2.0));
	printf("Results Returned from TurnL %f\n",actual_result_angle);
	printPos(client,position2d,bumper);
	
	//moves to third point from second point
	actual_result_trans = Move(client,position2d,bumper,3.2,3.04);
	printf("Results Returned from Move: %f\n",actual_result_trans);
	printPos(client,position2d,bumper);
	
	//rotates robot into position for the fourth point
	actual_result_angle = Turn(client,position2d,bumper,2.75741633);
	printf("Results Returned from TurnL %f\n",actual_result_angle);
	printPos(client,position2d,bumper);
	
	//moves to fouth point from third point
	actual_result_trans = Move(client,position2d,bumper,-0.5,4.7);
	printf("Results Returned from Move: %f\n",actual_result_trans);
	printPos(client,position2d,bumper);
	
	//rotates robot into position for point five
	actual_result_angle = Turn(client,position2d,bumper,(PI/2.0));
	printf("Results Returned from TurnL %f\n",actual_result_angle);
	printPos(client,position2d,bumper);
	
	//moves robot from position four to position five
	actual_result_trans = Move(client,position2d,bumper,-0.55,11.6);
	printf("Results Returned from Move: %f\n",actual_result_trans);
	printPos(client,position2d,bumper);
#else
	//calls our move function to move to second point
	actual_result_trans = Move(client,position2d,bumper,3.2,0.0);
	printf("Results Returned from Move: %f\n",actual_result_trans);
	printPos(client,position2d,bumper);
	
	//rotates robot into position for third point
	actual_result_angle = Turn(client,position2d,bumper,(PI/2.0));
	printf("Results Returned from TurnL %f\n",actual_result_angle);
	printPos(client,position2d,bumper);
	
	//moves to third point from second point
	actual_result_trans = Move(client,position2d,bumper,3.04,0.0);
	printf("Results Returned from Move: %f\n",actual_result_trans);
	printPos(client,position2d,bumper);
	
	//rotates robot into position for the fourth point
	actual_result_angle = Turn(client,position2d,bumper,1.18662);
	printf("Results Returned from TurnL %f\n",actual_result_angle);
	printPos(client,position2d,bumper);
	
	//moves to fouth point from third point
	actual_result_trans = Move(client,position2d,bumper,4.02,0.0);
	printf("Results Returned from Move: %f\n",actual_result_trans);
	printPos(client,position2d,bumper);
	
	//rotates robot into position for point five
	actual_result_angle = Turn(client,position2d,bumper,-1.18662);
	printf("Results Returned from TurnL %f\n",actual_result_angle);
	printPos(client,position2d,bumper);
	
	//moves robot from position four to position five
	actual_result_trans = Move(client,position2d,bumper,6.83,0.0);
	printf("Results Returned from Move: %f\n",actual_result_trans);
	printPos(client,position2d,bumper);
#endif
	
	// Shutdown and Unsubscribe Devices
	playerc_position2d_unsubscribe(position2d);
	playerc_position2d_destroy(position2d);
	playerc_bumper_unsubscribe(bumper);
	playerc_bumper_destroy(bumper);
	playerc_client_disconnect(client);
	playerc_client_destroy(client);
	
	return 0;
}
Пример #24
0
// Update a ranger device
void ranger_update(ranger_t *ranger)
{
  int ii;

  // Update the device subscription
  if (rtk_menuitem_ischecked(ranger->subscribe_item))
  {
    if (!ranger->proxy->info.subscribed)
    {
      if (playerc_ranger_subscribe(ranger->proxy, PLAYER_OPEN_MODE) != 0)
        PRINT_ERR1("libplayerc error: %s", playerc_error_str());

      // Get the ranger geometry
      if (playerc_ranger_get_geom(ranger->proxy) != 0)
        PRINT_ERR1("libplayerc error: %s", playerc_error_str());

      // Request the device config for min angle and resolution
      if (playerc_ranger_get_config(ranger->proxy, NULL, NULL, NULL, NULL, NULL, NULL) != 0)
      {
        PRINT_ERR1("libplayerc error: %s", playerc_error_str());
        ranger->start_angle = 0.0f;
        ranger->resolution = 0.0f;
      }
      else
      {
        ranger->start_angle = ranger->proxy->min_angle;
        ranger->resolution = ranger->proxy->resolution;
      }

      // Delete any current figures
      ranger_delete_figures(ranger);
      // Create the figures
      if ((ranger->scan_fig = malloc(ranger->proxy->sensor_count * sizeof(rtk_fig_t*))) == NULL )
      {
        PRINT_ERR1("Failed to allocate memory for %d figures to display ranger", ranger->proxy->sensor_count);
        return;
      }
      for (ii = 0; ii < ranger->proxy->sensor_count; ii++)
      {
        ranger->scan_fig[ii] = rtk_fig_create(ranger->mainwnd->canvas, ranger->mainwnd->robot_fig, 1);
        rtk_fig_origin(ranger->scan_fig[ii],
                       ranger->proxy->sensor_poses[ii].px,
                       ranger->proxy->sensor_poses[ii].py,
                       ranger->proxy->sensor_poses[ii].pyaw);
      }
    }
  }
  else
  {
    if (ranger->proxy->info.subscribed)
      if (playerc_ranger_unsubscribe(ranger->proxy) != 0)
        PRINT_ERR1("libplayerc error: %s", playerc_error_str());
    ranger_delete_figures(ranger);
  }
  rtk_menuitem_check(ranger->subscribe_item, ranger->proxy->info.subscribed);

  if (ranger->proxy->info.subscribed)
  {
    // Draw in the ranger scan if it has been changed
    if (ranger->proxy->info.datatime != ranger->datatime)
    {
      ranger_draw(ranger);
      ranger->datatime = ranger->proxy->info.datatime;
    }
  }
  else
  {
    // Dont draw the scan
    // This causes a segfault, because the ranger figures were already
    // deleted above.  I don't know whether commenting it out is the right
    // thing to do - BPG.
    /*
    for (ii = 0; ii < ranger->proxy->sensor_count; ii++)
      rtk_fig_show(ranger->scan_fig[ii], 0);
      */
  }
}
Пример #25
0
int main(int argc, const char **argv)
{
	int r, i, j;
	playerc_client_t *client;
	playerc_position2d_t *position2d;


	//sonar
	playerc_sonar_t *sonar;

	celda celdas[25];
	int actual=0;
	int forward=1;
	int no_solucion=0;
	int flag_celda_final=0;

	// Create a client and connect it to the server.
	client = playerc_client_create(NULL, "localhost", 6665);
	if (playerc_client_connect(client) != 0) {
		fprintf(stderr, "error: %s\n", playerc_error_str());
		return -1;
	}

	// Create and subscribe to a position2d device.
	position2d = playerc_position2d_create(client, 0);
	if (playerc_position2d_subscribe(position2d, PLAYER_OPEN_MODE) != 0) {
		fprintf(stderr, "error: %s\n", playerc_error_str());
		return -1;
	}
	// Fixing initial position
	playerc_position2d_set_odom(position2d, 0.0, 0.0, 0.0);

	// Create and subscribe to a sonar device
	sonar = playerc_sonar_create(client, 0);
	if (playerc_sonar_subscribe(sonar, PLAYER_OPEN_MODE) != 0) {
		fprintf(stderr, "error: %s\n", playerc_error_str());
		return -1;
	}
/* Obtener la geometría de los sensores de ultrasonidos sobre el pioneer 2 */
	if (playerc_sonar_get_geom(sonar) != 0) {
		fprintf(stderr, "error: %s\n", playerc_error_str());
		return -1;
	}

	// Enable motors 
	playerc_position2d_enable(position2d, 1);

	playerc_client_read(client);

	inspeccionar_celda(sonar,&celdas[actual]);

	//Rutina para asegurarse de que ni nos dejamos un camino atrás,
	//ni estamos ya en la salida:"Ponemos el culo contra la pared"
	
	if(celda_final(&celdas[actual])) {//Si no veo ninguna pared
		girar_dch(client,position2d); // giro para comprobar la espalda
		inspeccionar_celda(sonar,&celdas[actual]);
		if(celdas[actual].pared[D_DCH]) { // había pared detrás
	    		girar_izq(client,position2d); 
			//establecer orientación de referencia aquí
			theta = D_ARRIBA;
			inspeccionar_celda(sonar,&celdas[actual]);
		} else {
			printf("Ya estamos en la salida\n");
			flag_celda_final=1;
		}
	} else {
		// me pongo de espaldas a la pared
		if(celdas[actual].pared[D_DCH]) { //si tengo pared a la dcha
			girar_izq(client,position2d); 
		} else if(celdas[actual].pared[D_IZQ]) { //si tengo pared a la izda
			girar_dch(client,position2d);
		} else if(celdas[actual].pared[D_ARRIBA]) { //si la tengo en fente
			girar_180(client,position2d);
		}
		//establecer orientación de referencia aquí
		theta = D_ARRIBA;
		inspeccionar_celda(sonar,&celdas[actual]);
	}


	while(!(flag_celda_final || no_solucion)) {
		printf("celda: %d [%d,%d]\n",actual, x, y);
		r = mejor_ruta(celdas, actual, &forward);
		if (forward) {
			ir_direccion(client, position2d, r);
			actual++;
			inspeccionar_celda(sonar,&celdas[actual]);
		} else if (actual > 0) {
			ir_direccion(client, position2d, r);
			actual--;
		} else {
			no_solucion=1;
			printf("no hay solucion\n");
		}
		
		if ((flag_celda_final = celda_final(&celdas[actual])) != 0) {
			printf("Fuera del laberinto!!\n\n");
			printf("Camino:\n");
			printf("-------\n");
			for (i=0; i <= actual; i++) {
				for (j = 0; (j < 3) && (celdas[i].pared[j] != RUTA); j++) ;
				printf("(%d,%d) - %s\n", celdas[i].pos[0], celdas[i].pos[1], dirs[j]);
			}
		}
	}


	// Unsuscribe and Destroy
	// position2d
	playerc_position2d_unsubscribe(position2d);
	playerc_position2d_destroy(position2d);
	// sonar
	playerc_sonar_unsubscribe(sonar);
	playerc_sonar_destroy(sonar);



	// client
	playerc_client_disconnect(client);
	playerc_client_destroy(client);

	// End
	return 0;
}