2013-11-22 15 views
8

Właśnie zacząłem korzystać z wielkiej biblioteki chmur punktów i chciałem wyświetlać chmury w jednym widoku, ale każdy w innym kolorze.Dodanie dwóch chmur punktów do przeglądarki (biblioteka chmury punktów (PCL))

Kiedy używam jednego obiektu chmury punktów (wskaźnik ?!), działa dobrze, ale jeśli chcę dodać drugi, w przeglądarce zostanie wyświetlony tylko ten drugi.

Używam wersji 1.6 pcl i zrobiłem to prawie tak jak w tym tutorial.
Może masz sugestię.

Odpowiedni fragment kodu znajduje się poniżej. Z góry dziękuję!!!

boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer_two_clouds (new pcl::visualization::PCLVisualizer("3D Viewer")); 
    viewer_two_clouds->setBackgroundColor(0,0,0); 

    // cloud: green/cloud2: red 
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZRGB> single_color1 (cloud, 0, 255, 0); 
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZRGB> single_color2 (cloud2, 255, 0, 0); 

    //add both 
    viewer_two_clouds->addPointCloud<pcl::PointXYZRGB> (cloud, single_color1, "sample_cloud_1"); 
    viewer_two_clouds->addPointCloud<pcl::PointXYZRGB> (cloud2, single_color2, "sample_cloud_2"); 

    // set coordinateSystem and init camera 
    viewer_two_clouds->addCoordinateSystem(1.0); 
    viewer_two_clouds->initCameraParameters(); 

    while(!viewer_two_clouds->wasStopped()) 
    { 
     viewer_two_clouds->spinOnce(); 
     boost::this_thread::sleep (boost::posix_time::microseconds(100000)); 
    } 

    viewer_two_clouds->close(); 
+0

Czy sprawdziłeś, że nie ładujesz tego samego 'PCD'? –

+0

W rzeczywistości ładuję tylko jeden plik pcd, ale go kopiuję i przenoszę go 10 metrów od innej chmury punktów. copyPointCloud (* chmura, * chmura2);/po skopiowaniu robię cloud2-> sensor_origin_ = p; – GeoGecco

+0

Ok. Następnie spróbuj załadować plik dwukrotnie, zamiast kopiować. Nie sądzę, że to rozwiąże, ale na wszelki wypadek ... –

Odpowiedz

5

Aby zastosować transformacje (takie jak obroty i tłumaczeń) do chmury punktów już załadowany należy użyć funkcji pcl::transformPointCloud (see here). Ta funkcja przyjmuje 3 argumenty: chmurę wejściową, chmurę wyjściową i Eigen::Transform. Po prostu zdefiniuj transformację tłumaczenia i podaj ją do funkcji, aby poprawnie przetłumaczyć swoją chmurę.

Istnieje dobry samouczek Eigen (here), który pokazuje, jak definiować i używać transformacji przestrzeni.

3

Dexter pomógł mi dużo =)

tutaj jest to, co kiedyś przekształcić PointCloud tak, że inni mogą go używać, jak dobrze!

void trans(); 
    { 
     Eigen::Affine3f t; 

     pcl::getTransformation(10.0,5.0,20.0,0.0,0.0,0.0,t); 
     pcl::transformPointCloud(*cloud, *cloud2, t); 
    } 
3

istnieją inne sposoby wyświetlania dwóch chmur punktów w ciągu jednego viewer.you można utworzyć dwie rzutnie differet na oknie, niektórzy myślą tak:

viewer_two_clouds->createViewPort (0.0,0.0,0.5,1.0,0); 
viewer_two_clouds->setBackgroundColor(0,0,0,0); // background color dark 
viewer_two_clouds->addText("sample_cloud_1", 10, 10, "right", 0); 
viewer_two_clouds->addPointCloud(cloud, "sample_cloud_1", 0); 

viewer_two_clouds->createViewPort (0.5,0.0,0.1,1.0,0); 
viewer_two_clouds->setBackgroundColor(0.1,0.1,0.1,0); // background color light 
viewer_two_clouds->addText("sample_cloud_2", 10, 10, "left", 0); 
viewer_two_clouds->addPointCloud(cloud2, "sample_cloud_2", 0); 

ten sposób można zobaczyć dwupunktowym chmury poza sobą (i nie zachodzą na siebie).

Powiązane problemy