VFH com Lidar

Dependencies:   BufferedSerial

Files at this revision

API Documentation at this revision

Comitter:
xaficz
Date:
Tue May 18 00:04:27 2021 +0000
Parent:
5:25bd866ef068
Child:
7:5fa6f21eb739
Commit message:
gbhuj

Changed in this revision

Robot.cpp Show annotated file Show diff for this revision Revisions of this file
Robot.h Show annotated file Show diff for this revision Revisions of this file
funcs.cpp Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/Robot.cpp	Mon May 17 15:03:21 2021 +0000
+++ b/Robot.cpp	Tue May 18 00:04:27 2021 +0000
@@ -1,6 +1,15 @@
 #include "Robot.h"
 #include "mbed.h"
 
+
+#include "BufferedSerial.h"
+#include "rplidar.h"
+
+#include "Communication.h"
+#include <string.h>
+#include <stdio.h>
+#include <math.h>
+
 I2C i2c(I2C_SDA, I2C_SCL );
 const int addr8bit = 20 << 1; // 7bit I2C address is 20; 8bit I2C address is 40 (decimal).
 
@@ -61,21 +70,3 @@
     countsLeft = (int16_t((read_buffer[0]<<8)|read_buffer[1]));
     countsRight = (int16_t((read_buffer[2]<<8)|read_buffer[3]));
 }
-
-//Funcao para criar um mapa simples com um quadrado no meio
-void read_map(int Map_Matrix[80][80]){
-    for(int i = 0; i < 80; i++){
-        for(int j = 0; j < 80; j++){
-            if(i == 0 || j==0 || i==79 || j==79){
-                Map_Matrix[i][j] = 1;  
-            }     
-            else{
-                Map_Matrix[i][j] = 0;
-                if(i >= 10 && j>=10 && i<=69 && j<=69){
-                    Map_Matrix[i][j] = 1;
-                }
-            }              
-        }
-    } 
-}
-
--- a/Robot.h	Mon May 17 15:03:21 2021 +0000
+++ b/Robot.h	Tue May 18 00:04:27 2021 +0000
@@ -49,6 +49,9 @@
 void VFH(float x, float y, float phi, float x_final, float y_final, float Log_Map[80][80], float Map[80][80], float Limiar_Histograma, float Limiar_Vale, float kv, float ki, float ks, float L, float r, float w_Max);
 
 void read_map(int Map_Matrix[80][80]);
+int distancia_prevista (int x, int y, int x_celula, int y_celula, float Angle, int Map_Matrix[80][80]);
+
+
 int *y_bresenham(int x1, int y1, int x2, int y2);
 int *x_bresenham(int x1, int y1, int x2, int y2);
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/funcs.cpp	Tue May 18 00:04:27 2021 +0000
@@ -0,0 +1,79 @@
+#include "mbed.h"
+#include "BufferedSerial.h"
+#include "rplidar.h"
+#include "Robot.h"
+#include "Communication.h"
+#include <string.h>
+#include <stdio.h>
+#include <math.h>
+
+#define pi 3.14159265359
+
+
+    int x_c;
+    int y_c;
+    int next_x;
+    int next_y;
+    float auxx;
+    float auxy;
+    double dist_odometria;
+    
+    
+    //Funcao para criar um mapa simples com um quadrado no meio
+void read_map(int Map_Matrix[80][80]){
+    for(int i = 0; i < 80; i++){
+        for(int j = 0; j < 80; j++){
+            if(i == 0 || j==0 || i==79 || j==79){
+                Map_Matrix[i][j] = 1;  
+            }     
+            else{
+                Map_Matrix[i][j] = 0;
+                if((i >= 2 && j>=2 && i<=10 && j<=10) || (i >=69 && j>=69 && i<=77 && j<=77) || (i >=69 && j>=69 && i<=10 && j<=10) || (i >= 2 && j>=2 && i<=77 && j<=77) || (i >= 2 && j>=2 && i<=10 && j<=10)){
+                    Map_Matrix[i][j] = 1;
+                }
+            }              
+        }
+    } 
+}
+
+    
+int distancia_prevista (int x , int y, int x_celula, int y_celula, float Angle, int Map_Matrix[80][80]){
+    
+    // x_celula --> posição odometria x
+    // y_celula --> posição odometria y
+    // Distance --> Leitura do lidar
+    
+    int find = 0;
+    next_x = x;
+    next_y = y;
+    
+    x_c = x_celula;
+    y_c = y_celula;
+    
+    //:::::::::::: calcular estimativa ::::::::::::::::::
+    while(find == 0)
+     
+        if(Map_Matrix[x_c][y_c] == 1){
+            find = 1;
+            }
+        else
+            next_x = next_x + 5*cos(Angle); // meti ele a andar para a frente de 5 em 5 cm 
+            next_y = next_y + 5*sin(Angle); // isto pode causar algum erro
+        
+            auxx=next_x/5;
+            auxy= next_y/5;
+            x_c = ceil(auxx)-1;
+            y_c = ceil(auxy) - 1;
+        
+        
+        
+          dist_odometria = ((next_x-x)*(next_x-x)) + ((next_y-y)*(next_y-y));
+          dist_odometria = sqrt(dist_odometria);
+    
+    return(dist_odometria);
+    }// fim do while 
+    
+    
+    // usei o next_x_cel com erro de que ele faz de 5 em 5 cm
+    // mas tb posso meter de 1 em 1 ou ate menos
+
--- a/main.cpp	Mon May 17 15:03:21 2021 +0000
+++ b/main.cpp	Tue May 18 00:04:27 2021 +0000
@@ -38,27 +38,40 @@
    // double k = 8;                       //Ganho angular
     
     //Variaveis de posicao
