Revision: 8312
          http://playerstage.svn.sourceforge.net/playerstage/?rev=8312&view=rev
Author:   thjc
Date:     2009-10-18 15:31:25 +0000 (Sun, 18 Oct 2009)

Log Message:
-----------
applied patch 2880788: Player SVN trunk: collective ranger patch

Modified Paths:
--------------
    code/player/trunk/client_libs/libplayerc/dev_ranger.c
    code/player/trunk/server/drivers/ranger/lasertoranger.cc
    code/player/trunk/server/drivers/ranger/sonartoranger.cc
    code/player/trunk/server/drivers/ranger/toranger.cc
    code/player/trunk/utils/playerv/pv_dev_ranger.c

Modified: code/player/trunk/client_libs/libplayerc/dev_ranger.c
===================================================================
--- code/player/trunk/client_libs/libplayerc/dev_ranger.c       2009-10-18 
15:26:36 UTC (rev 8311)
+++ code/player/trunk/client_libs/libplayerc/dev_ranger.c       2009-10-18 
15:31:25 UTC (rev 8312)
@@ -122,20 +122,23 @@
       return;
     }
 
-    if (device->element_count == 1)
+    if (device->bearings_count >= device->element_count)
     {
-      b = device->min_angle;
-      for (ii = 0; ii < device->bearings_count; ii++)
+      if (device->element_count == 1)
       {
-        device->bearings[ii] = b + device->device_pose.pyaw;
-        b += device->angular_res;
+        b = device->min_angle;
+        for (ii = 0; ii < device->bearings_count; ii++)
+        {
+          device->bearings[ii] = b + device->device_pose.pyaw;
+          b += device->angular_res;
+        }
       }
-    }
-    else
-    {
-      for (ii = 0; ii < device->element_count; ii++)
+      else
       {
-        device->bearings[ii] = device->element_poses[ii].pyaw;
+        for (ii = 0; ii < device->element_count; ii++)
+        {
+          device->bearings[ii] = device->element_poses[ii].pyaw;
+        }
       }
     }
   }
@@ -145,7 +148,7 @@
 // Calculate scan points
 void playerc_ranger_calculate_points(playerc_ranger_t *device)
 {
-  double b;
+  double b, r, s;
   uint32_t ii;
 
   device->points_count = device->ranges_count;
@@ -163,27 +166,30 @@
       return;
     }
 
-    if (device->element_count == 1)
+    if (device->points_count >= device->element_count)
     {
-      b = device->min_angle;
-      for (ii = 0; ii < device->points_count; ii++)
+      if (device->element_count == 1)
       {
-        double r = device->ranges[ii];
-        device->points[ii].px = r * cos(b);
-        device->points[ii].py = r * sin(b);
-        device->points[ii].pz = 0.0;
-        b += device->angular_res;
+        b = device->min_angle;
+        for (ii = 0; ii < device->points_count; ii++)
+        {
+          r = device->ranges[ii];
+          device->points[ii].px = r * cos(b);
+          device->points[ii].py = r * sin(b);
+          device->points[ii].pz = 0.0;
+          b += device->angular_res;
+        }
       }
-    }
-    else
-    {
-      for (ii = 0; ii < device->element_count; ii++)
+      else
       {
-        double r = device->ranges[ii];
-        double s = r * cos(device->element_poses[ii].ppitch);
-        device->points[ii].px = s * cos(device->element_poses[ii].pyaw) + 
device->element_poses[ii].px;
-        device->points[ii].py = s * sin(device->element_poses[ii].pyaw) + 
device->element_poses[ii].py;
-        device->points[ii].pz = r * sin(device->element_poses[ii].ppitch) + 
device->element_poses[ii].pz;
+        for (ii = 0; ii < device->element_count; ii++)
+        {
+          r = device->ranges[ii];
+          s = r * cos(device->element_poses[ii].ppitch);
+          device->points[ii].px = s * cos(device->element_poses[ii].pyaw) + 
device->element_poses[ii].px;
+          device->points[ii].py = s * sin(device->element_poses[ii].pyaw) + 
device->element_poses[ii].py;
+          device->points[ii].pz = r * sin(device->element_poses[ii].ppitch) + 
device->element_poses[ii].pz;
+        }
       }
     }
   }
@@ -204,7 +210,7 @@
     }
   }
   // Copy the range data
-  memcpy(device->ranges, data->ranges, data->ranges_count * 
sizeof(data->ranges[0]));
+  if (data->ranges_count > 0) memcpy(device->ranges, data->ranges, 
data->ranges_count * sizeof(data->ranges[0]));
   device->ranges_count = data->ranges_count;
 }
 
