Update of /cvsroot/playerstage/code/player/utils/playerv
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv22655/utils/playerv

Modified Files:
        Makefile.am dev_laser.c playerv.c playerv.h registry.c 
Added Files:
        dev_ranger.c 
Log Message:
added geoffs ranger interface


Index: registry.c
===================================================================
RCS file: /cvsroot/playerstage/code/player/utils/playerv/registry.c,v
retrieving revision 1.27
retrieving revision 1.28
diff -C2 -d -r1.27 -r1.28
*** registry.c  3 May 2006 12:29:12 -0000       1.27
--- registry.c  20 May 2007 00:30:15 -0000      1.28
***************
*** 101,104 ****
--- 101,113 ----
        break;
  
+     case PLAYER_RANGER_CODE:
+       device->proxy = ranger_create(mainwnd, opt, client,
+                                     device->addr.index,
+                                     device->drivername,
+                                     device->subscribe);
+       device->fndestroy = (fndestroy_t) ranger_destroy;
+       device->fnupdate = (fnupdate_t) ranger_update;
+       break;
+ 
      case PLAYER_SONAR_CODE:
        device->proxy = sonar_create(mainwnd, opt, client,

Index: playerv.h
===================================================================
RCS file: /cvsroot/playerstage/code/player/utils/playerv/playerv.h,v
retrieving revision 1.48
retrieving revision 1.49
diff -C2 -d -r1.48 -r1.49
*** playerv.h   31 Jan 2007 22:09:57 -0000      1.48
--- playerv.h   20 May 2007 00:30:15 -0000      1.49
***************
*** 230,233 ****
--- 230,234 ----
    rtk_menuitem_t *res025_item, *res050_item, *res100_item;
    rtk_menuitem_t *range_mm_item, *range_cm_item, *range_dm_item;
+   rtk_menuitem_t *style_item;
    // Figure for drawing the scan
    rtk_fig_t *scan_fig;
***************
*** 534,537 ****
--- 535,583 ----
  
  /***************************************************************************
+  * Ranger
+  ***************************************************************************/
+ 
+ // Ranger device info
+ typedef struct
+ {
+   // Driver name
+   char *drivername;
+ 
+   // Ranger device proxy
+   playerc_ranger_t *proxy;
+ 
+   // Timestamp on most recent data
+   double datatime;
+ 
+   // Menu stuff
+   rtk_menu_t *menu;
+   rtk_menuitem_t *subscribe_item;
+   rtk_menuitem_t *style_item;
+   rtk_menuitem_t *intns_item;
+   rtk_menuitem_t *device_item;
+   // Figure for drawing the scan
+   rtk_fig_t **scan_fig;
+   // Need to track this for creating figures
+   mainwnd_t *mainwnd;
+ 
+   // Properties from the device that may be necessary
+   double start_angle;
+   double resolution;
+ 
+ } ranger_t;
+ 
+ 
+ // Create a ranger device
+ ranger_t *ranger_create(mainwnd_t *mainwnd, opt_t *opt, playerc_client_t 
*client,
+                         int index,  const char *drivername, int subscribe);
+ 
+ // Destroy a ranger device
+ void ranger_destroy(ranger_t *ranger);
+ 
+ // Update a ranger device
+ void ranger_update(ranger_t *ranger);
+ 
+ 
+ /***************************************************************************
   * Blobfinder device
   ***************************************************************************/

Index: dev_laser.c
===================================================================
RCS file: /cvsroot/playerstage/code/player/utils/playerv/dev_laser.c,v
retrieving revision 1.26
retrieving revision 1.27
diff -C2 -d -r1.26 -r1.27
*** dev_laser.c 8 Oct 2005 02:38:34 -0000       1.26
--- dev_laser.c 20 May 2007 00:30:15 -0000      1.27
***************
*** 59,62 ****
--- 59,63 ----
    laser->menu = rtk_menu_create_sub(mainwnd->device_menu, label);
    laser->subscribe_item = rtk_menuitem_create(laser->menu, "Subscribe", 1);
+   laser->style_item = rtk_menuitem_create(laser->menu, "Filled", 1);
  #if 0
    laser->res025_item = rtk_menuitem_create(laser->menu, "0.25 deg 
resolution", 1);
***************
*** 71,74 ****
--- 72,76 ----
    // Set the initial menu state
    rtk_menuitem_check(laser->subscribe_item, subscribe);
+   rtk_menuitem_check(laser->style_item, 1);
  
    // Construct figures
***************
*** 97,100 ****
--- 99,103 ----
  #endif
    rtk_menuitem_destroy(laser->subscribe_item);
+   rtk_menuitem_destroy(laser->style_item);
    rtk_menu_destroy(laser->menu);
  
***************
*** 226,236 ****
    rtk_fig_clear(laser->scan_fig);
  
!   // TESTING (should use menu option)
!   if (laser->proxy->info.addr.index == 0)
!     style = 1;
!   else
!     style = 0;
! 
!   if (style == 0)
    {
      rtk_fig_color_rgb32(laser->scan_fig, COLOR_LASER_OCC);
--- 229,233 ----
    rtk_fig_clear(laser->scan_fig);
  
!   if (!rtk_menuitem_ischecked(laser->style_item))
    {
      rtk_fig_color_rgb32(laser->scan_fig, COLOR_LASER_OCC);
***************
*** 251,255 ****
      }
    }
!   else if (style == 1)
    {
      res = laser->proxy->scan_res / 2;
--- 248,252 ----
      }
    }
!   else
    {
      res = laser->proxy->scan_res / 2;

Index: playerv.c
===================================================================
RCS file: /cvsroot/playerstage/code/player/utils/playerv/playerv.c,v
retrieving revision 1.47
retrieving revision 1.48
diff -C2 -d -r1.47 -r1.48
*** playerv.c   19 Aug 2006 01:17:26 -0000      1.47
--- playerv.c   20 May 2007 00:30:15 -0000      1.48
***************
*** 88,91 ****
--- 88,92 ----
  - @ref interface_power
  - @ref interface_ptz
+ - @ref interface_ranger
  - @ref interface_sonar
  - @ref interface_wifi

Index: Makefile.am
===================================================================
RCS file: /cvsroot/playerstage/code/player/utils/playerv/Makefile.am,v
retrieving revision 1.42
retrieving revision 1.43
diff -C2 -d -r1.42 -r1.43
*** Makefile.am 3 May 2006 12:29:12 -0000       1.42
--- Makefile.am 20 May 2007 00:30:15 -0000      1.43
***************
*** 29,33 ****
                    dev_sonar.c \
                    dev_wifi.c \
!                   dev_gripper.c
  #dev_localize.c
  
--- 29,34 ----
                    dev_sonar.c \
                    dev_wifi.c \
!                   dev_gripper.c \
!                   dev_ranger.c
  #dev_localize.c
  

--- NEW FILE: dev_ranger.c ---
/*
 *  PlayerViewer
 *  Copyright (C) Andrew Howard 2002
 *
 *  This program is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU General Public License
 *  as published by the Free Software Foundation; either version 2
 *  of the License, or (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 */

#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#include "playerv.h"

// Draw the ranger scan
void ranger_draw(ranger_t *ranger);

// Create a ranger device
ranger_t* ranger_create(mainwnd_t *mainwnd, opt_t *opt, playerc_client_t 
*client,
                        int index, const char *drivername, int subscribe)
{
  char label[64];
  char section[64];
  ranger_t *ranger;

  ranger = malloc(sizeof(ranger_t));

  ranger->proxy = playerc_ranger_create(client, index);
  ranger->drivername = strdup(drivername);
  ranger->datatime = 0;

  snprintf(section, sizeof(section), "ranger:%d", index);

  // Construct the menu
  snprintf(label, sizeof(label), "ranger:%d (%s)", index, ranger->drivername);
  ranger->menu = rtk_menu_create_sub(mainwnd->device_menu, label);
  ranger->subscribe_item = rtk_menuitem_create(ranger->menu, "Subscribe", 1);
  ranger->style_item = rtk_menuitem_create(ranger->menu, "Filled", 1);
  ranger->intns_item = rtk_menuitem_create(ranger->menu, "Draw intensity data", 
1);
  ranger->device_item = rtk_menuitem_create(ranger->menu, "Singular", 1);

  // Set the initial menu state
  rtk_menuitem_check(ranger->subscribe_item, subscribe);
  rtk_menuitem_check(ranger->style_item, 1);
  rtk_menuitem_check(ranger->intns_item, 1);

  ranger->mainwnd = mainwnd;
  ranger->scan_fig = NULL;

  return ranger;
}


void ranger_delete_figures(ranger_t *ranger)
{
  int ii;

  if (ranger->scan_fig != NULL)
  {
    for (ii = 0; ii < ranger->proxy->sensor_count; ii++)
      rtk_fig_destroy(ranger->scan_fig[ii]);
    free(ranger->scan_fig);
    ranger->scan_fig = NULL;
  }
}


// Destroy a ranger device
void ranger_destroy(ranger_t *ranger)
{
  ranger_delete_figures(ranger);

  if (ranger->proxy->info.subscribed)
    playerc_ranger_unsubscribe(ranger->proxy);
  playerc_ranger_destroy(ranger->proxy);

  rtk_menuitem_destroy(ranger->subscribe_item);
  rtk_menuitem_destroy(ranger->style_item);
  rtk_menuitem_destroy(ranger->intns_item);
  rtk_menuitem_destroy(ranger->device_item);
  rtk_menu_destroy(ranger->menu);

  free(ranger->drivername);

  free(ranger);
}


// 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());

      // Try to get the min_angle and resolution properties (don't care if 
can't get them)
      if (playerc_device_get_dblprop(&ranger->proxy->info, "min_angle", 
&ranger->start_angle) != 0)
        ranger->start_angle = 0.0f;
      if (playerc_device_get_dblprop(&ranger->proxy->info, "resolution", 
&ranger->resolution) != 0)
        ranger->resolution = 0.0f;

      // 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
    for (ii = 0; ii < ranger->proxy->sensor_count; ii++)
      rtk_fig_show(ranger->scan_fig[ii], 0);
  }
}

