Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | Related Pages | Examples

ArSick.h

00001 /*
00002 MobileRobots Advanced Robotics Interface for Applications (ARIA)
00003 Copyright (C) 2004, 2005 ActivMedia Robotics LLC
00004 Copyright (C) 2006, 2007 MobileRobots Inc.
00005 
00006      This program is free software; you can redistribute it and/or modify
00007      it under the terms of the GNU General Public License as published by
00008      the Free Software Foundation; either version 2 of the License, or
00009      (at your option) any later version.
00010 
00011      This program is distributed in the hope that it will be useful,
00012      but WITHOUT ANY WARRANTY; without even the implied warranty of
00013      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014      GNU General Public License for more details.
00015 
00016      You should have received a copy of the GNU General Public License
00017      along with this program; if not, write to the Free Software
00018      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00019 
00020 If you wish to redistribute ARIA under different terms, contact 
00021 MobileRobots for information about a commercial version of ARIA at 
00022 robots@mobilerobots.com or 
00023 MobileRobots Inc, 19 Columbia Drive, Amherst, NH 03031; 800-639-9481
00024 */
00025 
00026 #ifndef ARSICK_H
00027 #define ARSICK_H
00028 
00029 #include "ariaTypedefs.h"
00030 #include "ArSickPacket.h"
00031 #include "ArSickPacketReceiver.h"
00032 #include "ArRobotPacket.h"
00033 #include "ArRangeDeviceThreaded.h"   
00034 #include "ArFunctor.h"
00035 #include "ArCondition.h"
00036 
00038 
00076 class ArSick : public ArRangeDeviceThreaded
00077 {
00078 public:
00079   enum BaudRate {
00080     BAUD9600, 
00081     BAUD19200, 
00082     BAUD38400 
00083   };
00084   enum Degrees {
00085     DEGREES180, 
00086     DEGREES100 
00087   };
00088   enum Increment {
00089     INCREMENT_ONE, 
00090     INCREMENT_HALF 
00091   };
00092   enum Units {
00093     UNITS_1MM, 
00094     UNITS_1CM, 
00095     UNITS_10CM 
00096   };
00097   enum Bits {
00098     BITS_1REFLECTOR, 
00099     BITS_2REFLECTOR, 
00100     BITS_3REFLECTOR 
00101   };
00103   AREXPORT ArSick(size_t currentBufferSize = 361, 
00104           size_t cumulativeBufferSize = 0,
00105           const char *name = "laser",
00106           bool addAriaExitCB = true);
00108   AREXPORT virtual ~ArSick();
00110   AREXPORT void configure(bool useSim = false, bool powerControl = true, 
00111               bool laserFlipped = false, 
00112               BaudRate baud = BAUD38400,
00113               Degrees deg = DEGREES180, 
00114               Increment incr = INCREMENT_ONE);
00116   AREXPORT void configureShort(bool useSim = false, 
00117                    BaudRate baud = BAUD38400,
00118                    Degrees deg = DEGREES180, 
00119                    Increment incr = INCREMENT_ONE);
00121   AREXPORT void setRangeInformation(Bits bits = BITS_1REFLECTOR,
00122                     Units units = UNITS_1MM);
00124   AREXPORT void setSensorPosition(double x, double y, double th);
00126   AREXPORT void setSensorPosition(ArPose pose);  
00128   AREXPORT ArPose getSensorPosition();
00130   AREXPORT double getSensorPositionX();
00132   AREXPORT double getSensorPositionY();
00134   AREXPORT double getSensorPositionTh();
00136   AREXPORT bool blockingConnect(void);
00138   AREXPORT bool asyncConnect(void);
00140   AREXPORT bool disconnect(bool doNotLockRobotForSim = false);
00142   AREXPORT void setDeviceConnection(ArDeviceConnection *conn);
00144   AREXPORT ArDeviceConnection *getDeviceConnection(void);
00146   bool isConnected(void) 
00147     { if (myState == STATE_CONNECTED) return true; else return false; }
00149   bool tryingToConnect(void) 
00150     { if (myState != STATE_CONNECTED && myState != STATE_NONE) 
00151       return true; else return false; }
00152 
00154   AREXPORT unsigned int getMinRange(void) { return myMinRange; }
00156   AREXPORT void setMinRange(unsigned int minRange) { myMinRange = minRange; }
00158   AREXPORT void addIgnoreReading(double ignoreReading) 
00159                { myIgnoreReadings.push_back(ignoreReading); }
00161   AREXPORT void clearIgnoreReadings(void) { myIgnoreReadings.clear(); }
00163   AREXPORT const std::list<double> *getIgnoreReadings(void) const
00164              { return &myIgnoreReadings; }
00166   AREXPORT void setFilterNearDist(double dist); 
00168   AREXPORT double getFilterNearDist(void);
00169 
00171   AREXPORT void setFilterCumulativeMaxDist(double dist) 
00172     { setMaxDistToKeepCumulative(dist); }
00174   AREXPORT double getFilterCumulativeMaxDist(void)
00175     { return getMaxDistToKeepCumulative(); }
00177   AREXPORT void setFilterCumulativeInsertMaxDist(double dist);
00179   AREXPORT double getFilterCumulativeInsertMaxDist(void);
00181   AREXPORT void setFilterCumulativeNearDist(double dist);
00183   AREXPORT double getFilterCumulativeNearDist(void);
00185   AREXPORT void setFilterCumulativeCleanDist(double dist);
00187   AREXPORT double getFilterCumulativeCleanDist(void);
00189   AREXPORT void setFilterCleanCumulativeInterval(int milliSeconds);
00191   AREXPORT int getFilterCleanCumulativeInterval(void);
00195   void setFilterCumulativeMaxAge(int seconds) 
00196     { setMaxSecondsToKeepCumulative(seconds); }
00200   int getFilterCumulativeMaxAge(void) 
00201     { return getMaxSecondsToKeepCumulative(); }
00202 
00204   AREXPORT bool runOnRobot(void);
00205 
00206 
00208   AREXPORT int getSickPacCount();
00209 
00211   AREXPORT void addConnectCB(ArFunctor *functor,
00212                  ArListPos::Pos position = ArListPos::LAST);
00214   AREXPORT void remConnectCB(ArFunctor *functor);
00215 
00217   AREXPORT void addFailedConnectCB(ArFunctor *functor, 
00218                    ArListPos::Pos position = ArListPos::LAST);
00220   AREXPORT void remFailedConnectCB(ArFunctor *functor);
00221 
00223   AREXPORT void addDisconnectNormallyCB(ArFunctor *functor, 
00224                 ArListPos::Pos position = ArListPos::LAST);
00226   AREXPORT void remDisconnectNormallyCB(ArFunctor *functor);
00227   
00229   AREXPORT void addDisconnectOnErrorCB(ArFunctor *functor, 
00230                    ArListPos::Pos position = ArListPos::LAST);
00232   AREXPORT void remDisconnectOnErrorCB(ArFunctor *functor);
00233 
00235   AREXPORT void addDataCB(ArFunctor *functor,
00236                    ArListPos::Pos position = ArListPos::LAST);
00238   AREXPORT void remDataCB(ArFunctor *functor);
00239 
00241   AREXPORT void setConnectionTimeoutTime(int mSecs);
00243   AREXPORT int getConnectionTimeoutTime(void);
00244 
00246   AREXPORT ArTime getLastReadingTime(void);
00247 
00248 
00250   AREXPORT bool isUsingSim(void);
00252   AREXPORT bool isControllingPower(void);
00254   AREXPORT bool isLaserFlipped(void);
00256   AREXPORT Degrees getDegrees(void);
00258   AREXPORT Increment getIncrement(void);
00260   AREXPORT Bits getBits(void);
00262   AREXPORT Units getUnits(void);
00263 
00265   AREXPORT void setIsUsingSim(bool usingSim);
00267   AREXPORT void setIsControllingPower(bool controlPower);
00269   AREXPORT void setIsLaserFlipped(bool laserFlipped);
00270 
00274   AREXPORT bool simPacketHandler(ArRobotPacket * packet);
00279   AREXPORT void sensorInterpCallback(void);
00283   AREXPORT bool internalConnectSim(void);
00285   AREXPORT int internalConnectHandler(void);
00289   AREXPORT virtual void * runThread(void *arg);
00293   AREXPORT void processPacket(ArSickPacket *packet, ArPose pose, 
00294                   ArPose encoderPose, unsigned int counter,
00295                   bool deinterlace, ArPose deinterlaceDelta);
00299   AREXPORT void runOnce(bool lockRobot);
00300   AREXPORT virtual void setRobot(ArRobot *robot);
00304   AREXPORT void dropConnection(void);
00308   AREXPORT void failedConnect(void);
00312   AREXPORT void madeConnection(void);
00316   AREXPORT void robotConnectCallback(void);
00318   AREXPORT virtual void applyTransform(ArTransform trans,
00319                                         bool doCumulative = true);
00320 protected:
00321   enum State {
00322     STATE_NONE, 
00323     STATE_INIT, 
00324     STATE_WAIT_FOR_POWER_ON, 
00325     STATE_CHANGE_BAUD, 
00326     STATE_CONFIGURE, 
00327     STATE_WAIT_FOR_CONFIGURE_ACK, 
00328     STATE_INSTALL_MODE, 
00329     STATE_WAIT_FOR_INSTALL_MODE_ACK, 
00330     STATE_SET_MODE, 
00331     STATE_WAIT_FOR_SET_MODE_ACK, 
00332     STATE_START_READINGS, 
00333     STATE_WAIT_FOR_START_ACK, 
00334     STATE_CONNECTED 
00335   };
00337   void filterReadings();
00339   void filterAddAndCleanCumulative(double x, double y, bool clean);
00341   void filterFarAndOldCumulative(void);
00343   AREXPORT void switchState(State state);
00345   std::list<double> myIgnoreReadings;
00346   State myState;
00347   unsigned int myMinRange;
00348   ArTime myStateStart;
00349   ArFunctorC<ArSick> myRobotConnectCB;
00350   ArRetFunctor1C<bool, ArSick, ArRobotPacket *> mySimPacketHandler;
00351   ArFunctorC<ArSick> mySensorInterpCB;
00352   std::list<ArSensorReading *>::iterator myIter;
00353   bool myStartConnect;
00354   bool myRunningOnRobot;
00355   int myTimeoutTime;
00356 
00357   // range buffers to hold current range set and assembling range set
00358   std::list<ArSensorReading *> *myAssembleReadings;
00359   std::list<ArSensorReading *> *myCurrentReadings;
00360 
00361   bool myProcessImmediately;
00362   bool myInterpolation;
00363   // list of packets, so we can process them from the sensor callback
00364   std::list<ArSickPacket *> myPackets;
00365 
00366   // a lock for the device (so we are mostly unlocked for people to get data, 
00367   // but so we don't have people trying to read multiple times from the same 
00368   // device
00369   ArMutex myConnLock;
00370 
00371   // whether we did a real configure or a short configure
00372   bool myRealConfigured;
00373   
00374   // these two are just for the sim packets
00375   unsigned int myWhichReading;
00376   unsigned int myTotalNumReadings;
00377 
00378   // some variables so we don't have to do a tedios if every time
00379   double myOffsetAmount;
00380   double myIncrementAmount;
00381 
00382   // packet stuff
00383   ArSickPacket myPacket;
00384   bool myRunInOwnThread;
00385   bool myUseSim;
00386   bool myLaserFlipped;
00387   ArPose mySensorPose;
00388   bool myPowerControl;
00389   BaudRate myBaud;
00390   Degrees myDegrees;
00391   Increment myIncrement;
00392   Units myUnits;
00393   Bits myBits;
00394   ArTime myLastReading;
00395   
00396   // stuff for the sim packet
00397   ArPose mySimPacketStart;
00398   ArTransform mySimPacketTrans;
00399   ArTransform mySimPacketEncoderTrans;
00400   unsigned int mySimPacketCounter;
00401 
00402   // packet count
00403   time_t myTimeLastSickPacket;
00404   int mySickPacCurrentCount;
00405   int mySickPacCount;
00406 
00407   // connection
00408   ArSickPacketReceiver mySickPacketReceiver;
00409   ArDeviceConnection *myConn;
00410   std::list<ArFunctor *> myConnectCBList;
00411   std::list<ArFunctor *> myFailedConnectCBList;
00412   std::list<ArFunctor *> myDisconnectNormallyCBList;
00413   std::list<ArFunctor *> myDisconnectOnErrorCBList;
00414   std::list<ArFunctor *> myDataCBList;
00415 
00416   ArTime myLastCleanedCumulative;
00417   // filtering parameters, see the docs in the acessor
00418   double myFilterNearDist;  
00419   double myFilterCumulativeInsertMaxDist; 
00420   double myFilterSquaredCumulativeInsertMaxDist;
00421   double myFilterCumulativeNearDist; 
00422   double myFilterSquaredCumulativeNearDist; 
00423   double myFilterCumulativeCleanDist; 
00424   double myFilterSquaredCumulativeCleanDist; 
00425   int myFilterCleanCumulativeInterval; 
00426 
00427   ArMutex myStateMutex;
00428   ArRetFunctor1C<bool, ArSick, bool> myAriaExitCB;
00429 };
00430 
00431 #endif //ARSICK_H

Generated on Tue Feb 20 10:51:41 2007 for Aria by  doxygen 1.4.0