源码编译安装Open3D并解决与ROS冲突问题,最后使用一个实例进行测试

下载源码:

https://github.com/IntelVCL/Open3D.git

编译安装

util/scripts/install-deps-ubuntu.sh #会与ros冲突,会卸载掉ros,不过编译安装好后再重装ros即可
mkdir build
cd build
cmake ..
make
sudo make install

重装ros

sudo apt-get install ros-kinetic-desktop-full

源码编译安装libpng16,因为重装ros之后会自动卸载掉install-deps-ubuntu.sh安装的libpng16,而libpng16又是编译open3d的C++项目时的必备第三方库,所需要手动源码编译安装.

tar -zxvf libpng-1.6.35.tar.xz
cd libpng-1.6.35
mkdir build
cd build
cmake ..
make
sudo make install

测试用例

open3d_01.cpp

#include <iostream>
#include <memory>
#include <thread>

#include <Core/Core.h>
#include <IO/IO.h>
#include <Visualization/Visualization.h>

int main(int argc, char *argv[])
{
	using namespace open3d;

	SetVerbosityLevel(VerbosityLevel::VerboseAlways);
	if (argc < 3) {
		PrintInfo("Open3D %s\n", OPEN3D_VERSION);
		PrintInfo("\n");
		PrintInfo("Usage:\n");
		PrintInfo("    > TestVisualizer [mesh|spin|slowspin|pointcloud|rainbow|image|depth|editing] [filename]\n");
		PrintInfo("    > TestVisualizer [animation] [filename] [trajectoryfile]\n");
		return 0;
	}

	std::string option(argv[1]);
	if (option == "mesh") {
		auto mesh_ptr = std::make_shared<TriangleMesh>();
		if (ReadTriangleMesh(argv[2], *mesh_ptr)) {
			PrintWarning("Successfully read %s\n", argv[2]);
		} else {
			PrintError("Failed to read %s\n\n", argv[2]);
			return 0;
		}
		mesh_ptr->ComputeVertexNormals();
		DrawGeometries({mesh_ptr}, "Mesh", 1600, 900);
	} else if (option == "spin") {
		auto mesh_ptr = std::make_shared<TriangleMesh>();
		if (ReadTriangleMesh(argv[2], *mesh_ptr)) {
			PrintWarning("Successfully read %s\n", argv[2]);
		} else {
			PrintError("Failed to read %s\n\n", argv[2]);
			return 0;
		}
		mesh_ptr->ComputeVertexNormals();
		DrawGeometriesWithAnimationCallback({mesh_ptr},
				[&](Visualizer *vis) {
					vis->GetViewControl().Rotate(10, 0);
					std::this_thread::sleep_for(std::chrono::milliseconds(30));
					return false;
				}, "Spin", 1600, 900);
	} else if (option == "slowspin") {
		auto mesh_ptr = std::make_shared<TriangleMesh>();
		if (ReadTriangleMesh(argv[2], *mesh_ptr)) {
			PrintWarning("Successfully read %s\n", argv[2]);
		} else {
			PrintError("Failed to read %s\n\n", argv[2]);
			return 0;
		}
		mesh_ptr->ComputeVertexNormals();
		DrawGeometriesWithKeyCallbacks({mesh_ptr},
				{{GLFW_KEY_SPACE, [&](Visualizer *vis) {
					vis->GetViewControl().Rotate(10, 0);
					std::this_thread::sleep_for(std::chrono::milliseconds(30));
					return false;
				}}}, "Press Space key to spin", 1600, 900);
	} else if (option == "pointcloud") {
		auto cloud_ptr = std::make_shared<PointCloud>();
		if (ReadPointCloud(argv[2], *cloud_ptr)) {
			PrintWarning("Successfully read %s\n", argv[2]);
		} else {
			PrintError("Failed to read %s\n\n", argv[2]);
			return 0;
		}
		cloud_ptr->NormalizeNormals();
		DrawGeometries({cloud_ptr}, "PointCloud", 1600, 900);
	} else if (option == "rainbow") {
		auto cloud_ptr = std::make_shared<PointCloud>();
		if (ReadPointCloud(argv[2], *cloud_ptr)) {
			PrintWarning("Successfully read %s\n", argv[2]);
		} else {
			PrintError("Failed to read %s\n\n", argv[2]);
			return 0;
		}
		cloud_ptr->NormalizeNormals();
		cloud_ptr->colors_.resize(cloud_ptr->points_.size());
		double color_index = 0.0;
		double color_index_step = 0.05;

		auto update_colors_func = [&cloud_ptr](double index) {
			auto color_map_ptr = GetGlobalColorMap();
			for (auto &c : cloud_ptr->colors_) {
				c = color_map_ptr->GetColor(index);
			}
		};
		update_colors_func(1.0);

		DrawGeometriesWithAnimationCallback({cloud_ptr},
				[&](Visualizer *vis) {
					color_index += color_index_step;
					if (color_index > 2.0) color_index -= 2.0;
					update_colors_func(fabs(color_index - 1.0));
					std::this_thread::sleep_for(std::chrono::milliseconds(100));
					return true;
				}, "Rainbow", 1600, 900);
	} else if (option == "image") {
		auto image_ptr = std::make_shared<Image>();
		if (ReadImage(argv[2], *image_ptr)) {
			PrintWarning("Successfully read %s\n", argv[2]);
		} else {
			PrintError("Failed to read %s\n\n", argv[2]);
			return 0;
		}
		DrawGeometries({image_ptr}, "Image", image_ptr->width_,
				image_ptr->height_);
	} else if (option == "depth") {
		auto image_ptr = CreateImageFromFile(argv[2]);
		PinholeCameraIntrinsic camera;
		camera.SetIntrinsics(640, 480, 575.0, 575.0, 319.5, 239.5);
		auto pointcloud_ptr = CreatePointCloudFromDepthImage(*image_ptr,
				camera);
		DrawGeometries({pointcloud_ptr}, "PointCloud from Depth Image",
				1920, 1080);
	} else if (option == "editing") {
		auto pcd = CreatePointCloudFromFile(argv[2]);
		DrawGeometriesWithEditing({pcd}, "Editing", 1920, 1080);
	} else if (option == "animation") {
		auto mesh_ptr = std::make_shared<TriangleMesh>();
		if (ReadTriangleMesh(argv[2], *mesh_ptr)) {
			PrintWarning("Successfully read %s\n", argv[2]);
		} else {
			PrintError("Failed to read %s\n\n", argv[2]);
			return 0;
		}
		mesh_ptr->ComputeVertexNormals();
		if (argc == 3) {
			DrawGeometriesWithCustomAnimation({mesh_ptr}, "Animation", 1920,
					1080);
		} else {
			DrawGeometriesWithCustomAnimation({mesh_ptr}, "Animation", 1600,
					900, 50, 50, argv[3]);
		}
	}

	PrintInfo("End of the test.\n");

	return 1;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.1)
