Modifica codice servo e time stamp

di il
8 risposte

Modifica codice servo e time stamp

Ciao ragazzi,
Sono un giovane geometra, non sono un programmatore ma sono comunque riuscito a compilare il codice per far funzionale un lidar economico di nome Livox

Adesso sto cercando di modificare il codice originale:
https://github.com/Livox-SDK/livox_scanner/blob/master/scanner_publisher/src/pointcloud_publisher.cpp
che fa effettuare una rotazione in senso orario ed antiorario ad un servo, senza mai fermarsi.

Io invece vorrei:
1) fare una sola rotazione a 360 gradi completa;
2) salvare la nuvola di punti con un time stamp nel nome ;
3) a questo punto, uscire dal programma.

Per il primo punto, fare eseguire un solo giro al servo, ho capito che devo operare nelle di codice alle righe
n. 153-157 del codice originale per ma non ho idea di come poter fare.

Per il secondo, salvare con nome time stamp, ho capito che alla riga n.278 si può abilitare il salvataggio in formato CSV.
Mi manca la capacità di poter effettuare il salvataggio con il timestamp.

Grazie in anticipo per l'aiuto.
S. An.

8 Risposte

  • Re: Modifica codice servo e time stamp

    Per il punto 2 intendi mettere la data e l'ora nel nome del file? Se sì, prova così:
    
    #include <ctime>
    #include <string>
    //.... fino a riga 276
    //save points
        if(save_points){
        	auto systemtime = time(nullptr);
       	auto now = localtime(&systemtime);
        	char text_time[50];
        	strftime(text_time,sizeof(text_time),"%Y-%m-%d_%H-%M",now);
        	string s = text_time;
            string save_name = "./pointscloud2" + s + ".csv";
            
            ofstream outfile;
            
        //... continua...
    
    Per quanto riguarda il giro completo, premetto che non ho idea di cosa stai manovrando e non ho visto tutto il codice, quindi devi provarlo tu (e non rispondo di eventuali ferite e danni a terzi ), prova a fare così:
    
    static void *can_send_thread(void *arg)
    {
        //... fino a riga 250
        glb_angle_lock.lock();
        
        float start_angle = glb_angle;
        int half_ratations_complete = 0;
        while (half_rotation_complete < 2)
        {
            //...
            
            target_rpm = setting_speed;
            if (half_ratations_complete < 1){
                if (static_cast<int>(glb_angle) == ((static_cast<int>(start_angle) + 180) % 360))
                    half_ratations_complete++; //mezza rotazione completata
                 } 
            else if (glb_angle == start_angle)
            {
                half_ratations_complete++; //rotazione intera completata
                target_rpm = 0;
            }
                
            glb_angle_lock.unlock();
            glb_motor.target_volt = pid_calc(&motor_pid, target_rpm, glb_motor.fdb_rpm);
            
            usleep(1000);
        }
        return NULL;
    }
    
  • Re: Modifica codice servo e time stamp

    Grazie mille provo stasera!!
  • Re: Modifica codice servo e time stamp

    Il codice per inserire il time stamp, anche se salva un file per ogni minuto che passa, funziona!! Evvai Grazie!!
    Mentre il resto del codice devo aver sbagliato ad inserirlo perchè mi riferisce questo errore quando compilo.
    /home/nome/ws_livox/src/livox_scanner/scanner_publisher/src/pointcloud_publisher.cpp:164:12: error: ‘half_rotation_complete’ 
    was not declared in this scope
         while (half_rotation_complete < 2)
                ^~~~~~~~~~~~~~~~~~~~~~
    /home/nome/ws_livox/src/livox_scanner/scanner_publisher/src/pointcloud_publisher.cpp:164:12: note: suggested alternative: ‘half_ratations_complete’
         while (half_rotation_complete < 2)
                ^~~~~~~~~~~~~~~~~~~~~~
                half_ratations_complete
    /home/nome/ws_livox/src/livox_scanner/scanner_publisher/src/pointcloud_publisher.cpp:189:1: error: a function-definition is not allowed here before ‘{’ token
     {
     ^
    /home/nome/ws_livox/src/livox_scanner/scanner_publisher/src/pointcloud_publisher.cpp:232:1: error: a function-definition is not allowed here before ‘{’ token
     {
     ^
    /home/nome/ws_livox/src/livox_scanner/scanner_publisher/src/pointcloud_publisher.cpp:325:1: error: a function-definition is not allowed here before ‘{’ token
     {
     ^
    /home/nome/ws_livox/src/livox_scanner/scanner_publisher/src/pointcloud_publisher.cpp:394:1: error: expected ‘}’ at end of input
     }
     ^
    livox_scanner/scanner_publisher/CMakeFiles/scanner_publisher_node.dir/build.make:62: recipe for target 
    'livox_scanner/scanner_publisher/CMakeFiles/scanner_publisher_node.dir/src/pointcloud_publisher.cpp.o' failed
    make[2]: *** [livox_scanner/scanner_publisher/CMakeFiles/scanner_publisher_node.dir/src/pointcloud_publisher.cpp.o] Error 1
    CMakeFiles/Makefile2:3514: recipe for target 'livox_scanner/scanner_publisher/CMakeFiles/scanner_publisher_node.dir/all' failed
    make[1]: *** [livox_scanner/scanner_publisher/CMakeFiles/scanner_publisher_node.dir/all] Error 2
    Makefile:140: recipe for target 'all' failed
    make: *** [all] Error 2
    
  • Re: Modifica codice servo e time stamp

    "half_rotations_complete". Rotations con la s finale.
    Il fatto che salvi ogni minuto non credo dipenda da quello che ho scritto, ma da come viene chiamata la procedura. È probabile che lo facesse anche prima, ma avendo sempre lo stesso nome sovrascriveva il file, mentre ora il nome cambia una volta al minuto.

    PS: controlla se per sbaglio non hai messo while al posto di if.
  • Re: Modifica codice servo e time stamp

    Sei una persona davvero gentile! !

    Ho corretto così:
        glb_angle_lock.lock();
        float start_angle = glb_angle;
        int half_rotations_complete = 0;
        while (half_rotations_complete < 2)
        {
            //...
            
            target_rpm = setting_speed;
            if (half_rotations_complete < 1)
    	    {
                if (static_cast<int>(glb_angle) == ((static_cast<int>(start_angle) + 180) % 360))
                    half_rotations_complete++; //mezza rotazione completata
                } 
            else if (glb_angle == start_angle)
                {
                half_rotations_complete++; //rotazione intera completata
                target_rpm = 0;
                }
                
            glb_angle_lock.unlock();
            glb_motor.target_volt = pid_calc(&motor_pid, target_rpm, glb_motor.fdb_rpm);
            
            usleep(1000);
        }
        return NULL;
    }
    mi restituisce questo avviso che credo sia dovuto a qualche errore nelle parentesi graffe che ho riportato male giusto?
    /home/nome/ws_livox/src/livox_scanner/scanner_publisher/src/pointcloud_publisher.cpp: In function ‘void* can_send_thread(void*)’:
    /home/nome/ws_livox/src/livox_scanner/scanner_publisher/src/pointcloud_publisher.cpp:189:1: error: a function-definition is not allowed here before ‘{’ token
     {
     ^
    /home/nome/ws_livox/src/livox_scanner/scanner_publisher/src/pointcloud_publisher.cpp:232:1: error: a function-definition is not allowed here before ‘{’ token
     {
     ^
    /home/nome/ws_livox/src/livox_scanner/scanner_publisher/src/pointcloud_publisher.cpp:325:1: error: a function-definition is not allowed here before ‘{’ token
     {
     ^
    /home/nome/ws_livox/src/livox_scanner/scanner_publisher/src/pointcloud_publisher.cpp:394:1: error: expected ‘}’ at end of input
     }
     ^
    livox_scanner/scanner_publisher/CMakeFiles/scanner_publisher_node.dir/build.make:62: recipe for target 'livox_scanner/scanner_publisher/CMakeFiles/scanner_publisher_node.dir/src/pointcloud_publisher.cpp.o' failed
    
  • Re: Modifica codice servo e time stamp

    Alexv ha scritto:


    PS: controlla se per sbaglio non hai messo while al posto di if.
    TI riferisci al primo while qui sotto?
    while (half_rotations_complete < 2)
    ho risolto con la compilazione!!!
    era una parentesi graffa che mi ero dimenticato!!

    Il servo però non gira più... sto provando a modificare qualcosa nel ciclo while..
  • Re: Modifica codice servo e time stamp

    Scrivo la funzione completa, così non ci incartiamo.
    
    static void *can_send_thread(void *arg)
    {
    
        float target_rpm = setting_speed;
    
        pid_init(&motor_pid, 10, 2, 0, 30000, 30000);
    
        glb_motor.target_volt = 0;
    
        int nbytes;
        struct can_frame frame;
    
        frame.can_id = 0x2FF;
        frame.can_dlc = 8;
        int i=0;
        
        
        float start_angle = glb_angle;
        int half_rotations_complete = 0;
        while (half_rotations_complete < 2 )
        {
            if(i++%10==0)
            {
                frame.data[4] = (glb_motor.target_volt >> 8) & 0xff;
                frame.data[5] = (glb_motor.target_volt) & 0xff;
    
                nbytes = write(s, &frame, sizeof(frame));
                if (nbytes != sizeof(frame))
                {
                    printf("Send Error frame\n!");
                    break;
                }
            }
            glb_angle_lock.lock();
            
            target_rpm = setting_speed;
            if (half_rotations_complete < 1)
    	    {
                if (static_cast<int>(glb_angle) == ((static_cast<int>(start_angle) + 180) % 360))
                    half_rotations_complete++; //mezza rotazione completata
                } 
            else if (glb_angle == start_angle)
                {
                half_rotations_complete++; //rotazione intera completata
                target_rpm = 0;
                }
                
            glb_angle_lock.unlock();
    
            glb_motor.target_volt = pid_calc(&motor_pid, target_rpm, glb_motor.fdb_rpm);
            
            usleep(1000);
        }
    
        return NULL;
    }
    
    Sul while, mi riferivo alla parte del salvataggio. Dove c'è scritto if(save_points) non è che hai messo while al posto di if, inducendolo a salvare sempre?
  • Re: Modifica codice servo e time stamp

    Sul while, mi riferivo alla parte del salvataggio. Dove c'è scritto if(save_points) non è che hai messo while al posto di if, inducendolo a salvare sempre?
    Si si ho controllato.
    Ti sto inviando un messaggio in privato.
Devi accedere o registrarti per scrivere nel forum
8 risposte