Update of /cvsroot/playerstage/code/player/server/drivers/laser
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv16319

Modified Files:
        urg_laser.cc urg_laser.h urglaserdriver.cc 
Log Message:
added TOP-URG support

Index: urglaserdriver.cc
===================================================================
RCS file: 
/cvsroot/playerstage/code/player/server/drivers/laser/urglaserdriver.cc,v
retrieving revision 1.15
retrieving revision 1.16
diff -C2 -d -r1.15 -r1.16
*** urglaserdriver.cc   7 Feb 2008 02:23:00 -0000       1.15
--- urglaserdriver.cc   7 Mar 2008 02:01:22 -0000       1.16
***************
*** 223,239 ****
    }
    Laser.GetSensorConfig (&Conf);
    
    // Solve the min/max angle problem
!   min_i = static_cast<int> (round (384.0 + Conf.min_angle/Conf.resolution));
!   max_i = static_cast<int> (round (384.0 + Conf.max_angle/Conf.resolution));
    
    // For ancient firmware versions, set some hard limits on the min/max angle 
capabilities
!   if (min_i < URG04_MIN_STEP)
!     min_i = URG04_MIN_STEP;
!   if (max_i > URG04_MAX_STEP)
!     max_i = URG04_MAX_STEP;
  
!   int user_min_i = static_cast<int> (round (384.0 + 
user_min_angle/Conf.resolution));
!   int user_max_i = static_cast<int> (round (384.0 + 
user_max_angle/Conf.resolution));
    
    if (user_min_i > user_max_i)
--- 223,244 ----
    }
    Laser.GetSensorConfig (&Conf);
+ 
+   int half_idx = Laser.GetNumRanges() / 2; 
    
    // Solve the min/max angle problem
!   min_i = static_cast<int> (round (half_idx + 
Conf.min_angle/Conf.resolution));
!   max_i = static_cast<int> (round (half_idx + 
Conf.max_angle/Conf.resolution));
    
    // For ancient firmware versions, set some hard limits on the min/max angle 
capabilities
!   if(Laser.GetSCIPVersion() < 3)
!   {
!     if (min_i < URG04_MIN_STEP)
!       min_i = URG04_MIN_STEP;
!     if (max_i > URG04_MAX_STEP)
!       max_i = URG04_MAX_STEP;
!   }
  
!   int user_min_i = static_cast<int> (round (half_idx + 
user_min_angle/Conf.resolution));
!   int user_max_i = static_cast<int> (round (half_idx + 
user_max_angle/Conf.resolution));
    
    if (user_min_i > user_max_i)
***************
*** 255,260 ****
    max_i = user_max_i;
    
!   Conf.min_angle = (min_i - 384) * Conf.resolution;
!   Conf.max_angle = (max_i - 384) * Conf.resolution;
    
    // Start the device thread; spawns a new thread and executes
--- 260,265 ----
    max_i = user_max_i;
    
!   Conf.min_angle = (min_i - half_idx) * Conf.resolution;
!   Conf.max_angle = (max_i - half_idx) * Conf.resolution;
    
    // Start the device thread; spawns a new thread and executes
***************
*** 338,341 ****
--- 343,348 ----
      Data.ranges_count = (max_i - min_i) + 1;
      Data.ranges = new float [Data.ranges_count];
+     // TODO: look into getting intensity data
+     Data.intensity_count = 0;
      
      for (unsigned int i = 0; i < Data.ranges_count; ++i)

Index: urg_laser.cc
===================================================================
RCS file: /cvsroot/playerstage/code/player/server/drivers/laser/urg_laser.cc,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -d -r1.6 -r1.7
*** urg_laser.cc        4 Feb 2008 19:40:27 -0000       1.6
--- urg_laser.cc        7 Mar 2008 02:01:22 -0000       1.7
***************
*** 37,41 ****
  //  range is 5.6 meters (hey!)
  int
