Go to the documentation of this file.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 #ifndef HOKUYO_HH
00026 #define HOKUYO_HH
00027
00028 #include <stdexcept>
00029 #include <termios.h>
00030 #include <string>
00031 #include <vector>
00032 #include <stdint.h>
00033 #include <limits>
00034
00036 namespace hokuyo
00037 {
00039 const uint32_t MAX_READINGS = 1128;
00040
00042 const int MAX_CMD_LEN = 100;
00043
00045 const int MAX_SKIPPED = 1000000;
00046
00048 #define DEF_EXCEPTION(name, parent) \
00049 class name : public parent { \
00050 public: \
00051 name(const char* msg) : parent(msg) {} \
00052 }\
00053
00054
00055 DEF_EXCEPTION(Exception, std::runtime_error);
00056
00058 DEF_EXCEPTION(TimeoutException, Exception);
00059
00061 DEF_EXCEPTION(CorruptedDataException, Exception);
00062
00064 DEF_EXCEPTION(RepeatedTimeException, Exception);
00065
00066 #undef DEF_EXCEPTION
00067
00069 struct LaserConfig
00070 {
00072 float min_angle;
00074 float max_angle;
00076 float ang_increment;
00078 float time_increment;
00080 float scan_time;
00082 float min_range;
00084 float max_range;
00086 float range_res;
00087 };
00088
00089
00091 struct LaserScan
00092 {
00094 std::vector<float> ranges;
00096 std::vector<float> intensities;
00098 uint64_t self_time_stamp;
00100 uint64_t system_time_stamp;
00102 LaserConfig config;
00103 };
00104
00105
00107
00123 class Laser
00124 {
00125 public:
00127 Laser();
00128
00130 ~Laser();
00131
00133
00140 void open(const char * port_name);
00141
00143
00146 void close();
00147
00149
00154 void reset();
00155
00157 bool portOpen() { return laser_fd_ != -1; }
00158
00160
00161 void setToSCIP2();
00162
00174 int sendCmd(const char* cmd, int timeout = -1);
00175
00177
00186 void getConfig(LaserConfig& config);
00187
00188
00190
00199 int pollScan(LaserScan& scan, double min_ang, double max_ang, int clustering = 0, int timeout = -1);
00200
00202
00218 int requestScans(bool intensity, double min_ang, double max_ang, int clustering = 0, int skip = 0, int num = 0, int timeout = -1);
00219
00221
00227 int serviceScan(LaserScan& scan, int timeout = -1);
00228
00230
00233 int laserOff();
00234
00236
00239 int laserOn();
00240
00242
00245 int stopScanning();
00246
00248
00251 std::string getID();
00252
00254
00257 std::string getStatus();
00258
00260
00283 long long calcLatency(bool intensity, double min_ang, double max_ang, int clustering = 0, int skip = 0, int num = 0, int timeout = -1);
00284
00286 void clearLatency()
00287 {
00288 offset_ = 0;
00289 }
00290
00293 long long getLatency()
00294 {
00295 return offset_;
00296 }
00297
00299
00302 std::string getFirmwareVersion();
00303
00305
00308 std::string getVendorName();
00309
00311
00314 std::string getProductName();
00315
00317
00320 std::string getProtocolVersion();
00321
00323
00328 bool isIntensitySupported();
00329
00332 void queryVersionInformation();
00333
00335 int laserWrite(const char* msg);
00336
00338 int laserReadline(char *buf, int len, int timeout = -1);
00339
00341 int laserFlush();
00342
00344 uint64_t readTime(int timeout = -1);
00345
00346 private:
00348
00349 long long int getHokuyoClockOffset(int reps, int timeout = -1);
00350
00352
00353 long long int getHokuyoScanStampToSystemStampOffset(bool intensity, double min_ang, double max_ang, int clustering, int skip, int reps, int timeout = -1);
00354
00356 void querySensorConfig();
00357
00359 char* laserReadlineAfter(char *buf, int len, const char *str, int timeout = -1);
00360
00362 bool checkSum(const char* buf, int buf_len);
00363
00365 void readData(LaserScan& scan, bool has_intensity, int timout = -1);
00366
00367 int dmin_;
00368 int dmax_;
00369 int ares_;
00370 int amin_;
00371 int amax_;
00372 int afrt_;
00373 int rate_;
00374
00375 int wrapped_;
00376
00377 unsigned int last_time_;
00378
00379 unsigned int time_repeat_count_;
00380
00381 long long offset_;
00382
00383 int laser_fd_;
00384
00385 std::string vendor_name_;
00386 std::string product_name_;
00387 std::string serial_number_;
00388 std::string protocol_version_;
00389 std::string firmware_version_;
00390
00391 char read_buf[256];
00392 int read_buf_start;
00393 int read_buf_end;
00394 };
00395
00396 }
00397
00398 #endif