Experiencias do Henrique na quinta/sexta a noite

Dependencies:   BufferedSerial

Committer:
ppovoa
Date:
Mon May 10 15:23:24 2021 +0000
Revision:
7:f1c122bc63c8
Parent:
6:59fbbeaac2af
Child:
8:ad8766cf2ec0
10/05/2021

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fabiofaria 1:dc87724abce8 1 // Coded by Luís Afonso 11-04-2019
LuisRA 0:2b691d200d6f 2 #include "mbed.h"
LuisRA 0:2b691d200d6f 3 #include "BufferedSerial.h"
LuisRA 0:2b691d200d6f 4 #include "rplidar.h"
fabiofaria 1:dc87724abce8 5 #include "Robot.h"
fabiofaria 1:dc87724abce8 6 #include "Communication.h"
ppovoa 4:256f2cbe3fdd 7 #include "Functions.h"
ppovoa 5:bc42c03f2a23 8 #include "math.h"
ppovoa 4:256f2cbe3fdd 9
ppovoa 4:256f2cbe3fdd 10 #include <stdlib.h>
ppovoa 4:256f2cbe3fdd 11 #include <stdio.h>
LuisRA 0:2b691d200d6f 12
ppovoa 5:bc42c03f2a23 13 #define PI 3.1415926535
ppovoa 5:bc42c03f2a23 14
fabiofaria 1:dc87724abce8 15 Serial pc(SERIAL_TX, SERIAL_RX);
LuisRA 0:2b691d200d6f 16 RPLidar lidar;
LuisRA 0:2b691d200d6f 17 BufferedSerial se_lidar(PA_9, PA_10);
fabiofaria 3:0a718d139ed1 18 PwmOut rplidar_motor(D3);
LuisRA 0:2b691d200d6f 19
LuisRA 0:2b691d200d6f 20 int main()
LuisRA 0:2b691d200d6f 21 {
ppovoa 6:59fbbeaac2af 22 //printf("Inicio\n\r");
fabiofaria 1:dc87724abce8 23 pc.baud(115200);
fabiofaria 1:dc87724abce8 24 init_communication(&pc);
ppovoa 5:bc42c03f2a23 25
ppovoa 7:f1c122bc63c8 26 pc.printf("======================\n\r");
ppovoa 6:59fbbeaac2af 27 pc.printf("Inicio\n\r");
ppovoa 6:59fbbeaac2af 28
ppovoa 5:bc42c03f2a23 29 DigitalIn UserButton(USER_BUTTON); // Initialize Button
ppovoa 5:bc42c03f2a23 30 DigitalOut myled(LED1); // Initialize LED
ppovoa 5:bc42c03f2a23 31
ppovoa 5:bc42c03f2a23 32 //float odomX, odomY, odomTheta;
ppovoa 5:bc42c03f2a23 33 struct RPLidarMeasurement data;
ppovoa 4:256f2cbe3fdd 34
fabiofaria 1:dc87724abce8 35 // Lidar initialization
LuisRA 0:2b691d200d6f 36 rplidar_motor.period(0.001f);
ppovoa 5:bc42c03f2a23 37 //rplidar_motor.write(0.5f);
LuisRA 0:2b691d200d6f 38 lidar.begin(se_lidar);
LuisRA 0:2b691d200d6f 39 lidar.setAngle(0,360);
ppovoa 4:256f2cbe3fdd 40
ppovoa 6:59fbbeaac2af 41 pc.printf("Inicializacao de variaveis\n\r");
ppovoa 7:f1c122bc63c8 42 int pose[3] = {20,20}; // Ponto Inicial
ppovoa 7:f1c122bc63c8 43 float p_angulo = 0;
ppovoa 7:f1c122bc63c8 44 int LidarP[2]; // pontos na plataforma
ppovoa 7:f1c122bc63c8 45 int LidarW[2]; // pontos no mundo
ppovoa 7:f1c122bc63c8 46 pc.printf("Inicializacao MapaLog\n\r");
ppovoa 5:bc42c03f2a23 47 float MapaLog[40][40];
ppovoa 7:f1c122bc63c8 48 pc.printf("Inicializacao MapaLog a 0\n\r");
ppovoa 7:f1c122bc63c8 49 for(int i = 0; i < 40; i++){
ppovoa 7:f1c122bc63c8 50 pc.printf("%d\n\r", i);
ppovoa 7:f1c122bc63c8 51 for(int j = 0; j < 40; j++){
ppovoa 7:f1c122bc63c8 52 pc.printf("%d ", j);
ppovoa 5:bc42c03f2a23 53 MapaLog[i][j] = 0;
ppovoa 7:f1c122bc63c8 54 }
ppovoa 7:f1c122bc63c8 55 pc.printf("\n\r");
ppovoa 7:f1c122bc63c8 56 }
ppovoa 7:f1c122bc63c8 57 /*for(int i = 0; i < 40; i++){
ppovoa 6:59fbbeaac2af 58 for(int j = 0; j < 40; j++)
ppovoa 6:59fbbeaac2af 59 pc.printf("%.1f ", MapaLog[i][j]);
ppovoa 6:59fbbeaac2af 60 pc.printf("\n\r");
ppovoa 7:f1c122bc63c8 61 }*/
ppovoa 7:f1c122bc63c8 62 pc.printf("Inicializar Mapa40\n\r");
ppovoa 4:256f2cbe3fdd 63 float Mapa40[40][40];
ppovoa 5:bc42c03f2a23 64
ppovoa 7:f1c122bc63c8 65 pc.printf("Inicializar Rotacao\n\r");
ppovoa 5:bc42c03f2a23 66 // matriz rotacao world plataforma
ppovoa 7:f1c122bc63c8 67 float R_WP[3][3]= {{cos(p_angulo), -sin(p_angulo), pose[0]},
ppovoa 7:f1c122bc63c8 68 {sin(p_angulo), cos(p_angulo), pose[1]},
ppovoa 4:256f2cbe3fdd 69 {0, 0, 1}};
ppovoa 4:256f2cbe3fdd 70
ppovoa 5:bc42c03f2a23 71 setSpeeds(0,0);
ppovoa 5:bc42c03f2a23 72
ppovoa 5:bc42c03f2a23 73 int leituras = 0;
ppovoa 5:bc42c03f2a23 74
ppovoa 5:bc42c03f2a23 75 pc.printf("waiting...\n\r");
ppovoa 5:bc42c03f2a23 76
ppovoa 5:bc42c03f2a23 77 int start = 0;
ppovoa 5:bc42c03f2a23 78 while(start != 1) {
ppovoa 5:bc42c03f2a23 79 myled=1;
ppovoa 5:bc42c03f2a23 80 if (UserButton == 0) { // Button is pressed
ppovoa 5:bc42c03f2a23 81 myled = 0;
ppovoa 5:bc42c03f2a23 82 start = 1;
ppovoa 5:bc42c03f2a23 83 rplidar_motor.write(0.5f);
ppovoa 5:bc42c03f2a23 84 }
ppovoa 5:bc42c03f2a23 85 }
ppovoa 5:bc42c03f2a23 86
ppovoa 7:f1c122bc63c8 87 pc.printf("StartThreadScan.\n\r");
ppovoa 7:f1c122bc63c8 88
ppovoa 7:f1c122bc63c8 89 lidar.startThreadScan();
ppovoa 4:256f2cbe3fdd 90
ppovoa 4:256f2cbe3fdd 91 pc.printf("Program started.\n\r");
ppovoa 4:256f2cbe3fdd 92
ppovoa 5:bc42c03f2a23 93 while(1){
ppovoa 7:f1c122bc63c8 94 pc.printf("ciclo\n\r");
ppovoa 5:bc42c03f2a23 95 if(lidar.pollSensorData(&data) == 0)
ppovoa 5:bc42c03f2a23 96 {
ppovoa 5:bc42c03f2a23 97 if(leituras == 100){
ppovoa 5:bc42c03f2a23 98 break;
ppovoa 5:bc42c03f2a23 99 }
ppovoa 5:bc42c03f2a23 100 pc.printf("%f\t%f\n\r", data.distance, data.angle); // Prints one lidar measurement.
ppovoa 4:256f2cbe3fdd 101
ppovoa 6:59fbbeaac2af 102 float radians = (data.angle * static_cast<float>(PI))/180.0f;
ppovoa 4:256f2cbe3fdd 103
ppovoa 5:bc42c03f2a23 104 LidarP[0] = -data.distance*cos(radians)- 2.8f;
ppovoa 5:bc42c03f2a23 105 LidarP[1] = -data.distance*sin(radians)- 1.5f;
LuisRA 0:2b691d200d6f 106
ppovoa 4:256f2cbe3fdd 107 //W_P = R_WP * p_P
ppovoa 4:256f2cbe3fdd 108 LidarW[0] = LidarP[0]* R_WP[0][0] + LidarP[1]* R_WP[0][1] + R_WP[0][2]; // coordenadas no mundo, ou seja, cm
ppovoa 4:256f2cbe3fdd 109 LidarW[1] = LidarP[0]* R_WP[1][0] + LidarP[1]* R_WP[1][1] + R_WP[1][2];
ppovoa 4:256f2cbe3fdd 110
ppovoa 4:256f2cbe3fdd 111 // pontos onde o feixe passou
ppovoa 7:f1c122bc63c8 112 pc.printf("Entrar no bresenham\n\r");
ppovoa 7:f1c122bc63c8 113 bresenham(pose[0], pose[1], LidarW[0], LidarW[1], MapaLog, data.distance);
ppovoa 7:f1c122bc63c8 114 //test2(pose[0], pose[1], LidarW[0], LidarW[1], data.distance);
ppovoa 4:256f2cbe3fdd 115
ppovoa 5:bc42c03f2a23 116 leituras++;
ppovoa 5:bc42c03f2a23 117 }
ppovoa 7:f1c122bc63c8 118 //pc.printf("ciclo.\n\r");
ppovoa 5:bc42c03f2a23 119 }
ppovoa 4:256f2cbe3fdd 120
ppovoa 4:256f2cbe3fdd 121 // Converter o logaritmo para o mapa 40
ppovoa 6:59fbbeaac2af 122
ppovoa 4:256f2cbe3fdd 123 for(int i=0; i<40; i++){
ppovoa 4:256f2cbe3fdd 124 for(int j=0; j<40; j++){
ppovoa 6:59fbbeaac2af 125 //Mapa40[j][i] = 1 - 1/(1+exp(MapaLog[j][i]));
ppovoa 4:256f2cbe3fdd 126 //printf("%.2f\n", 1 - 1/(1+exp(MapaLog[i][j])));
ppovoa 6:59fbbeaac2af 127 //send_map(Mapa40[j][i]); // envia linha em linha (j i)
ppovoa 7:f1c122bc63c8 128 //send_odometry(1, 2, 5, 4, 10,10, 30); // faz prints estranhos no Putty
ppovoa 4:256f2cbe3fdd 129 }
ppovoa 4:256f2cbe3fdd 130 }
ppovoa 6:59fbbeaac2af 131
ppovoa 4:256f2cbe3fdd 132
ppovoa 4:256f2cbe3fdd 133 /*
LuisRA 0:2b691d200d6f 134 while(1) {
LuisRA 0:2b691d200d6f 135 // poll for measurements. Returns -1 if no new measurements are available. returns 0 if found one.
LuisRA 0:2b691d200d6f 136 if(lidar.pollSensorData(&data) == 0)
LuisRA 0:2b691d200d6f 137 {
ppovoa 4:256f2cbe3fdd 138 //if (data.angle > 0 and data.angle < 15)
ppovoa 4:256f2cbe3fdd 139 pc.printf("%f\t%f\t%d\t%c\n\r", data.distance, data.angle, data.quality, data.startBit); // Prints one lidar measurement.
ppovoa 4:256f2cbe3fdd 140 send_odometry(1, 2, countsLeft, countsRight, odomX, odomY, odomTheta);
LuisRA 0:2b691d200d6f 141 }
fabiofaria 3:0a718d139ed1 142 wait(0.01);
ppovoa 4:256f2cbe3fdd 143 }*/
fabiofaria 1:dc87724abce8 144 }