!   urg_laser::GetSCIPVersion ()
  {
    unsigned char Buffer [18];
--- 37,41 ----
  //  range is 5.6 meters (hey!)
  int
!   urg_laser::QuerySCIPVersion ()
  {
    unsigned char Buffer [18];
***************
*** 67,71 ****
      if (strncmp ((const char *) Buffer, "VV\n00P\n", 7) != 0)
      {
!       printf ("> E: GetSCIPVersion: Error reading after VV command. Answer: 
%s\n", Buffer);
        return (-1);
      }
--- 67,71 ----
      if (strncmp ((const char *) Buffer, "VV\n00P\n", 7) != 0)
      {
!       printf ("> E: QuerySCIPVersion: Error reading after VV command. Answer: 
%s\n", Buffer);
        return (-1);
      }
***************
*** 87,91 ****
        
      if (strncmp ((const char *) Buffer, "FIRM:", 5) != 0)
!       printf ("> W: GetSCIPVersion: Warning, 'FIRM:' is not where it is 
supposed to be!\n");
        
      // Read the firmware version major value 
--- 87,98 ----
        
      if (strncmp ((const char *) Buffer, "FIRM:", 5) != 0)
!     {
!       //printf ("> W: QuerySCIPVersion: Warning, 'FIRM:' is not where it is 
supposed to be!\n");
!       // HACK: assume that we're talking to a TOP-URG
!       tcflush (fileno (laser_port), TCIFLUSH);
!       this->SCIP_Version = 3;
!       this->num_ranges = 1128;
!       return(0);
!     }
        
      // Read the firmware version major value 
***************
*** 141,144 ****
--- 148,154 ----
    urg_laser::GetSensorConfig (player_laser_config_t *cfg)
  {
+   // TODO: look into getting intensity data
+   cfg->intensity = 0;
+ 
    if (SCIP_Version == 1)
    {
***************
*** 228,232 ****
      tcflush (fileno(laser_port), TCIFLUSH);
    }
!   else                        // SCIP_Version = 2
    {
      // ask hokuyo: PP
--- 238,242 ----
      tcflush (fileno(laser_port), TCIFLUSH);
    }
!   else if(SCIP_Version == 2)
    {
      // ask hokuyo: PP
***************
*** 304,307 ****
--- 314,328 ----
               RTOD (cfg->min_angle), RTOD (cfg->max_angle), RTOD 
(cfg->resolution), cfg->max_range);
    }
+   else                        // SCIP_Version = 3 (TOP-URG)
+   {
+     // HACK: should ask the device, but for now just hardcode it:
+     cfg->min_angle = DTOR(-135.0);
+     cfg->max_angle = DTOR(135.0);
+     cfg->resolution = DTOR(270.0/1128.0);
+     cfg->max_range = 30.0;
+ 
+     printf ("> I: TOP-URG specifications: [min_angle, max_angle, resolution, 
max_range] = [%f, %f, %f, %f]\n",
+              RTOD (cfg->min_angle), RTOD (cfg->max_angle), RTOD 
(cfg->resolution), cfg->max_range);
+   }
    return (0);
  }
***************
*** 354,357 ****
--- 375,379 ----
    // Defaults to SCIP version 1
    SCIP_Version = 1;
+   num_ranges = 769;
    laser_port   = NULL;
  }
***************
*** 558,562 ****
      tcsetattr (fd, TCSANOW, &newtio);
      usleep (200000);
!     GetSCIPVersion ();
      tcflush (fd, TCIOFLUSH);
    }
--- 580,584 ----
      tcsetattr (fd, TCSANOW, &newtio);
      usleep (200000);
!     QuerySCIPVersion ();
      tcflush (fd, TCIOFLUSH);
    }
***************
*** 641,645 ****
      }
    }
!   else // SCIP_Version == 2
    {
      tcflush (fileno (laser_port), TCIFLUSH);
--- 663,667 ----
      }
    }
!   else if(SCIP_Version == 2)
    {
      tcflush (fileno (laser_port), TCIFLUSH);
***************
*** 712,715 ****
--- 734,812 ----
      }
    }
