Project

General

Profile

Statistics
| Branch: | Revision:

root / scout / libscout / src / behaviors / navigationMap.cpp @ cccc25c9

History | View | Annotate | Download (6.33 KB)

1
#include "navigationMap.h"
2

    
3
using namespace std;
4

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

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

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

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

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

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

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

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

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

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

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

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

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

    
92
    curr_state = START_STATE;
93
    arrival_time = ros::TIME_MAX;
94
}
95

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

    
108
void navigationMap::run()
109
{
110
  Duration t;
111
  ROS_INFO("My state is: %d\n", curr_state);
112
  //Straight, straight, right, left, straight 5
113
  update_state(ISTRAIGHT);
114
  ROS_INFO("My state is: %d\n", curr_state);
115
  t = get_time_remaining();
116
  while(t.toSec() > 0)
117
    t = get_time_remaining();
118
  update_state(ISTRAIGHT);
119
  ROS_INFO("My state is: %d\n", curr_state);
120
  t = get_time_remaining();
121
  while(t.toSec() > 0)
122
    t = get_time_remaining();
123
  update_state(IRIGHT);
124
  ROS_INFO("My state is: %d\n", curr_state);
125
  t = get_time_remaining();
126
  while(t.toSec() > 0)
127
    t = get_time_remaining();
128
  update_state(ILEFT);
129
  ROS_INFO("My state is: %d\n", curr_state);
130
  t = get_time_remaining();
131
  while(t.toSec() > 0)
132
    t = get_time_remaining();
133
  update_state(ISTRAIGHT);
134
  ROS_INFO("My state is: %d\n", curr_state);
135
  t = get_time_remaining();
136
  while(t.toSec() > 0)
137
    t = get_time_remaining();
138
  ROS_INFO("Traveled route!\n");
139
  while(ok())
140
    continue;
141
}
142

    
143
State navigationMap::update_state(Turn turn_made)
144
{
145
  Edge* possible_edges = get_outbound_edges(curr_state);
146
  int arr_size = sizeof(possible_edges)/sizeof(Edge);
147
  for(int i=0;i<arr_size;i++)
148
  {
149
    //sets the current state to the state associated with the turn made
150
    if(GET_EDGE_DIR(possible_edges[i]) == turn_made)
151
    {
152
      int speed = 10000;//its over 9000
153
      curr_state = GET_EDGE_STATE(possible_edges[i]);
154
      //TODO: get actual speed
155
      Duration travel_time(GET_EDGE_DIST(possible_edges[i])/speed);
156
      arrival_time = Time::now() + travel_time;
157
      return curr_state;
158
    }
159
  }
160
  return -1;//failure to succeed
161
}
162

    
163
Time navigationMap::get_eta()
164
{
165
  return arrival_time;
166
}
167

    
168
Duration navigationMap::get_time_remaining()
169
{
170
  return (arrival_time - Time::now());
171
}
172

    
173
State navigationMap::get_state()
174
{
175
  return curr_state;
176
}
177

    
178
Edge* navigationMap::get_outbound_edges(State state)
179
{
180
  return map.at(state-1); 
181
}
182

    
183
Path navigationMap::shortest_path(State target_state)
184
{
185
  // BFS algorithm
186
  State curr_state = get_state();
187
  int visited[MAX_NODES+1] = {0};
188

    
189
  queue<State> q;
190
  q.push(curr_state);
191
  // not zero = visited, zero = unvisited, negative = start state
192
  visited[curr_state] = -1;
193

    
194
  while (!q.empty())
195
  {
196
    State state = q.front();
197
    //actually dequeue it
198
    q.pop();
199
    if (state == target_state)
200
    {   
201
      Path path;
202
      int j = 0; // counter
203
      for(State child = state; visited[child] >= 0; 
204
          child = visited[child]) //while not start state
205
      {
206
        State parent = visited[child];
207
        Edge* edges = get_outbound_edges(parent);
208
        for (int i = 0; i < ARRAY_SIZE; i++)
209
        {
210
          if (GET_EDGE_STATE(edges[i]) == child)
211
          {
212
            path.path[j] = GET_EDGE_DIR(edges[i]);
213
            j++;
214
            break;
215
          }
216
        }
217
      }
218
      /** Reverse moves list */
219
      for (int i = 0; i < j/2; i++)
220
      {
221
        path.path[i] ^= path.path[j-i-1];
222
        path.path[j-i-1] ^= path.path[i];
223
        path.path[i] ^= path.path[j-i-1];
224
      }
225
      path.len = j;
226
      return path;
227
    }
228
    Edge* edges = get_outbound_edges(state);
229
    for (int i = 0; i < ARRAY_SIZE; i++)
230
    {
231
      State new_state = GET_EDGE_STATE(edges[i]);
232
      if (new_state != DEADEND && !visited[new_state]) 
233
      {
234
        // set visited to the parent of the new state
235
        visited[new_state] = state;
236
        q.push(new_state);
237
      }
238
    }
239
  }
240
  //oops, no way to get to target from state
241
  Path path;
242
  path.len = 0;
243
  path.path = NULL;
244
  return path;
245
}
246

    
247