@@ -223,7 +229,7 @@
     }
   }
   // Copy the range data
-  memcpy(device->intensities, data->intensities, data->intensities_count * 
sizeof(data->intensities[0]));
+  if (data->intensities_count > 0) memcpy(device->intensities, 
data->intensities, data->intensities_count * sizeof(data->intensities[0]));
   device->intensities_count = data->intensities_count;
 }
 

Modified: code/player/trunk/server/drivers/ranger/lasertoranger.cc
===================================================================
--- code/player/trunk/server/drivers/ranger/lasertoranger.cc    2009-10-18 
15:26:36 UTC (rev 8311)
+++ code/player/trunk/server/drivers/ranger/lasertoranger.cc    2009-10-18 
15:31:25 UTC (rev 8312)
@@ -57,8 +57,18 @@
 
 @par Configuration file options
 
- - None
+- buggy_geom (integer)
+  - Default: 0
+  - If set to 1, the pz, proll and ppitch fields will be set to 0.0
+  - This option is added to provide compatibility with old buggy laser drivers
+     that do not clean unused geometry structure fields
 
+- force_config (float tuple)
+  - Default: not set
+  - If set, it will override configuration values obtained from buggy laser 
drivers
+  - values: [min_angle max_angle angular_res max_range range_res]
+  - units: [deg deg deg m m]
+
 @par Example
 
 @verbatim
@@ -114,6 +124,13 @@
 
                uint8_t lastReqType;                            // Last request 
type on the ranger interface
                bool startupComplete;                           // True once 
this driver is ready to go
+               int buggy_geom;
+               int force_config;
+               float force_min_angle;
+               float force_max_angle;
+               float force_angular_res;
+               float force_max_range;
+               float force_range_res;
 };
 
 // Initialisation function
@@ -140,9 +157,28 @@
        // Need a laser device as input
        if (cf->ReadDeviceAddr(&inputDeviceAddr, section, "requires", 
PLAYER_LASER_CODE, -1, NULL) != 0)
        {
-               SetError (-1);
+               this->SetError(-1);
                return;
        }
+       this->buggy_geom = cf->ReadInt(section, "buggy_geom", 0);
+       this->force_config = 0;
+       switch (cf->GetTupleCount(section, "force_config"))
+       {
+       case 0:
+               break;
+       case 5:
+               this->force_config = !0;
+               this->force_min_angle = cf->ReadTupleAngle(section, 
"force_config", 0, 0.0);
+               this->force_max_angle = cf->ReadTupleAngle(section, 
"force_config", 1, 0.0);
+               this->force_angular_res = cf->ReadTupleAngle(section, 
"force_config", 2, 0.0);
+               this->force_max_range = cf->ReadTupleFloat(section, 
"force_config", 3, 0.0);
+               this->force_range_res = cf->ReadTupleFloat(section, 
"force_config", 4, 0.0);
+               break;
+       default:
+               PLAYER_ERROR("Invalid number of forced settings");
+               this->SetError(-1);
+               return;
+       }
 }
 
 // Setup function
@@ -240,10 +276,19 @@
        if (data != NULL)
        {
                // Update the properties from the data
-               laserConfig.min_angle = scanData->min_angle;
-               laserConfig.max_angle = scanData->max_angle;
-               laserConfig.resolution = scanData->resolution;
-               laserConfig.max_range = scanData->max_range;
+               if (this->force_config)
+               {
+                       laserConfig.min_angle = this->force_min_angle;
+                       laserConfig.max_angle = this->force_max_angle;
+                       laserConfig.resolution = this->force_angular_res;
+                       laserConfig.max_range = this->force_max_range;
+               } else
+               {
+                       laserConfig.min_angle = scanData->min_angle;
+                       laserConfig.max_angle = scanData->max_angle;
+                       laserConfig.resolution = scanData->resolution;
+                       laserConfig.max_range = scanData->max_range;
+               }
 
                // Copy out the range data
                if (scanData->ranges_count > 0)
@@ -306,6 +351,12 @@
        deviceGeom.size.sw = data->size.sw;
        deviceGeom.size.sl = data->size.sl;
        deviceGeom.size.sh = data->size.sh;
+       if (this->buggy_geom)
+       {
+               deviceGeom.pose.pz = 0.0;
+               deviceGeom.pose.proll = 0.0;
+               deviceGeom.pose.ppitch = 0.0;
+       }
 
        *(deviceGeom.element_poses) = deviceGeom.pose;
        *(deviceGeom.element_sizes) = deviceGeom.size;
@@ -318,11 +369,21 @@
        // Save a copy of the laser config, we need it to set intensity and/or 
config later
        memcpy (&laserConfig, data, sizeof (player_laser_config_t));
        // Copy it into the destination
-       dest->min_angle = data->min_angle;
-       dest->max_angle = data->max_angle;
-       dest->angular_res = data->resolution;
-       dest->max_range = data->max_range;
-       dest->range_res = data->range_res;
+       if (this->force_config)
+       {
+               dest->min_angle = this->force_min_angle;
+               dest->max_angle = this->force_max_angle;
+               dest->angular_res = this->force_angular_res;
+               dest->max_range = this->force_max_range;
+               dest->range_res = this->force_range_res;
+       } else
+       {
+               dest->min_angle = data->min_angle;
+               dest->max_angle = data->max_angle;
+               dest->angular_res = data->resolution;
+               dest->max_range = data->max_range;
+               dest->range_res = data->range_res;
+       }
        dest->frequency = data->scanning_frequency;
 }
 