add_definitions(-std=c++11)
project(TestVisualizer)

set(CMAKE_PREFIX_PATH "/usr/local/lib/cmake/Open3D")
find_package(Open3D HINTS ${CMAKE_INSTALL_PREFIX}/lib/CMake)
list(APPEND Open3D_LIBRARIES dl)

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${Open3D_C_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Open3D_CXX_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${Open3D_EXE_LINKER_FLAGS}")

# Set OS-specific things here
add_definitions(-DUNIX)
add_compile_options(-Wno-deprecated-declarations)
add_compile_options(-Wno-unused-result)
add_definitions(-O3)

# Open3D
if (Open3D_FOUND)
    message(STATUS "Found Open3D ${Open3D_VERSION}")
    # link_directories must be before add_executable
    link_directories(${Open3D_LIBRARY_DIRS})
    add_executable(TestVisualizer "open3d_01.cpp")
    target_link_libraries(TestVisualizer ${Open3D_LIBRARIES})
    target_include_directories(TestVisualizer PUBLIC ${Open3D_INCLUDE_DIRS})
else ()
    message(SEND_ERROR "Open3D not found")
endif ()

运行测试用例

./TestVisualizer pointcloud fragment.pcd

在这里插入图片描述

要将ROS Noetic中的点云话题转换为三角化的物体并保存,请按照以下步骤操作: 1. 安装Open3D:在终端中运行以下命令进行安装: ``` pip install open3d ``` 2. 编写ROS节点:创建一个ROS节点,订阅点云话题,并将其转换为Open3D中的PointCloud数据结构。然后,使用Open3D中的三角化函数将点云转换为三角化的Mesh对象。最后,将Mesh保存到本地文件中。以下是一个简单的Python节点示例: ```python #!/usr/bin/env python import rospy from sensor_msgs.msg import PointCloud2 import open3d as o3d def callback(data): # Convert ROS PointCloud2 to Open3D PointCloud pcd = o3d.io.read_point_cloud_from_ros(data) # Triangulate the point cloud mesh, _ = o3d.geometry.TriangleMesh.create_from_point_cloud_poisson(pcd) # Save the mesh to a file o3d.io.write_triangle_mesh("mesh.obj", mesh) def listener(): rospy.init_node('pointcloud_to_mesh', anonymous=True) rospy.Subscriber("/camera/depth/color/points", PointCloud2, callback) rospy.spin() if __name__ == '__main__': listener() ``` 上述代码将ROS话题`/camera/depth/color/points`转换为Open3D的PointCloud对象,然后使用Poisson算法将其三角化。最后,将三角化的Mesh对象保存为OBJ文件。 3. 运行节点:在终端中运行ROS节点: ``` rosrun <package_name> <node_name>.py ``` 请将`<package_name>`和`<node_name>`替换为您的包和节点名称。 4. 查看结果:在节点运行期间,它将不断接收点云数据并将其转换为三角化的Mesh对象,并将其保存为OBJ文件。您可以使用MeshLab等软件打开OBJ文件以查看结果。 希望这可以帮助您将ROS Noetic中的点云数据转换为三角化的物体并将其保存到本地文件中。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值