Oi,
Gostaria de saber como usar o Open3D com a biblioteca PCL e ROS. Alguém pode ter um exemplo de como converter para ponto nuvem pcl ou malha pcl da estrutura de dados do Open3D?
Obrigado
O I / O atual suporta o formato .pcd, que é o formato principal usado pelo PCL.
Para mesh, tanto PCL quanto Open3D suportam .ply, que é bastante padrão.
Veja isto: http://www.open3d.org/docs/tutorial/Basic/file_io.html
Não tenho muita experiência com ROS. Esse é um problema conhecido de que o Open3D não tem interface com ROS. Estamos planejando resolver isso. Está em nosso roteiro.
obrigado
Consegui converter a nuvem de pontos escrevendo e lendo de / dev / shm, que é um arquivo armazenado na RAM. Provavelmente não é a melhor maneira, mas funciona.
void point_cloud_callback(const sensor_msgs::PointCloud2::ConstPtr& msg)
{
auto start = std::chrono::steady_clock::now();
pcl::PCLPointCloud2 pcl_cloud;
pcl_conversions::toPCL(*msg, pcl_cloud);
pcl::PLYWriter pclWrite;
pclWrite.writeBinary("/dev/shm/point_cloud.ply", pcl_cloud);
open3d::geometry::PointCloud pc;
pc = *open3d::io::CreatePointCloudFromFile("/dev/shm/point_cloud.ply","ply").get();
auto end = std::chrono::steady_clock::now();
std::cout << "Elapsed time in nanoseconds : "
<< std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count()
<< " ns" << std::endl;
}
Essa conversão leva cerca de 244 ms no meu i7-8700 a 4,3 Ghz
@ airfield20 você construiu com sucesso ROS + open3d juntos? Sem o sinalizador -D_GLIBCXX_USE_CXX11_ABI=0
CXX nosso código usando Open3D não compilará, mas com ele nosso código usando ROS não compilará - você não encontrou esse problema?
@ finger563 Eu não os construí juntos, instalei o Open3D separadamente antes de construir meu espaço de trabalho catkin
@ airfield20 foi o que também fizemos. No entanto, se adicionarmos open3d como uma dependência a um de nossos pacotes ROS, obteremos links incompletos - certas funções como CreateVisualizerWindow( ... )
reference são símbolos indefinidos (acredito que devido à falta de compatibilidade de string imposta pelo sinalizador I Mencionado acima). Os documentos dizem para usar ${Open3D_CXX_FLAGS}
que contém esse sinalizador, mas usar esse sinalizador faz com que o código ros não seja vinculado.
Deixa pra lá - nós apenas tivemos que reconstruir o Open3D e definir explicitamente esse sinalizador ao gerar arquivos de compilação com cmake - o padrão mudou esse sinalizador para 0, mas open3d funciona bem e se integra com ROS muito bem se definirmos esse sinalizador para 1.
@ finger563 como você está renderizando mensagens ros usando isso?
Temos um código que projeta uma imagem depth + rgb ( sensor_msgs/Image
) em um pointcloud e, em seguida, cria uma grade de voxel usando open3d. porque é um único nó e queríamos animação e callbacks principais, temos que criar explicitamente a janela e gerenciar o loop de eventos. Semelhante é verdade no lado C ++, que é o que estivemos trabalhando e que encontramos antes.
Também tentei instalar o Open3D com ROS há algumas semanas, mas não tive sucesso. Lembro que existem conflitos de dependências Open3D e ROS, que levam a undefined reference
de funções de visualização. Então decidi remover o Open3D do ROS, escrever minhas próprias funções semelhantes às funções do Open3D
@ ipa-mah sim, para contornar essas referências indefinidas durante a vinculação, você precisa garantir que, ao compilar o Open3D a partir do código-fonte, defina o sinalizador de compilação cmake
-DGLIBCXX_USE_CXX11_ABI=ON
por exemplo
cmake -DBUILD_EIGEN3=ON -DBUILD_GLEW=ON -DBUILD_GLFW=ON -DBUILD_JSONCPP=ON -DBUILD_PNG=ON -DGLIBCXX_USE_CXX11_ABI=ON -DPYTHON_EXECUTABLE=/usr/bin/python ..
Isso permitirá que tudo seja compilado e vinculado adequadamente em um espaço de trabalho catkin com ROS
Acabamos de lançar open3d_ros
para fornecer a funcionalidade de conversão de pointclouds de ROS para Open3D e vice-versa
Também tentei instalar o Open3D com ROS há algumas semanas, mas não tive sucesso. Lembro que existem conflitos de dependências Open3D e ROS, que levam a
undefined reference
de funções de visualização. Então decidi remover o Open3D do ROS, escrever minhas próprias funções semelhantes às funções do Open3D
Estou com o mesmo problema, você resolveu?
Estou com o mesmo problema, você resolveu?
O mesmo problema aqui.
Comentários muito úteis
@ ipa-mah sim, para contornar essas referências indefinidas durante a vinculação, você precisa garantir que, ao compilar o Open3D a partir do código-fonte, defina o sinalizador de compilação cmake
por exemplo
Isso permitirá que tudo seja compilado e vinculado adequadamente em um espaço de trabalho catkin com ROS