00001 #ifndef H_CPDEMOTOOLS
00002 #define H_CPDEMOTOOLS
00003
00004
00005 #include <vector>
00006
00007
00008 #define RANSAC_MAX_ITER 150
00009 #define RANSAC_PLANE_SEPDIST 0.1f
00010 #define RANSAC_PLANE_MINNUM 30
00011 #define RANSAC_PLANE_THRESH 0.01f
00012 #define RANSAC_FLOOR_ANGTHRESH 0.1f
00013 #define RANSAC_FLOOR_MAGTHRESH 0.1f
00014
00015
00016 #define MODE_NONE 0
00017 #define MODE_TRACK 1
00018 #define MODE_EXPLORE 2
00019
00020 #define NUM_INC_ANG 13
00021 #define NUM_INC_RNG 20
00022 #define NUM_INC_X 25
00023 #define NUM_INC_Z 25
00024
00025
00026 struct Square
00027 {
00028 public:
00029 double a;
00030 double r;
00031 double x;
00032 double z;
00033 unsigned int c;
00034 };
00035
00036
00037 struct Twist
00038 {
00039 public:
00040 double linear;
00041 double angular;
00042 };
00043
00044
00045 struct Point
00046 {
00047 public:
00048 float x;
00049 float y;
00050 float z;
00051 float rgb;
00052 };
00053
00054
00055 struct PointCloud
00056 {
00057 public:
00058 std::vector<Point> points;
00059 };
00060
00061 class ClearpathDemoTools
00062 {
00063 public:
00064
00065 ClearpathDemoTools();
00066 virtual ~ClearpathDemoTools();
00067
00068
00069
00070
00071
00072 static bool PlaneRANSAC(PointCloud* cloud, double* normal_coeff, bool match_coeff);
00073 static bool PlaneLS(PointCloud* cloud, double* normal_coeff);
00074 static void PlaneSegment(PointCloud* cloud, PointCloud* plane, PointCloud* seg_cloud, double* norm, double thresh);
00075 static bool TransformByNormal(PointCloud* cloud, PointCloud* cloud_out, double* normal_coeff);
00076 static void VerticalCut(PointCloud* cloud, PointCloud* cloud_out, double min, double max, int skim_factor);
00077 static Twist DetermineVelocity(double x, double z, double speed);
00078
00079
00080
00081
00082
00083 void InitTrack(double _lin_speed,
00084 double _ang_speed,
00085 double _cam_height,
00086 double _cam_z_trans,
00087 double _window_size);
00088 void InitExplore(double _lin_speed,
00089 double _ang_speed,
00090 double _cam_height,
00091 double _cam_z_trans,
00092 double _wall_buffer,
00093 int _random_walk);
00094 void NIUpdate(float* px, float* py, float* pz, unsigned int len, double* return_lin_vel, double* return_ang_vel);
00095 Twist Update(PointCloud* cloud, PointCloud* result);
00096
00097
00098
00099
00100
00101 int mode;
00102
00103 unsigned int numIncX;
00104 unsigned int numIncZ;
00105
00106 double lin_speed;
00107 double ang_speed;
00108 double cam_height;
00109 double cam_z_trans;
00110
00111 Square* init_map;
00112 Square* mapc;
00113
00114 double last_normal[4];
00115 double base_normal[4];
00116 bool normal_initialized;
00117
00118 PointCloud cloudCopy;
00119 PointCloud cloudCut;
00120 PointCloud seg;
00121 PointCloud plane;
00122 PointCloud final;
00123
00124 double minAng;
00125 double maxAng;
00126 double minX;
00127 double maxX;
00128 double minZ;
00129 double maxZ;
00130 double incX;
00131 double incZ;
00132 unsigned int drawInc;
00133 unsigned int obstacleThreshold;
00134
00135
00136
00137
00138
00139 double targetX;
00140 double targetZ;
00141 double targetW;
00142
00143
00144
00145
00146
00147 int random_walk;
00148 double wall_buffer;
00149 bool old_clearpath;
00150 int old_dir;
00151
00152 private:
00153
00154
00155
00156
00157
00158 static bool GetPlaneFromRnd3(PointCloud* cloud, double* normal_coeff);
00159
00160
00161
00162
00163
00164 void Init(double _lin_speed,
00165 double _ang_speed,
00166 double _cam_height,
00167 double _cam_z_trans,
00168 unsigned int _numIncX,
00169 unsigned int _numIncZ);
00170
00171 void getBins(double x, double z, unsigned int* binX, unsigned int* binZ);
00172 };
00173
00174 #endif