Modified: code/player/trunk/server/drivers/ranger/sonartoranger.cc
===================================================================
--- code/player/trunk/server/drivers/ranger/sonartoranger.cc    2009-10-18 
15:26:36 UTC (rev 8311)
+++ code/player/trunk/server/drivers/ranger/sonartoranger.cc    2009-10-18 
15:31:25 UTC (rev 8312)
@@ -105,6 +105,8 @@
                int ConvertGeom (player_sonar_geom_t *geom);
                // Convert sonar data to ranger data
                int ConvertData (player_sonar_data_t *data);
+       private:
+               int skip_rq;
 };
 
 // Initialisation function
@@ -128,6 +130,7 @@
 SonarToRanger::SonarToRanger( ConfigFile* cf, int section)
        : ToRanger (cf, section)
 {
+       this->skip_rq = 0;
        // Need a sonar device as input
        if (cf->ReadDeviceAddr(&inputDeviceAddr, section, "requires", 
PLAYER_SONAR_CODE, -1, NULL) != 0)
        {
@@ -158,6 +161,7 @@
 
        // Request the sonar geometry
        inputDevice->PutMsg (InQueue, PLAYER_MSGTYPE_REQ, 
PLAYER_SONAR_REQ_GET_GEOM, NULL, 0, NULL);
+       this->skip_rq = !0;
 
        return 0;
 }
@@ -314,12 +318,14 @@
                // Geometry request - need to manage the info we just got
                if (ConvertGeom (reinterpret_cast<player_sonar_geom_t*> (data)) 
== 0)
                {
-                       Publish (device_addr, PLAYER_MSGTYPE_RESP_ACK, 
PLAYER_RANGER_REQ_GET_GEOM, reinterpret_cast<void*> (&deviceGeom), sizeof 
(deviceGeom), NULL);
+                       if (!(this->skip_rq)) Publish (device_addr, 
PLAYER_MSGTYPE_RESP_ACK, PLAYER_RANGER_REQ_GET_GEOM, reinterpret_cast<void*> 
(&deviceGeom), sizeof (deviceGeom), NULL);
+                       this->skip_rq = 0;
                        return 0;
                }
                else
                {
-                       Publish (device_addr, ret_queue, 
PLAYER_MSGTYPE_RESP_NACK, PLAYER_RANGER_REQ_GET_GEOM, NULL, 0, NULL);
+                       if (!(this->skip_rq)) Publish (device_addr, ret_queue, 
PLAYER_MSGTYPE_RESP_NACK, PLAYER_RANGER_REQ_GET_GEOM, NULL, 0, NULL);
+                       this->skip_rq = 0;
                        return 0;
                }
        }
@@ -334,7 +340,8 @@
        else if (Message::MatchMessage (hdr, PLAYER_MSGTYPE_RESP_NACK, 
PLAYER_SONAR_REQ_GET_GEOM, inputDeviceAddr))
        {
                // Geometry request
-               Publish (device_addr, ret_queue, PLAYER_MSGTYPE_RESP_NACK, 
PLAYER_RANGER_REQ_GET_GEOM, NULL, 0, NULL);
+               if (!(this->skip_rq)) Publish (device_addr, ret_queue, 
PLAYER_MSGTYPE_RESP_NACK, PLAYER_RANGER_REQ_GET_GEOM, NULL, 0, NULL);
+               this->skip_rq = 0;
                return 0;
        }
 