+   else // SCIP_Version == 3 (TOP-URG)
+   {
+     tcflush (fileno (laser_port), TCIFLUSH);
+     // send the command
+     fprintf (laser_port, "GD0000112700\n");
+   
+     int file = fileno (laser_port);
+   
+     // check the returned command
+     ReadUntil (file, Buffer, 13, -1);
+   
+     if (strncmp ((const char *) Buffer, "GD0000112700", 12) != 0)
+     {
+       printf ("> E: GetReadings: Error reading command result: %s\n", Buffer);
+       tcflush (fileno (laser_port), TCIFLUSH);
+       return (-1);
+     }
+     
+     // check the returned status
+     ReadUntil (file, Buffer, 3, -1);
+     Buffer[2] = 0;
+     if (Buffer[0] != '0' || Buffer[1] != '0')
+       return (Buffer[0] - '0')*10 + (Buffer[1] - '0');
+ 
+     ReadUntil_nthOccurence (file, 2, (char)0xa);
+     
+     // NOTE: This only works for 769 requested samples.. (64 data bytes
+     // blocks are not the best choice for 3-byte values...)
+     
+     for (int i = 0; ; ++i)
+     {
+       ReadUntil (file, Buffer, 3, -1);
+     
+       //printf ("[%d of %d] 0x%x 0x%x 0x%x\n", i, MAX_READINGS, Buffer[0], 
Buffer[1], Buffer [2]);
+         
+       if ((Buffer[1] == '\n') && (Buffer[2] == '\n'))
+         break;
+       else if (Buffer[2] == '\n')
+       {
+         if (ReadUntil(file, &Buffer[1], 2, -1) < 0)
+           return (-1);
+       }
+       else if (Buffer[0] == '\n')
+       {
+       if (i <= MAX_READINGS)
+       {
+               readings->Readings[i - 1] = ((readings->Readings[i - 1] & 
0xFFC0) | (Buffer[1]-0x30));
+               Buffer [0] = Buffer [2];
+               if (ReadUntil (file, &Buffer[1], 2, -1) < 0)
+               return (-1);
+       }
+       else
+               printf ("> E: Got too many readings! %d\n",i);
+       }
+       else if (Buffer[1] == '\n')
+       {
+         Buffer[0] = Buffer[2];
+         if (ReadUntil (file, &Buffer[1], 2, -1) < 0)
+           return (-1);
+       }
+   
+       if (i < MAX_READINGS)
+       {
+         readings->Readings[i] = ((Buffer[0]-0x30) << 12) | ((Buffer[1]-0x30) 
<< 6) | (Buffer[2]-0x30);
+         // > 50000 seems to be an error code for when an object is too close
+         if(readings->Readings[i] >= 50000)
+           readings->Readings[i] = 0;
+         if ((readings->Readings[i] > 30000) && (i >= min_i) && (i <= max_i))
+         printf ("> W: [%d] read error: %i is bigger than 30.0 meters\n", i, 
readings->Readings[i]);
+       }
+       else
+         printf ("> E: Got too many readings! %d\n",i);
+     }
+   }
+ 
    return (0);
  }

Index: urg_laser.h
===================================================================
RCS file: /cvsroot/playerstage/code/player/server/drivers/laser/urg_laser.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** urg_laser.h 7 Feb 2007 18:02:33 -0000       1.4
--- urg_laser.h 7 Mar 2008 02:01:22 -0000       1.5
***************
*** 2,6 ****
  #include <libplayercore/playercore.h>
  
! #define MAX_READINGS 769
  
  typedef struct urg_laser_readings
--- 2,6 ----
  #include <libplayercore/playercore.h>
  
! #define MAX_READINGS 1128
  
  typedef struct urg_laser_readings
***************
*** 28,35 ****
        float GetMaxRange   ();
        int GetSensorConfig (player_laser_config_t *cfg);
!       int GetSCIPVersion  ();
  
    private:
        int SCIP_Version;
        FILE * laser_port;
  };
--- 28,38 ----
        float GetMaxRange   ();
        int GetSensorConfig (player_laser_config_t *cfg);
!         int GetSCIPVersion() { return(this->SCIP_Version); }
!         int GetNumRanges() { return(this->num_ranges); }
  
    private:
+       int QuerySCIPVersion  ();
        int SCIP_Version;
+         int num_ranges;
        FILE * laser_port;
  };


-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Playerstage-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit

Reply via email to