Project

General

Profile

Revision 599

General work on SLAM

View differences:

server_main.c
1 1
#include <stdio.h>
2 2
#include <stdlib.h>
3
#include <time.h>
3
#include <sys/time.h>
4 4
#include "data_requests.h"
5 5
#include "queue.h"
6 6
#include "math.h"
7 7

  
8
#define DEFAULT_WIDTH 50
9
#define DEFAULT_HEIGHT 50
8
#define DEFAULT_WIDTH 512
9
#define DEFAULT_HEIGHT 512
10 10
#define MAX_MAPS 30
11 11

  
12 12
#define MAX_ID 20
......
22 22
  short robot_id;
23 23
} Data;
24 24

  
25
typedef struct robotScreenShot{
26
  char robot_current_map;
27
  double robot_orientation; //-PI to PI
25
/** 
26
* Map oriented data.
27
*/
28

  
29
typedef struct Map{
30
  int data[DEFAULT_WIDTH][DEFAULT_HEIGHT];
28 31
  int robot_x;
29 32
  int robot_y;
30
} RobotScreenShot;
33
  double robot_orientation;
34
  short robot_id;
35
  char correlation_group;  
36
} Map;
31 37

  
32
/*
33
This is the game plan if anyone is interested.
34
Each robot will go for an unspecified amount of time,
35
accruing encoder, BOM, and IR data.  The IR and encoders
36
will be used to generate heat maps for each robot, starting
37
at the center, decreasing in certainty (i.e. the amount of
38
'color' put on during a time unit will be spread over a greater
39
area) over time according to the physical limitations of 
40
the measuring devices.
38
Map** map_array;
39
int map_count;
41 40

  
42
When the uncertainty gets too high, a new map will be allocated for
43
the robot.
44

  
45
The BOM data will be used to orient individual maps to one another.
46
Along with physical limitations on the size of the environment, and
47
hopefully some brainstorming to do with triangularization and what not,
48
the heat maps will become increasingly well oriented.
49

  
50
Finally, after a currently unspecified amount of time, the maps which have
51
been properly oriented (this could probably just be all of them due to the nature
52
of the heat maps,) will be summed up into one meta map! Metamap will undergo some
53
signal processing, probably in the form of a second order gradient, to get a map
54
of magnitudes, which we will try to further reduce to lines.  These lines are the
55
walls of the environment.
56

  
57
In time, it is possible that this "unspecfied amount of time" could become a continuous
58
computation, but I haven't put much thought into how this will scale.  It will almost 
59
definitely depend upon the chosen resolution of the heat map.
60

  
61
I do want people working with me, this should be a lot of fun,
62
I'm coming to accept the fact that I'm not a very good programmer,
63
but I think this is a solid method of doing SLAM.
64
*/
65

  
66

  
67

  
68
/** 
69
* Map oriented data.
70
*/
71
int* map_array[MAX_MAPS][DEFAULT_WIDTH][DEFAULT_HEIGHT];
72
short map_ids[MAX_MAPS];
73
char map_correlated[MAX_MAPS];
74

  
75 41
/**Robot oriented data.**/
76 42
Queue* dataQueue;
43
int robot_map[MAX_ID];
77 44

  
78 45
/*These functions simply add the data to the queue.*/
79 46
void bom_handler(short id, BomNode** head);
80 47
void IR_handler(short id, short** data);
81 48
void encoder_handler(short id, unsigned char** data);
82 49

  
50
void slam_analyze(void);
83 51
void bom_analyze(BomNode* head,short robot_id);
84 52
void IR_analyze(short* data, short robot_id);
85 53
void encoder_analyze(unsigned char* data, short robot_id);
86 54

  
55
void initialize(void);
87 56

  
57
int main(void){
58
  data_requests_init(bom_handler,IR_handler,encoder_handler);
59
  dataQueue = queue_create();
60
  initialize();
61
  slam_analyze(); 
62
  return -1;
63
}
64

  
65
void initialize(void){
66
  map_array = malloc(MAX_MAPS * sizeof(Map*));
67
  map_count = 0;
68
  int i;
69
  for(i=0; i<MAX_ID;i++){
70
    robot_map[i] = -1;
71
  }
72
}
73

  
88 74
void slam_analyze(void){
89 75
  Data* current_data;
90 76
  while(1){
91 77
    if(!queue_is_empty(dataQueue)){
78
      if(queue_size(dataQueue) < 5){
79
        //request_all(/*The robot that most needs it*/);
80
      }
92 81
      current_data = (Data*)queue_remove(dataQueue);
93 82
      switch(current_data->type){
94 83
      
......
108 97
  }
109 98
}
110 99

  
111

  
112
int main(void){
113
  data_requests_init(bom_handler,IR_handler,encoder_handler);
114
  dataQueue = queue_create();
115
  slam_analyze(); 
116
  return -1;
100
void initialize_map(int robot_id){
101
    int i,j;
102
    map_array[map_count] = (Map*)malloc(sizeof(Map));
103
    for(i=0;i<DEFAULT_WIDTH;i++){
104
        for(j=0;j<DEFAULT_HEIGHT;j++){
105
          map_array[map_count]->data[i][j] = 0;
106
        }
107
    }
108
    map_array[map_count]->robot_x = DEFAULT_WIDTH / 2;
109
    map_array[map_count]->robot_y = DEFAULT_HEIGHT/ 2;
110
    map_array[map_count]->robot_orientation = 0;
111
    map_array[map_count]->robot_id = robot_id;
112
    map_array[map_count]->correlation_group = -1;
113
    robot_map[robot_id] = map_count++;
117 114
}
118 115

  
119

  
120 116
void bom_analyze(BomNode* head, short robot_id){
121 117
  BomNode* current_node = head;
118
  if(robot_map[robot_id]==-1) initialize_map(robot_id);
119
      
122 120
  while(current_node!=NULL){
123
     
121
    
124 122
    current_node = current_node->next;
125 123
  }
126 124
}
127 125

  
128 126
void IR_analyze(short* data, short robot_id){
127
  if(robot_map[robot_id]==-1) initialize_map(robot_id);
129 128

  
130 129
}
131 130

  
132 131
void encoder_analyze(unsigned char* data, short robot_id){
132
  if(robot_map[robot_id]==-1) initialize_map(robot_id);
133 133

  
134 134
}
135 135

  
136
/*The packet handling functions for data requests.*/
136
/*The packet handling functions for nata requests.*/
137 137

  
138 138
void bom_handler(short id, BomNode** head){
139 139
  Data* newData = malloc(sizeof(Data));
140 140
  newData->type = BOM_TYPE;
141 141
  newData->data.u_b = (*head);
142 142
  newData->robot_id = id;
143
  newData->timeStamp = malloc(sizeof(struct timeval));
143 144
 
144 145
  gettimeofday(&newData->timeStamp,NULL);
145 146

  
......
178 179
*/
179 180
void rotate_map(int*** map, double radians){
180 181
  int i,j;
181
  double iprime, jprime, xoffset, yoffset;
182
  double iprime, jprime, xoffset, yoffset, R1, R2, R3, R4, A;
182 183
  int i2,j2;
183
  int new_map[DEFAULT_WIDTH][DEFAULT_HEIGHT];
184
  
184
  int** new_map;
185
  new_map = malloc(DEFAULT_WIDTH*sizeof(int*)); 
185 186
  for(i=0;i<DEFAULT_WIDTH;i++){
187
      *(new_map+i) = malloc(DEFAULT_HEIGHT * sizeof(int));
186 188
      for(j=0;j<DEFAULT_WIDTH;i++){
187 189
          new_map[i][j] = 0;
188 190
      }
......
199 201
         xoffset = iprime - i2;
200 202
         yoffset = jprime - j2;
201 203
         
204
         R1 = sqrt(xoffset*xoffset + yoffset*yoffset)*(double)((*map)[i][j]);
205
         R2 = sqrt((1-xoffset)*(1-xoffset) + yoffset*yoffset)*(double)((*map)[i][j]);
206
         R3 = sqrt(xoffset*xoffset + (1-yoffset)*(1-yoffset))*(double)((*map)[i][j]);
207
         R4 = sqrt((1-xoffset)*(1-xoffset) + (1-yoffset)*(1-yoffset))*(double)((*map)[i][j]);
208
         A = 1/(R1+R2+R3+R4); 
209
         
202 210
         //If the new coordinates are legal...
203 211
         if(i2 < DEFAULT_WIDTH && i2 >= 0 && j2 < DEFAULT_HEIGHT && j2 >= 0)
204
             new_map[i2][j2] += (int)(sqrt(xoffset*xoffset + yoffset*yoffset)*(double)((*map)[i][j]));
205
         
212
             new_map[i2][j2] += (int)((R1*A)*(double)((*map)[i][j]));
206 213
         if(i2 + 1 < DEFAULT_WIDTH && i2 + 1 >= 0 && j2 < DEFAULT_HEIGHT && j2 >= 0)
207
             new_map[i2+1][j2] += (int)(sqrt((1-xoffset)*(1-xoffset) + yoffset*yoffset)*(double)((*map)[i][j]));
208
         
214
             new_map[i2+1][j2] += (int)((R2*A)*(double)((*map)[i][j]));
209 215
         if(i2 < DEFAULT_WIDTH && i2 >= 0 && j2 + 1 < DEFAULT_HEIGHT && j2 + 1 >= 0)
210
             new_map[i2][j2+1] += (int)(sqrt(xoffset*xoffset + (1-yoffset)*(1-yoffset))*(double)((*map)[i][j]));
211
        
212
        if(i2 + 1 < DEFAULT_WIDTH && i2 + 1 >= 0 && j2 + 1 < DEFAULT_HEIGHT && j2 + 1 >= 0)
213
             new_map[i2+1][j2+1] += (int)(sqrt((1-xoffset)*(1-xoffset) + (1-yoffset)*(1-yoffset))*(double)((*map)[i][j]));
216
             new_map[i2][j2+1] += (int)((R3*A)*(double)((*map)[i][j]));
217
         if(i2 + 1 < DEFAULT_WIDTH && i2 + 1 >= 0 && j2 + 1 < DEFAULT_HEIGHT && j2 + 1 >= 0)
218
             new_map[i2+1][j2+1] += (int)((R4*A)*(double)((*map)[i][j]));
214 219
      }
215 220
  }
216 221
  
217
  //Incompatible types? FIXME
218 222
  (*map) = new_map;
219 223
  return;
220 224
}

Also available in: Unified diff