Gonçalo Lopes
/
VFH
Diff: main.cpp
- Revision:
- 0:f623431aed01
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Thu May 13 15:19:19 2021 +0000 @@ -0,0 +1,100 @@ +#include "mbed.h" +#include "Robot.h" +#include "funcs.h" + +static const double pi = 3.14159265358; +DigitalIn Button(USER_BUTTON); +Serial pc(SERIAL_TX, SERIAL_RX); + + +int main() { + //Espera que o botao seja premido + while (Button == 1) {} + wait(1); + + //Matrizes de mapeamento + int Map_Matrix[80][80]; //Matriz do mapa + int Sector_Matrix_Sections[15][15]; //Matriz com os indices das seccoes + double Sector_Matrix_Abs[15][15]; //Matriz com as amplitudes + int Surroundings_Matrix[15][15]; //Matriz das redondezas do bot + + //Ganhos + double k = 3.3; //ganho angular + + //Variaveis de posicao + double x = 150; //x inicial + double y = 150; //y inicial + double phi = 0.01; //phi inicial + double end_position_x = 1200; //x final + double end_position_y = 1200; //y final + double next_phi; //phi seguinte + + //Variaveis de estimacao de posicao + double var_l; //contagens do encoder esquerdas + double var_r; //contagens do encoder direitas + double var_d; //variacao linear entre iteracoes + double var_phi; //variacao angular entre iteracoes + double L = 150; //distancia entre rodas + double r = 35; //raio da roda + + //Variaveis de comando as rodas + double w; //velociade angular do robo + double w_left; //velocidade roda esquerda + double w_right; //velocidade roda direita + double v = 2400; //velocidade linear do robo + + //Funcao de obtencao do Mapa + read_map1(Map_Matrix); + + //Funcao para obter a matriz com os indices das seccoes assim como as amplitudes + get_Sector_Matrix(Sector_Matrix_Sections, Sector_Matrix_Abs); + + //Distancia ao ponto objetivo + double dist = sqrt((double)((x-end_position_x)*(x-end_position_x) + (y-end_position_y)*(y-end_position_y))); + + while(dist > 150){ + //Obter as contagens dos encoders + getCountsAndReset(); + + //Estimacao de pose + var_l = (2*pi*r*countsLeft/1440); + var_r = (2*pi*r*countsRight/1440); + var_d = (var_l+var_r)/2; + var_phi= (var_r-var_l)/L; + + if(var_phi == 0){ + x = x + var_d*cos(phi); + y = y + var_d*sin(phi); + } + else{ + x = x + (var_d)*((sin(phi/2)/(phi/2))*cos(phi + var_phi/2)); + y = y + (var_d)*((sin(phi/2)/(phi/2))*sin(phi + var_phi/2)); + phi = phi + var_phi; + } + + pc.printf("x_atual = %f, y_atual = %f\n",x,y); + //Distancia ao ponto objetivo + dist = sqrt((double)(x-end_position_x)*(x-end_position_x) + (y-end_position_y)*(y-end_position_y)); + pc.printf("\ndist = %f\n", dist); + + //Funcao para obter o mapa das redondezas do robo + get_Surroundings_Matrix(Surroundings_Matrix, x, y, Map_Matrix); + + //Funcao para obter a direcao que o robo deve tomar em funcao da sua posicao atual e das suas redondezas + // defenimos como o limiar 31 !! + next_phi = get_orientation_angle(x, y, end_position_x, end_position_y, Surroundings_Matrix, Sector_Matrix_Sections, Sector_Matrix_Abs, 31); + pc.printf("\n\n next phi = %f\n\n", next_phi); + + //Controlo proporcional da direcao + w = k*atan2(sin(next_phi-phi),cos(next_phi-phi)); + + //Enviar os comandos de velocidades para as rodas + w_left=(v-(L/2)*w)/r; + w_right=(v+(L/2)*w)/r; + setSpeeds(w_left,w_right); + } + + setSpeeds(0,0); + return(0); +} +