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 ~DijkstraExpansion();
00060 bool calculatePotentials(unsigned char* costs, double start_x, double start_y, double end_x, double end_y, int cycles,
00061 float* potential);
00062
00068 void setSize(int nx, int ny);
00070 void setNeutralCost(unsigned char neutral_cost) {
00071 neutral_cost_ = neutral_cost;
00072 priorityIncrement_ = 2 * neutral_cost_;
00073 }
00074
00075 void setPreciseStart(bool precise){ precise_ = precise; }
00076 private:
00077
00084 void updateCell(unsigned char* costs, float* potential, int n);
00086 float getCost(unsigned char* costs, int n) {
00087 float c = costs[n];
00088 if (c < lethal_cost_ - 1 || (unknown_ && c==255)) {
00089 c = c * factor_ + neutral_cost_;
00090 if (c >= lethal_cost_)
00091 c = lethal_cost_ - 1;
00092 return c;
00093 }
00094 return lethal_cost_;
00095 }
00096
00098 int *buffer1_, *buffer2_, *buffer3_;
00099 int *currentBuffer_, *nextBuffer_, *overBuffer_;
00100 int currentEnd_, nextEnd_, overEnd_;
00101 bool *pending_;
00102 bool precise_;
00103
00105 float threshold_;
00106 float priorityIncrement_;
00108 };
00109 }
00110 #endif