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
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #ifndef _DIJKSTRA_H
00039 #define _DIJKSTRA_H
00040
00041 #define PRIORITYBUFSIZE 10000
00042 #include <math.h>
00043 #include <stdint.h>
00044 #include <string.h>
00045 #include <stdio.h>
00046
00047 #include <global_planner/planner_core.h>
00048 #include <global_planner/expander.h>
00049
00050
00051 #define push_cur(n) { if (n>=0 && n<ns_ && !pending_[n] && getCost(costs, n)<lethal_cost_ && currentEnd_<PRIORITYBUFSIZE){ currentBuffer_[currentEnd_++]=n; pending_[n]=true; }}
00052 #define push_next(n) { if (n>=0 && n<ns_ && !pending_[n] && getCost(costs, n)<lethal_cost_ && nextEnd_<PRIORITYBUFSIZE){ nextBuffer_[ nextEnd_++]=n; pending_[n]=true; }}
00053 #define push_over(n) { if (n>=0 && n<ns_ && !pending_[n] && getCost(costs, n)<lethal_cost_ && overEnd_<PRIORITYBUFSIZE){ overBuffer_[ overEnd_++]=n; pending_[n]=true; }}
00054
00055 namespace global_planner {
00056 class DijkstraExpansion : public Expander {
00057 public:
00058 DijkstraExpansion(PotentialCalculator* p_calc, int nx, int ny);
00059 bool calculatePotentials(unsigned char* costs, double start_x, double start_y, double end_x, double end_y, int cycles,
00060 float* potential);
00061
00067 void setSize(int nx, int ny);
00069 void setNeutralCost(unsigned char neutral_cost) {
00070 neutral_cost_ = neutral_cost;
00071 priorityIncrement_ = 2 * neutral_cost_;
00072 }
00073
00074 void setPreciseStart(bool precise){ precise_ = precise; }
00075 private:
00076
00083 void updateCell(unsigned char* costs, float* potential, int n);
00085 float getCost(unsigned char* costs, int n) {
00086 float c = costs[n];
00087 if (c < lethal_cost_ - 1 || (unknown_ && c==255)) {
00088 c = c * factor_ + neutral_cost_;
00089 if (c >= lethal_cost_)
00090 c = lethal_cost_ - 1;
00091 return c;
00092 }
00093 return lethal_cost_;
00094 }
00095
00097 int *buffer1_, *buffer2_, *buffer3_;
00098 int *currentBuffer_, *nextBuffer_, *overBuffer_;
00099 int currentEnd_, nextEnd_, overEnd_;
00100 bool *pending_;
00101 bool precise_;
00102
00104 float threshold_;
00105 float priorityIncrement_;
00107 };
00108 }
00109 #endif