major refactoring of path

This commit is contained in:
Johannes Reinhardt 2008-07-12 12:21:49 +02:00
parent a1e53f0871
commit 12d711e9c2
3 changed files with 56 additions and 29 deletions

View File

@ -6,15 +6,19 @@
void trial_loop(trial *t) { void trial_loop(trial *t) {
path *p; path *p;
int offset;
do { do {
if (-1 == trial_wait_for_start(t)) return; if (-1 == trial_wait_for_start(t)) return;
if (t->finished) break; if (t->finished) break;
p = path_new();
/*create trivial path towards the origin*/ /*create trivial path towards the origin*/
p = path_new(&t->map, &t->vehicle); offset = path_app_fitseq(p,t,0);
offset = path_app_target(p,t,offset,0,0);
while (t->alive) { while (t->alive) {
path_execute(t,p); path_execute(t,p);
if (-1 == trial_check_input(t)) return; if (-1 == trial_check_input(t)) return;
} }
trial_matlab(t);
trial_reset_run(t); trial_reset_run(t);
path_free(p); path_free(p);
} while (!t->finished); } while (!t->finished);
@ -33,7 +37,6 @@ int main(int argc, char **argv) {
} }
trial_loop(t); trial_loop(t);
trial_matlab(t);
trial_free(t); trial_free(t);

View File

@ -23,35 +23,11 @@ double angle_for_rot(double from, double to) {
return a; return a;
} }
path *path_new(map* m,vehicle *v){ path *path_new(){
command* tmp;
path* res; path* res;
double angle, stop;
res = g_slice_new(path); res = g_slice_new(path);
res->commands = g_queue_new(); res->commands = g_queue_new();
/* Calculate a trivial path to the origin*/
/* Turn towards origin, take shorter direction*/
angle = atan2(-v->y,-v->x)*180/M_PI;
angle = angle_for_rot(v->dir, angle);
stop = abs(angle)/m->max_hard_turn*1000;
printf("Angle: %f stop: %f\n",angle,stop);
if(angle > 0){
/*clockwise/left turn*/
tmp = command_new(0,BREAK,TURN_HARD_LEFT);
g_queue_push_tail(res->commands,tmp);
} else {
/*counterclockwise/right turn*/
tmp = command_new(0,BREAK,TURN_HARD_RIGHT);
g_queue_push_tail(res->commands,tmp);
}
tmp = command_new(stop,ACCEL,TURN_STRAIGHT);
g_queue_push_tail(res->commands,tmp);
/*start driving*/
// tmp = command_new(stop,ACCEL,TURN_STRAIGHT);
// g_queue_push_tail(res->commands,tmp);
return res; return res;
} }
@ -82,7 +58,7 @@ void path_execute(trial* t,path* p){
switch(tmp->accel){ switch(tmp->accel){
case ACCEL: vehicle_accel(t); break; case ACCEL: vehicle_accel(t); break;
case ROLL: vehicle_roll(t); break; case ROLL: vehicle_roll(t); break;
case BREAK: vehicle_break(t); break; case BRAKE: vehicle_break(t); break;
} }
command_free(tmp); command_free(tmp);
tmp = (command*) g_queue_peek_head(p->commands); tmp = (command*) g_queue_peek_head(p->commands);
@ -107,3 +83,49 @@ void path_free(path* p){
} }
/*common path building bricks, to be called in rest*/
int path_app_target(path* p, trial* t,int offset, int x, int y){
command* tmp;
double angle, stop;
vehicle* v;
map* m;
v = &t->vehicle;
m = &t->map;
/* Turn towards origin, take shorter direction, TODO: fix, thats only an approximation*/
angle = atan2(y-v->y,x-v->x)*180/M_PI;
angle = angle_for_rot(v->dir, angle);
stop = abs(angle)/m->max_hard_turn*1000;
printf("Angle: %f stop: %f\n",angle,stop);
if(angle > 0){
/*clockwise/left turn*/
tmp = command_new(offset,BRAKE,TURN_HARD_LEFT);
g_queue_push_tail(p->commands,tmp);
} else {
/*counterclockwise/right turn*/
tmp = command_new(offset,BRAKE,TURN_HARD_RIGHT);
g_queue_push_tail(p->commands,tmp);
}
/*start driving*/
tmp = command_new(offset + stop,ACCEL,TURN_STRAIGHT);
g_queue_push_tail(p->commands,tmp);
return stop;
}
int path_app_fitseq(path* p, trial* t,timestamp offset){
command* tmp;
int testtime = 300;
tmp = command_new(offset,ACCEL,TURN_STRAIGHT);
g_queue_push_tail(p->commands,tmp);
tmp = command_new(offset+testtime,ROLL,TURN_STRAIGHT);
g_queue_push_tail(p->commands,tmp);
tmp = command_new(offset+2*testtime,BRAKE,TURN_STRAIGHT);
g_queue_push_tail(p->commands,tmp);
return 3*testtime;
}

View File

@ -24,9 +24,11 @@ command *command_new(timestamp ts, accel_t a, turn_t t);
void command_free(command* c); void command_free(command* c);
path *path_new(map* m,vehicle *c); path *path_new();
void path_execute(trial* t,path* p); void path_execute(trial* t,path* p);
void path_free(path* p); void path_free(path* p);
int path_app_fitseq(path* p, trial* t, timestamp offset);
int path_app_target(path* p, trial* t, int offset, int x, int y);
#endif #endif