2012-01-25 6 views
12

Sto elaborando dati RGB e Profondità e costruendo punti cloud che devono essere visualizzati, attualmente utilizzo PCL Visualizer e funziona correttamente. Voglio avere il visualizzatore in un thread diverso (in tempo reale per ridisegnare il punto cloud globale, ho provato i thread boost ma ottengo un errore di runtime "VTK cattiva tabella di ricerca"Streaming di Cloud Point Visualizzazione tramite PCL

Qualcuno sa come visualizzare il flusso di ? nuvola di punti in un thread diverso

risposta

7

OK, ho preso a lavorare ora, forse ho fatto qualcosa di sbagliato prima, ecco come ho fatto con le discussioni Boost e mutex

bool update; 
    boost::mutex updateModelMutex; 
    pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGB>); 

    void visualize() 
    { 
     // prepare visualizer named "viewer" 

     while (!viewer->wasStopped()) 
     { 
      viewer->spinOnce (100); 
      // Get lock on the boolean update and check if cloud was updated 
      boost::mutex::scoped_lock updateLock(updateModelMutex); 
      if(update) 
      { 
       if(!viewer->updatePointCloud(cloud, "sample cloud")) 
        viewer->addPointCloud(cloud, colorHandler, "sample cloud"); 
       update = false; 
      } 
      updateLock.unlock(); 

     } 
    } 


    int main() 
    { 
     //Start visualizer thread 
     boost::thread workerThread(visualize); 

     while(notFinishedProcessing) 
     { 
      boost::mutex::scoped_lock updateLock(updateModelMutex); 
      update = true; 
      // do processing on cloud 
      updateLock.unlock(); 

     } 
     workerThread.join(); 
    } 

UPDATE:

Secondo t il suo page Il motivo è che l'aggiunta di una nuvola di punti vuota al visualizzatore fa impazzire le cose quindi ho modificato il codice sopra

+0

Ciao @khaled!. Quindi, il viusalizer è in esecuzione in un thread diverso e funziona bene ?. Nel documento Doxy di PCLVisualizer ho trovato questo: 'Questa classe NON può essere utilizzata su più thread. Chiama solo le funzioni degli oggetti di questa classe dallo stesso thread in cui sono stati creati! Alcuni metodi, ad es. addPointCloud, si bloccherà se chiamato da altri thread'. Sono davvero interessato ad avere il visualizzatore in esecuzione in un altro thread, quindi per favore. Potresti confermare che il tuo approccio funziona? : D –

+1

sì, questo funziona davvero. i documenti sono ancora corretti, dovresti chiamare metodi come 'addPointCloud' solo dal thread della visualizzazione non da un altro thread. Quindi non puoi chiamare 'addPointCloud' dal metodo principale se il tuo ciclo di visualizzazione è in un thread diverso. – Khaled

+0

Grazie !. Ci proverò subito !. –