// Converts a range reading into a point in the CS of the ranger device
// based on the pose of the sensor the reading is likely to belong to
void range_to_point(ranger_t *ranger, int index, int sensor_num, double angle, 
double *point)
{
  // Point position = point from range -> rotate by range angle// -> rotate by 
sensor yaw -> translate by sensor position
  point[0] = ranger->proxy->ranges[index] * cos(angle);// + 
ranger->proxy->sensor_poses[sensor_num].pyaw) + 
ranger->proxy->sensor_poses[sensor_num].px;
  point[1] = ranger->proxy->ranges[index] * sin(angle);// + 
ranger->proxy->sensor_poses[sensor_num].pyaw) + 
ranger->proxy->sensor_poses[sensor_num].py;
}

// Draw the ranger scan
void ranger_draw(ranger_t *ranger)
{
  int ii = 0, jj = 0;
  int point_count;
  double point1[2], point2[2], points[PLAYER_LASER_MAX_SAMPLES + 1][2];
  double current_angle = 0.0f, temp = 0.0f;
  unsigned int ranges_per_sensor = 0;

  // Drawing type depends on the selected sensor type
  // Singular sensors (e.g. sonar sensors):
  //   Draw a cone for the first range scan of each sensor
  // Non-singular sensors (e.g. laser scanner):
  //   Draw the edge of the scan and empty space

  // Calculate the number of ranges per sensor
  if (ranger->proxy->sensor_count == 0)
    ranges_per_sensor = ranger->proxy->ranges_count;
  else
    ranges_per_sensor = ranger->proxy->ranges_count / 
ranger->proxy->sensor_count;

  if (rtk_menuitem_ischecked(ranger->device_item))
  {
    // Draw sonar-like
    temp = 20.0f * M_PI / 180.0f / 2.0f;
    for (ii = 0; ii < ranger->proxy->sensor_count; ii++)
    {
      rtk_fig_show(ranger->scan_fig[ii], 1);
      rtk_fig_clear(ranger->scan_fig[ii]);
      rtk_fig_color_rgb32(ranger->scan_fig[ii], COLOR_SONAR_SCAN);

      // Draw a cone for the first range for each sensor
      // Assume the range is straight ahead (ignore min_angle and resolution 
properties)
      points[0][0] = 0.0f;
      points[0][1] = 0.0f;
      points[1][0] = ranger->proxy->ranges[ii * ranges_per_sensor] * cos(-temp);
      points[1][1] = ranger->proxy->ranges[ii * ranges_per_sensor] * sin(-temp);
      points[2][0] = ranger->proxy->ranges[ii * ranges_per_sensor] * cos(temp);
      points[2][1] = ranger->proxy->ranges[ii * ranges_per_sensor] * sin(temp);
      rtk_fig_polygon(ranger->scan_fig[ii], 0, 0, 0, 3, points, 1);

      // Draw the sensor itself
      rtk_fig_color_rgb32(ranger->scan_fig[ii], COLOR_LASER);
      rtk_fig_rectangle(ranger->scan_fig[ii], 0, 0, 0, 
ranger->proxy->sensor_sizes[ii].sw, ranger->proxy->sensor_sizes[ii].sl, 0);
    }
  }
  else
  {
    // Draw laser-like
    if (rtk_menuitem_ischecked(ranger->style_item))
    {
      // Draw each sensor in turn
      for (ii = 0; ii < ranger->proxy->sensor_count; ii++)
      {
        rtk_fig_show(ranger->scan_fig[ii], 1);
        rtk_fig_clear(ranger->scan_fig[ii]);

        // Draw empty space
        points[0][0] = ranger->proxy->sensor_poses[ii].px;
        points[0][1] = ranger->proxy->sensor_poses[ii].py;
        point_count = 1;
        current_angle = ranger->start_angle;
        // Loop over the ranges
        for (jj = ii * ranges_per_sensor; jj < (ii + 1) * ranges_per_sensor; 
jj++)
        {
          range_to_point(ranger, jj, ii, current_angle, points[point_count]);
          // Move round to the angle of the next range
          current_angle += ranger->resolution;
          point_count++;
        }
        rtk_fig_color_rgb32(ranger->scan_fig[ii], COLOR_LASER_EMP);
        rtk_fig_polygon(ranger->scan_fig[ii], 0, 0, 0, point_count, points, 1);

        // Draw occupied space
        rtk_fig_color_rgb32(ranger->scan_fig[ii], COLOR_LASER_OCC);
        current_angle = ranger->start_angle;
        for (jj = ii * ranges_per_sensor; jj < (ii + 1) * ranges_per_sensor; 
jj++)
        {
          range_to_point(ranger, jj, ii, current_angle - ranger->resolution, 
point1);
          range_to_point(ranger, jj, ii, current_angle + ranger->resolution, 
point2);
          rtk_fig_line(ranger->scan_fig[ii], point1[0], point1[1], point2[0], 
point2[1]);
          current_angle += ranger->resolution;
        }
      }
    }
    else
    {
      // Draw a range scan for each individual sensor in the device
      for (ii = 0; ii < ranger->proxy->sensor_count; ii++)
      {
        rtk_fig_show(ranger->scan_fig[ii], 1);
        rtk_fig_clear(ranger->scan_fig[ii]);

        rtk_fig_color_rgb32(ranger->scan_fig[ii], COLOR_LASER_OCC);
        current_angle = ranger->start_angle;
        // Get the first point
        range_to_point(ranger, ii * ranges_per_sensor, ii, ranger->start_angle, 
point1);
        // Loop over the rest of the ranges
        for (jj = ii * ranges_per_sensor + 1; jj < (ii + 1) * 
ranges_per_sensor; jj++)
        {
          range_to_point(ranger, jj, ii, current_angle, point2);
          // Draw a line from point 1 (previous point) to point 2 (current 
point)
          rtk_fig_line(ranger->scan_fig[ii], point1[0], point1[1], point2[0], 
point2[1]);
          point1[0] = point2[0];
          point1[1] = point2[1];
          // Move round to the angle of the next range
          current_angle += ranger->resolution;
        }
      }
    }

    // For each sensor...
    for (ii = 0; ii < ranger->proxy->sensor_count; ii++)
    {
      if (rtk_menuitem_ischecked(ranger->intns_item))
      {
        // Draw an intensity scan
        if (ranger->proxy->intensities_count > 0)
        {
          current_angle = ranger->start_angle;
          for (jj = ii * ranges_per_sensor; jj < (ii + 1) * ranges_per_sensor; 
jj++)
          {
            if (ranger->proxy->intensities[0] != 0)
            {
              range_to_point(ranger, jj, ii, current_angle, point1);
              rtk_fig_rectangle(ranger->scan_fig[ii], point1[0], point1[1], 0, 
0.05, 0.05, 1);
            }
            current_angle += ranger->resolution;
          }
        }
      }

      // Draw the sensor itself
      rtk_fig_color_rgb32(ranger->scan_fig[ii], COLOR_LASER);
      rtk_fig_rectangle(ranger->scan_fig[ii], 0, 0, 0, 
ranger->proxy->sensor_sizes[ii].sw, ranger->proxy->sensor_sizes[ii].sl, 0);
    }
  }
}


-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
Playerstage-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit

Reply via email to