Experiencias do Henrique na quinta/sexta a noite

Dependencies:   BufferedSerial

main.cpp

Committer:
ppovoa
Date:
2021-05-11
Revision:
8:ad8766cf2ec0
Parent:
7:f1c122bc63c8
Child:
9:76b59c5220f1

File content as of revision 8:ad8766cf2ec0:

// Coded by Luís Afonso 11-04-2019
#include "mbed.h"
#include "BufferedSerial.h"
#include "rplidar.h"
#include "Robot.h"
#include "Communication.h"
#include "Functions.h"
#include "math.h"

#include <stdlib.h>
#include <stdio.h>

#define PI 3.1415926535

Serial pc(SERIAL_TX, SERIAL_RX);
RPLidar lidar;
BufferedSerial se_lidar(PA_9, PA_10);
PwmOut rplidar_motor(D3);

float MapaLog[40][40] = {0};
float Mapa40[40][40];

int main()
{
    //printf("Inicio\n\r");
    pc.baud(115200);
    init_communication(&pc);
    
    pc.printf("======================\n\r");
    pc.printf("Inicio\n\r");
    
    DigitalIn UserButton(USER_BUTTON); // Initialize Button
    DigitalOut myled(LED1); // Initialize LED
    
    //float odomX, odomY, odomTheta;
    struct RPLidarMeasurement data;
    
    // Lidar initialization
    rplidar_motor.period(0.001f);
    //rplidar_motor.write(0.5f);
    lidar.begin(se_lidar);
    lidar.setAngle(0,360);
    
    int pose[3] = {20,20}; // Ponto Inicial
    float p_angulo = 0;
    int LidarP[2]; // pontos na plataforma
    int LidarW[2]; // pontos no mundo
    
    /*pc.printf("Inicializacao MapaLog\n\r");
    for(int i = 0; i < 40; i++){
        for(int j = 0; j < 40; j++){
            MapaLog[i][j] = 0;
        }
    }*/
    
    float Mapa40[40][40];
    
    // matriz rotacao world plataforma
    float R_WP[3][3]= {{cos(p_angulo), -sin(p_angulo), pose[0]},
                        {sin(p_angulo), cos(p_angulo), pose[1]},
                        {0, 0, 1}};
    
    setSpeeds(0,0);
    
    int leituras = 0;
    
    pc.printf("waiting...\n\r");
    
    int start = 0;
    while(start != 1) {
        myled=1;
        if (UserButton == 0) { // Button is pressed
            myled = 0;
            start = 1;
            rplidar_motor.write(0.5f);
        }
    }
    
    lidar.startThreadScan();
    
    pc.printf("Entrar no ciclo\n\r");
    while(leituras < 500){
        if(lidar.pollSensorData(&data) == 0)
        {            
            /*if (UserButton == 0) { // Button is pressed
                break;
            }*/
            
            pc.printf("%f\t%f\n\r", data.distance, data.angle); // Prints one lidar measurement.
            
            float radians = (data.angle * static_cast<float>(PI))/180.0f;
            
            LidarP[0] = -data.distance*cos(radians)- 2.8f;
            LidarP[1] = -data.distance*sin(radians)- 1.5f;

            //W_P = R_WP * p_P
            LidarW[0] = LidarP[0]* R_WP[0][0] + LidarP[1]* R_WP[0][1] + R_WP[0][2]; // coordenadas no mundo, ou seja, cm
            LidarW[1] = LidarP[0]* R_WP[1][0] + LidarP[1]* R_WP[1][1] + R_WP[1][2];
            
            // pontos onde o feixe passou
            bresenham(pose[0]/5, pose[1]/5, LidarW[0]/5, LidarW[1]/5, data.distance);
            
            leituras++;
        }
    }
    
    // Converter o logaritmo para o mapa 40
    
    rplidar_motor.write(0.0f);
    for(int i=0; i<40; i++){
        for(int j=0; j<40; j++){
            pc.printf("%f", Mapa40[i][j]);
            //send_map(Mapa40[j][i]); // envia linha em linha (j i)
            //send_odometry(1, 2, Mapa40[j][i], 4, 10,10, 30); // faz prints estranhos no Putty
        }
    }
}