Hola,
Me gustaría saber cómo usar Open3D con la biblioteca PCL y ROS. ¿Alguien puede tener un ejemplo de cómo convertir a pcl de nube de puntos o pcl de malla a partir de la estructura de datos de Open3D?
Gracias
La E / S actual admite el formato .pcd, que es el formato principal utilizado por PCL.
Para malla, tanto PCL como Open3D admiten .ply, que es bastante estándar.
Vea esto: http://www.open3d.org/docs/tutorial/Basic/file_io.html
Sin embargo, no tengo mucha experiencia con ROS. Este es un problema conocido que Open3D no tiene interfaz con ROS. Estamos planeando abordarlo. Está en nuestra hoja de ruta.
Gracias
Me las arreglé para convertir la nube de puntos escribiendo y leyendo desde / dev / shm, que es un archivo almacenado en la RAM. Probablemente no sea la mejor manera, pero 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;
}
Esta conversión tarda unos 244 ms en mi i7-8700 a 4,3 Ghz
@ airfield20 ¿construyeron con éxito ROS + open3d juntos? Sin el indicador -D_GLIBCXX_USE_CXX11_ABI=0
CXX, nuestro código que usa Open3D no se compilará, pero con él nuestro código que usa ROS no se compilará, ¿no se encontró con este problema?
@ finger563 No los construí juntos, instalé Open3D por separado antes de construir mi espacio de trabajo catkin
@ airfield20 eso es lo que también hemos hecho. Sin embargo, si agregamos open3d como una dependencia a uno de nuestros paquetes ROS, entonces obtenemos un enlace incompleto: ciertas funciones como CreateVisualizerWindow( ... )
reference son símbolos indefinidos (creo que debido a la falta de compatibilidad de cadenas impuesta por la bandera I mencionado anteriormente). Los documentos dicen usar ${Open3D_CXX_FLAGS}
que contienen esa bandera, pero usar esa bandera hace que el código ros no se vincule.
No importa: solo tuvimos que reconstruir Open3D y establecer explícitamente ese indicador al generar archivos de compilación con cmake; el valor predeterminado cambió ese indicador a 0, pero open3d funciona bien y se integra con ROS perfectamente si establecemos ese indicador en 1.
@ finger563 ¿cómo estás
Tenemos un código que proyecta una imagen de profundidad + rgb ( sensor_msgs/Image
) en una nube de puntos y luego crea una cuadrícula de voxel usando open3d. debido a que es un solo nodo y queríamos animación y devoluciones de llamada de teclas, tenemos que crear explícitamente la ventana y administrar el bucle de eventos. Similar es cierto en el lado C ++ de las cosas, que es en lo que hemos estado trabajando y nos encontramos con esto antes.
También intenté instalar Open3D con ROS hace unas semanas, pero no tuve éxito. Recuerdo que hay conflictos de dependencias de Open3D y ROS, que conducen a undefined reference
de funciones de visualización. Así que decidí eliminar Open3D de ROS, escribir mis propias funciones similares a las funciones de Open3D
@ ipa-mah sí, para sortear esas referencias indefinidas durante la vinculación, debe asegurarse de que, cuando compile Open3D desde la fuente, configure el indicador de compilación cmake
-DGLIBCXX_USE_CXX11_ABI=ON
p.ej
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 ..
Esto permitirá que todo se compile y se vincule correctamente en un espacio de trabajo catkin con ROS
Acabamos de lanzar open3d_ros
para proporcionar la funcionalidad de convertir nubes de puntos de ROS a Open3D y viceversa
También intenté instalar Open3D con ROS hace unas semanas, pero no tuve éxito. Recuerdo que hay conflictos de dependencias de Open3D y ROS, que conducen a
undefined reference
de funciones de visualización. Así que decidí eliminar Open3D de ROS, escribir mis propias funciones similares a las funciones de Open3D
Tengo el mismo problema, ¿lo ha resuelto?
Tengo el mismo problema, ¿lo ha resuelto?
El mismo problema aquí.
Comentario más útil
@ ipa-mah sí, para sortear esas referencias indefinidas durante la vinculación, debe asegurarse de que, cuando compile Open3D desde la fuente, configure el indicador de compilación cmake
p.ej
Esto permitirá que todo se compile y se vincule correctamente en un espacio de trabajo catkin con ROS