Modified: code/player/trunk/server/drivers/ranger/toranger.cc
===================================================================
--- code/player/trunk/server/drivers/ranger/toranger.cc 2009-10-18 15:26:36 UTC 
(rev 8311)
+++ code/player/trunk/server/drivers/ranger/toranger.cc 2009-10-18 15:31:25 UTC 
(rev 8312)
@@ -38,6 +38,9 @@
 ToRanger::ToRanger (ConfigFile* cf, int section)
        : Driver (cf, section, false, PLAYER_MSGQUEUE_DEFAULT_MAXLEN, 
PLAYER_RANGER_CODE)
 {
+       memset (&deviceGeom, 0, sizeof (deviceGeom));
+       deviceGeom.element_poses = NULL;
+       deviceGeom.element_sizes = NULL;
        inputDevice = NULL;
 }
 
@@ -56,6 +59,8 @@
 {
        // Clean output
        memset (&deviceGeom, 0, sizeof (deviceGeom));
+       deviceGeom.element_poses = NULL;
+       deviceGeom.element_sizes = NULL;
 
        return 0;
 }

Modified: code/player/trunk/utils/playerv/pv_dev_ranger.c
===================================================================
--- code/player/trunk/utils/playerv/pv_dev_ranger.c     2009-10-18 15:26:36 UTC 
(rev 8311)
+++ code/player/trunk/utils/playerv/pv_dev_ranger.c     2009-10-18 15:31:25 UTC 
(rev 8312)
@@ -19,6 +19,7 @@
  */
 
 #include <assert.h>
+#include <stddef.h>
 #include <stdlib.h>
 #include <string.h>
 #include <math.h>
@@ -199,6 +200,7 @@
   double point1[2], point2[2]; 
   double (*points)[2];
   double temp = 0.0;
+  double b, range;
 
   // Drawing type depends on the assumed sensor type
   // Singular sensors (e.g. sonar sensors):
@@ -221,7 +223,7 @@
       // Assume the range is straight ahead (ignore min_angle and angular_res 
properties)
       points[0][0] = 0.0f;
       points[0][1] = 0.0f;
-      double range = ranger->proxy->ranges[ii];
+      range = ranger->proxy->ranges[ii];
       if (range < ranger->proxy->min_range)
         range = ranger->proxy->max_range;
       points[1][0] = range * cos(-temp);
@@ -252,10 +254,10 @@
       // Draw empty space
       points[0][0] = 0.0;
       points[0][1] = 0.0;
-      double b = ranger->proxy->min_angle;
+      b = ranger->proxy->min_angle;
       for (ii = 0; ii < ranger->proxy->ranges_count; ii++)
       {
-        double range = ranger->proxy->ranges[ii];
+        range = ranger->proxy->ranges[ii];
         if (range < ranger->proxy->min_range) {
           points[ii + 1][0] = ranger->proxy->max_range * cos(b);
           points[ii + 1][1] = ranger->proxy->max_range * sin(b);
@@ -292,9 +294,9 @@
       rtk_fig_color_rgb32(ranger->scan_fig[0], COLOR_LASER_OCC);
       // Get the first point
 
-      double b = ranger->proxy->min_angle;
+      b = ranger->proxy->min_angle;
 
-      double range = ranger->proxy->ranges[0];
+      range = ranger->proxy->ranges[0];
       if (range < ranger->proxy->min_range) {
         point1[0] = ranger->proxy->max_range * cos(b);
         point1[1] = ranger->proxy->max_range * sin(b);
@@ -326,14 +328,14 @@
     if (rtk_menuitem_ischecked(ranger->intns_item))
     {
       // Draw an intensity scan
-      double b = ranger->proxy->min_angle;
+      b = ranger->proxy->min_angle;
       if (ranger->proxy->intensities_count > 0)
       {
         for (ii = 0; ii < ranger->proxy->intensities_count; ii++)
         {
           if (ranger->proxy->intensities[ii] != 0)
           {
-            double range = ranger->proxy->ranges[ii];
+            range = ranger->proxy->ranges[ii];
             if (range < ranger->proxy->min_range) {
               point1[0] = ranger->proxy->max_range * cos(b);
               point1[1] = ranger->proxy->max_range * sin(b);


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

------------------------------------------------------------------------------
Come build with us! The BlackBerry(R) Developer Conference in SF, CA
is the only developer event you need to attend this year. Jumpstart your
developing skills, take BlackBerry mobile applications to market and stay 
ahead of the curve. Join us from November 9 - 12, 2009. Register now!
http://p.sf.net/sfu/devconference
_______________________________________________
Playerstage-commit mailing list
Playerstage-commit@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/playerstage-commit

Reply via email to