-    double x = 300;                     //x inicial
-    double y = 300;                     //y inicial
+    double x = 60;                     //x inicial cm
+    double y = 60;                     //y inicial
     double phi = 0.01;                  //phi inicial
     
     
+    // Coordenadas
+    int x_Celula;       // Coordenada X Relativa à Celula Ativa (Sistema de Coordenadas baseado em Células de Aresta 5 cm)
+    int y_Celula;       // Coordenada Y Relativa à Celula Ativa (Sistema de Coordenadas baseado em Células de Aresta 5 cm)
+    
+    
+    float Distance;         // Distância Devolvida pela Leitura do LIDAR
+    float Angle;            // Angulo Devolvida pela Leitura do LIDAR
+    
+    
     //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
+    double L = 15.0;                     //distancia entre rodas 
+    double r = 3.5;                      //raio da roda
     
     //Variaveis de comando as rodas
     double V_left = 20;                      //velocidade da roda esquerda    
     double V_right = 25;                     //velocidade da roda direita 
 
     //Auxiliares
-    int ciclos = 0;
+    int Ciclos = 0;
     int Leituras = 0;
+    int AUX = 0;
+    
+    
+    double dist_odometria;
     
     //Funcao de obtencao do Mapa    
     read_map(Map_Matrix);              
@@ -67,16 +80,14 @@
   while(1){
         
         //Este while é para fazer uma paragem de 10 em 10 ciclos para dar tempo para o lidar executar leituras
-        while(ciclos < 10)
+        while(AUX == 1){
         
         //Manda andar 
         setSpeeds(V_left,V_right);
         
-        //conta como mais um ciclo
-        ciclos = ciclos+1;
         
-
     //:::::::::::::: ODOMETRIA :::::::::::::::
+    
         //Obter as contagens dos encoders
         getCountsAndReset();
 
@@ -98,7 +109,67 @@
         
         pc.printf("x_odometria = %f, y_odometria = %f\n", x, y);
         
-    } // fim do while de 10 ciclos
+    
+        //Celula da Odometria
+            x_Celula = ceil(x/5) - 1;
+            y_Celula = ceil(y/5) - 1;
+    
+        pc.printf("x_Celula = %f, y_Celula = %f\n", x_Celula, y_Celula);
+    
+    
+    //============================================
+    
+    
+    
+    
+                    //Distancia suposta
+                    dist_odometria = distancia_prevista(x,y,x_Celula,y_Celula,Angle,Map_Matrix[80][80]);
+    
+    
+    
+    
+    
+    
+    
+    //==========================================
+        //conta como mais um ciclo
+        Ciclos = Ciclos+1;
+        
+     
+        
+    //::::::::::::::IF de LEITURAS ::::::::::::::::::::::::::: 
+        if(Ciclos == 10){
+            while(Leituras<30) // faz 30 leituras parado
+            
+                if(lidar.pollSensorData(&data)== 0) {
+            
+                    Distance = (data.distance)/10; // aqui este 10 é para cm TENHO QUE VER     
+                    Angle = pi*(data.angle)/180;
+                    Angle = atan2(sin(Angle),cos(Angle));   //em rad
+                    
+                    //Distancia suposta
+                    dist_odometria = distancia_prevista(x, y, x_celula, y_celula, Angle,Map_Matrix[80][80]){ 
+            
+            
+                Leituras = Leituras + 1; // incrementa as leituras
+                }
+                
+                
+        Ciclos = 0;    
+            } // fim do numero de leituras
+            
+            
+        } //fim de if leituras
+    //======================================
+        
+        
+        
+    } // fim do while
+    
+    
+    
+    
+
     
     // reset de ciclos
     //