Revision: 8964
          http://playerstage.svn.sourceforge.net/playerstage/?rev=8964&view=rev
Author:   jpgr87
Date:     2010-11-12 04:13:53 +0000 (Fri, 12 Nov 2010)

Log Message:
-----------
Applied patch #3088069: Player: Introduce flip option to hokuyo_aist.  Also 
added min/max angle flipping when the readings are inverted.

Modified Paths:
--------------
    code/player/trunk/server/drivers/ranger/hokuyo_aist.cc

Modified: code/player/trunk/server/drivers/ranger/hokuyo_aist.cc
===================================================================
--- code/player/trunk/server/drivers/ranger/hokuyo_aist.cc      2010-11-12 
04:02:25 UTC (rev 8963)
+++ code/player/trunk/server/drivers/ranger/hokuyo_aist.cc      2010-11-12 
04:13:53 UTC (rev 8964)
@@ -75,6 +75,10 @@
  - max_angle (float, radians)
    - Default: 4.0 rad (Will use laser default)
    - Maximum scan angle to return. Will be adjusted if outside the laser's 
scannable range.
+ - invert (boolean)
+   - Default: false
+   - If true, the reading will be inverted (i.e. read backwards). Useful if 
the laser scanner is
+     mounted upside down.
  - power (boolean)
    - Default: true
    - If true, the sensor power will be switched on upon driver activation 
(i.e. when the first
@@ -158,7 +162,7 @@
                bool AllocateDataSpace (void);
 
                // Configuration parameters
-               bool _verbose, _powerOnStartup, _getIntensities, 
_ignoreUnknowns;
+               bool _verbose, _invert, _powerOnStartup, _getIntensities, 
_ignoreUnknowns;
                double _minAngle, _maxAngle;
                IntProperty _baudRate, _speedLevel, _highSensitivity;
                DoubleProperty _minDist;
@@ -201,6 +205,7 @@
        _getIntensities = cf->ReadBool (section, "get_intensities", false);
        _minAngle = cf->ReadFloat (section, "min_angle", -4.0);
        _maxAngle = cf->ReadFloat (section, "max_angle", 4.0);
+       _invert = cf->ReadBool (section, "invert", false);
        _portOpts = cf->ReadString (section, "portopts", 
"type=serial,device=/dev/ttyACM0,timeout=1");
        _verbose = cf->ReadBool (section, "verbose", false);
        _ignoreUnknowns = cf->ReadBool (section, "ignoreunknowns", false);
@@ -436,8 +441,17 @@
                hokuyo_aist::HokuyoSensorInfo info;
                _device.GetSensorInfo (&info);
 
-               rangerConfig.min_angle = _minAngle; // These two are 
user-configurable
-               rangerConfig.max_angle = _maxAngle;
+               if (!_invert)
+               {
+                       rangerConfig.min_angle = _minAngle; // These two are 
user-configurable
+                       rangerConfig.max_angle = _maxAngle;
+               }
+               else
+               {
+                       rangerConfig.min_angle = -_maxAngle;
+                       rangerConfig.max_angle = -_minAngle;
+               }
+
                rangerConfig.angular_res = info.resolution;
                rangerConfig.min_range = info.minRange / 1000.0;
                rangerConfig.max_range = info.maxRange / 1000.0;
@@ -452,8 +466,17 @@
        {
                player_ranger_config_t *newParams = 
reinterpret_cast<player_ranger_config_t*> (data);
 
-               _minAngle = newParams->min_angle;
-               _maxAngle = newParams->max_angle;
+               if (!_invert)
+               {
+                       _minAngle = newParams->min_angle;
+                       _maxAngle = newParams->max_angle;
+               }
+               else
+               {
+                       _minAngle = -newParams->max_angle;
+                       _maxAngle = -newParams->min_angle;
+               }
+
                if (!AllocateDataSpace ())
                {
                        PLAYER_ERROR ("hokuyo_aist: Failed to allocate space 
for storing range data.");
@@ -518,18 +541,37 @@
                }
 
                double lastValidValue = _minDist;
-               for (unsigned int ii = 0; ii < _data.Length (); ii++)
+               if (!_invert)
                {
-                       _ranges[ii] = _data[ii] / 1000.0f;
-                       _intensities[ii] = _data.Intensities ()[ii];
-                       if (_minDist > 0)
+                       for (unsigned int ii = 0; ii < _data.Length (); ii++)
                        {
-                               if (_ranges[ii] < _minDist)
-                                       _ranges[ii] = lastValidValue;
-                               else
-                                       lastValidValue = _ranges[ii];
+                               _ranges[ii] = _data[ii] / 1000.0f;
+                               _intensities[ii] = _data.Intensities ()[ii];
+                               if (_minDist > 0)
+                               {
+                                       if (_ranges[ii] < _minDist)
+                                               _ranges[ii] = lastValidValue;
+                                       else
+                                               lastValidValue = _ranges[ii];
+                               }
                        }
                }
+               else  // invert
+               {
+                       for (unsigned int ii = 0; ii < _data.Length (); ii++)
+                       {
+                               unsigned int jj = _data.Length () - 1 - ii;
+                               _ranges[ii] = _data[jj] / 1000.0f;
+                               _intensities[ii] = _data.Intensities ()[jj];
+                               if (_minDist > 0)
+                               {
+                                       if (_ranges[ii] < _minDist)
+                                               _ranges[ii] = lastValidValue;
+                                       else
+                                               lastValidValue = _ranges[ii];
+                               }
+                       }
+               }
 
                rangeData.ranges = _ranges;
                rangeData.ranges_count = _data.Length ();
@@ -578,15 +620,31 @@
                }
 
                double lastValidValue = _minDist;
-               for (unsigned int ii = 0; ii < _data.Length (); ii++)
+               if (!_invert) {
+                       for (unsigned int ii = 0; ii < _data.Length (); ii++)
+                       {
+                               _ranges[ii] = _data[ii] / 1000.0f;
+                               if (_minDist > 0)
+                               {
+                                       if (_ranges[ii] < _minDist)
+                                               _ranges[ii] = lastValidValue;
+                                       else
+                                               lastValidValue = _ranges[ii];
+                               }
+                       }
+               }
+               else  // invert
                {
-                       _ranges[ii] = _data[ii] / 1000.0f;
-                       if (_minDist > 0)
+                       for (unsigned int ii = 0; ii < _data.Length (); ii++)
                        {
-                               if (_ranges[ii] < _minDist)
-                                       _ranges[ii] = lastValidValue;
-                               else
-                                       lastValidValue = _ranges[ii];
+                               _ranges[ii] = _data[_data.Length () - 1 - ii] / 
1000.0f;
+                               if (_minDist > 0)
+                               {
+                                       if (_ranges[ii] < _minDist)
+                                               _ranges[ii] = lastValidValue;
+                                       else
+                                               lastValidValue = _ranges[ii];
+                               }
                        }
                }
                rangeData.ranges = _ranges;


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

------------------------------------------------------------------------------
Centralized Desktop Delivery: Dell and VMware Reference Architecture
Simplifying enterprise desktop deployment and management using
Dell EqualLogic storage and VMware View: A highly scalable, end-to-end
client virtualization framework. Read more!
http://p.sf.net/sfu/dell-eql-dev2dev
_______________________________________________
Playerstage-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit

Reply via email to