Project

General

Profile

Statistics
| Branch: | Revision:

root / scout / libscout / src / behaviors / navigationMap.cpp @ 31be19a6

History | View | Annotate | Download (5.33 KB)

1
#include "navigationMap.h"
2

    
3
/** @brief Initializes the map */
4
navigationMap::navigationMap(std::string scoutname) : Behavior(scoutname, "navigationMap")
5
{
6
  /** Initialize Map 
7
   *
8
   *   1           2          3         4
9
   *  ----|-----------|----------|---------|---------->
10
   *  <---|--5--------|--6-------|--7------|--8-------
11
   *      |           |          |         |
12
   *     9|         10|        11|       12|
13
   *      |           |          |         |
14
   *     ---         ---        ---       ---
15
   */
16
  
17
    Edge* a1 = new Edge[ARRAY_SIZE];
18
    a1[0] = MAKE_EDGE(ISTRAIGHT, 2, 10);
19
    a1[1] = MAKE_EDGE(IRIGHT, 9, 40);
20
    a1[2] = MAKE_EDGE(IUTURN, DEADEND, 0);
21

    
22
    Edge* a2 = new Edge[ARRAY_SIZE]; 
23
    a2[0] = MAKE_EDGE(ISTRAIGHT, 3, 10);
24
    a2[1] = MAKE_EDGE(IRIGHT, 10, 40);
25
    a2[2] = MAKE_EDGE(IUTURN, 5, 10);
26

    
27
    Edge* a3 = new Edge[ARRAY_SIZE]; 
28
    a3[0] = MAKE_EDGE(ISTRAIGHT, 4, 10);
29
    a3[1] = MAKE_EDGE(IRIGHT, 11, 40);
30
    a3[2] = MAKE_EDGE(IUTURN, 6, 10);
31

    
32
    Edge* a4 = new Edge[ARRAY_SIZE]; 
33
    a4[0] = MAKE_EDGE(ISTRAIGHT, DEADEND, 0);
34
    a4[1] = MAKE_EDGE(IRIGHT, 12, 40);
35
    a4[2] = MAKE_EDGE(IUTURN, 7, 10);
36

    
37
    Edge* a5 = new Edge[ARRAY_SIZE];
38
    a5[0] = MAKE_EDGE(ISTRAIGHT, DEADEND, 0);
39
    a5[1] = MAKE_EDGE(ILEFT, 9, 40);
40
    a5[2] = MAKE_EDGE(IUTURN, 2, 10);
41

    
42
    Edge* a6 = new Edge[ARRAY_SIZE];
43
    a6[0] = MAKE_EDGE(ISTRAIGHT, 5, 0);
44
    a6[1] = MAKE_EDGE(ILEFT, 10, 40);
45
    a6[2] = MAKE_EDGE(IUTURN, 3, 10);
46

    
47
    Edge* a7 = new Edge[ARRAY_SIZE];
48
    a7[0] = MAKE_EDGE(ISTRAIGHT, 6, 0);
49
    a7[1] = MAKE_EDGE(ILEFT, 11, 40);
50
    a7[2] = MAKE_EDGE(IUTURN, 3, 10);
51

    
52
    Edge* a8 = new Edge[ARRAY_SIZE];
53
    a8[0] = MAKE_EDGE(ISTRAIGHT, 7, 0);
54
    a8[1] = MAKE_EDGE(ILEFT, 12, 40);
55
    a8[2] = MAKE_EDGE(IUTURN, DEADEND, 10);
56

    
57
    Edge* a9 = new Edge[ARRAY_SIZE];
58
    a9[0] = MAKE_EDGE(IRIGHT, 2, 10);
59
    a9[1] = MAKE_EDGE(ILEFT, DEADEND, 0);
60
    a9[2] = MAKE_EDGE(IUTURN, 9, 40);
61

    
62
    Edge* a10 = new Edge[ARRAY_SIZE];
63
    a10[0] = MAKE_EDGE(IRIGHT, 3, 10);
64
    a10[1] = MAKE_EDGE(ILEFT, 5, 10);
65
    a10[2] = MAKE_EDGE(IUTURN, 10, 40);
66

    
67
    Edge* a11 = new Edge[ARRAY_SIZE];
68
    a11[0] = MAKE_EDGE(IRIGHT, 4, 10);
69
    a11[1] = MAKE_EDGE(ILEFT, 6, 10);
70
    a11[2] = MAKE_EDGE(IUTURN, 11, 40);
71

    
72
    Edge* a12 = new Edge[ARRAY_SIZE];
73
    a12[0] = MAKE_EDGE(IRIGHT, DEADEND, 0);
74
    a12[1] = MAKE_EDGE(ILEFT, 7, 10);
75
    a12[2] = MAKE_EDGE(IUTURN, 12, 40);
76

    
77
    map.push_back(a1);
78
    map.push_back(a2);
79
    map.push_back(a3);
80
    map.push_back(a4);
81
    map.push_back(a5);
82
    map.push_back(a6);
83
    map.push_back(a7);
84
    map.push_back(a8);
85
    map.push_back(a9);
86
    map.push_back(a10);
87
    map.push_back(a11);
88
    map.push_back(a12);
89

    
90
    curr_state = START_STATE;
91
    eta = 99999;
92
}
93

    
94
/** @brief Goes through and frees all allocated memory */
95
navigationMap::~navigationMap()
96
{
97
  while(!map.empty())
98
  {
99
    Edge* temp = map.back();
100
    map.pop_back();
101
    delete temp;
102
  }
103
  return;
104
}
105

    
106
navigationMap::run()
107
{
108

    
109
}
110

    
111
navigationMap::update_state(Turn turn_made)
112
{
113
  Edge* possible_edges = get_outbound_edges(curr_state);
114
  int arr_size = sizeof(possible_edges)/sizeof(Edge);
115
  for(int i=0;i<arr_size;i++)
116
  {
117
    //sets the current state to the state associated with the turn made
118
    if(GET_EDGE_DIR(possible_edges[i]) == turn_made)
119
    {
120
      int speed = 10000;//its over 9000
121
      curr_state = GET_EDGE_STATE(possible_edges[i]);
122
      //TODO: get actual speed
123
      arrival_time = ros::Time::now() + 
124
        GET_EDGE_DIST(possible_edges[i])/speed;
125
      return curr_state;
126
    }
127
  }
128
  return -1;//failure to succeed
129
}
130

    
131
navigationMap::get_eta()
132
{
133
  return arrival_time;
134
}
135

    
136
navigationMap::get_time_remaining()
137
{
138
  return (arrival_time - ros::Time::now());
139
}
140

    
141
navigationMap::get_state()
142
{
143
  return curr_state;
144
}
145

    
146
navigationMap::get_outbound_edges(State state)
147
{
148
  return map(state-1); 
149
}
150

    
151
Path navigationMap::shortest_path(State target_state)
152
{
153
  // BFS algorithm
154
  State curr_state = get_state();
155
  int visited[MAX_NODES+1] = {0};
156

    
157
  queue<State> q;
158
  q.push(curr_state);
159
  // not zero = visited, zero = unvisited, negative = start state
160
  visited[curr_state] = -1;
161

    
162
  while (!q.empty())
163
  {
164
    State state = q.front();
165
    //actually dequeue it
166
    q.pop();
167
    if (state == target_state)
168
    {   
169
      Path path;
170
      int j = 0; // counter
171
      for(State child = state; visited[child] >= 0; 
172
          child = visited[child]) //while not start state
173
      {
174
        State parent = visited[child];
175
        Edge* edges = get_outbound_edges(parent);
176
        for (int i = 0; i < ARRAY_SIZE; i++)
177
        {
178
          if (GET_EDGE_STATE(edges[i]) == child)
179
          {
180
            path.path[j] = GET_EDGE_DIR(edges[i]);
181
            j++;
182
            break;
183
          }
184
        }
185
      }
186
      /** Reverse moves list */
187
      for (int i = 0; i < j/2; i++)
188
      {
189
        path.path[i] ^= path.path[j-i-1];
190
        path.path[j-i-1] ^= path.path[i];
191
        path.path[i] ^= path.path[j-i-1];
192
      }
193
      path.len = j;
194
      return path;
195
    }
196
    Edge* edges = get_outbound_edges(state);
197
    for (int i = 0; i < ARRAY_SIZE; i++)
198
    {
199
      State new_state = GET_EDGE_STATE(edges[i]);
200
      if (new_state != DEADEND && !visited[new_state]) 
201
      {
202
        // set visited to the parent of the new state
203
        visited[new_state] = state;
204
        q.push(new_state);
205
      }
206
    }
207
  }
208
  //oops, no way to get to target from state
209
  Path path;
210
  path.len = 0;
211
  path.path = NULL;
212
  return path;
213
}
214

    
215