00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
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
00358 std::list<ArSensorReading *> *myAssembleReadings;
00359 std::list<ArSensorReading *> *myCurrentReadings;
00360
00361 bool myProcessImmediately;
00362 bool myInterpolation;
00363
00364 std::list<ArSickPacket *> myPackets;
00365
00366
00367
00368
00369 ArMutex myConnLock;
00370
00371
00372 bool myRealConfigured;
00373
00374
00375 unsigned int myWhichReading;
00376 unsigned int myTotalNumReadings;
00377
00378
00379 double myOffsetAmount;
00380 double myIncrementAmount;
00381
00382
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
00397 ArPose mySimPacketStart;
00398 ArTransform mySimPacketTrans;
00399 ArTransform mySimPacketEncoderTrans;
00400 unsigned int mySimPacketCounter;
00401
00402
00403 time_t myTimeLastSickPacket;
00404 int mySickPacCurrentCount;
00405 int mySickPacCount;
00406
00407
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
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