์๋
ํ์ธ์,
PCL ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ROS์ ํจ๊ป Open3D๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์๊ณ ์ถ์ต๋๋ค. ๋๊ตฌ๋ ์ง Open3D์ ๋ฐ์ดํฐ ๊ตฌ์กฐ์์ ํฌ์ธํธ ํด๋ผ์ฐ๋ pcl ๋๋ ๋ฉ์ฌ pcl๋ก ๋ณํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๊น?
๊ฐ์ฌํฉ๋๋ค
ํ์ฌ I / O๋ PCL์์ ์ฌ์ฉํ๋ ๊ธฐ๋ณธ ํ์ ์ธ .pcd ํ์์ ์ง์ํฉ๋๋ค.
๋ฉ์์ ๊ฒฝ์ฐ PCL๊ณผ Open3D ๋ชจ๋ ํ์ค ์ธ .ply๋ฅผ ์ง์ํฉ๋๋ค.
์ฐธ์กฐ : http://www.open3d.org/docs/tutorial/Basic/file_io.html
๊ทธ๋๋ ROS์ ๋ํ ๊ฒฝํ์ด ๋ง์ง ์์ต๋๋ค. ์ด๊ฒ์ Open3D์ ROS์์ ์ธํฐํ์ด์ค๊ฐ ์๋ค๋ ์๋ ค์ง ๋ฌธ์ ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ํด๊ฒฐํ ๊ณํ์ ๋๋ค. ๋ก๋๋งต์ ์์ต๋๋ค.
๊ฐ์ฌ
RAM์ ์ ์ฅ๋ ํ์ผ ์ธ / dev / shm์์ ์ฐ๊ณ ์ฝ์์ผ๋ก์จ ํฌ์ธํธ ํด๋ผ์ฐ๋๋ฅผ ๋ณํ ํ ์์์์ต๋๋ค. ์๋ง๋ ์ต์ ์ ๋ฐฉ๋ฒ์ ์๋์ง๋ง ์๋ํฉ๋๋ค.
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;
}
์ด ๋ณํ์ 4.3Ghz์ i7-8700์์ ์ฝ 244ms๊ฐ ๊ฑธ๋ฆฝ๋๋ค.
@ airfield20 ROS + open3d๋ฅผ ํจ๊ป ์ฑ๊ณต์ ์ผ๋ก ๊ตฌ์ถ ํ์ต๋๊น? -D_GLIBCXX_USE_CXX11_ABI=0
CXX ํ๋๊ทธ๊ฐ ์์ผ๋ฉด Open3D๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋๋ ์ปดํ์ผ๋์ง ์์ง๋ง ROS๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋๋ ์ปดํ์ผ๋์ง ์์ต๋๋ค.์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์์ต๋๊น?
@ finger563 ํจ๊ป ๋น๋ํ์ง ์์์ผ๋ฉฐ catkin ์์ ๊ณต๊ฐ์ ๋น๋ํ๊ธฐ ์ ์ Open3D๋ฅผ ๋ณ๋๋ก ์ค์นํ์ต๋๋ค.
@ airfield20๋ ์ฐ๋ฆฌ๊ฐ ํ ์ผ์
๋๋ค. ๊ทธ๋ฌ๋ ROS ํจํค์ง ์ค ํ๋์ ๋ํ ์ข
์์ฑ์ผ๋ก open3d๋ฅผ ์ถ๊ฐํ๋ฉด ๋ถ์์ ํ ๋งํฌ๊ฐ ๋ฐ์ํฉ๋๋ค. CreateVisualizerWindow( ... )
์ฐธ์กฐ ์ ๊ฐ์ ํน์ ํจ์๋ ์ ์๋์ง ์์ ๊ธฐํธ์
๋๋ค (๋๋ ํ๋๊ทธ I ์์ ์ธ๊ธํ๋ฏ์ด). ๋ฌธ์๋ ํด๋น ํ๋๊ทธ๋ฅผ ํฌํจํ๋ ${Open3D_CXX_FLAGS}
๋ฅผ ์ฌ์ฉํ๋ค๊ณ ๋งํ์ง๋ง ํด๋น ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ๋ฉด ros ์ฝ๋๊ฐ ๋งํฌ๋์ง ์์ต๋๋ค.
์ ๊ฒฝ ์ฐ์ง ๋ง์ธ์. Open3D๋ฅผ ๋ค์ ๋น๋ํ๊ณ cmake๋ก ๋น๋ ํ์ผ์ ์์ฑ ํ ๋ ํด๋น ํ๋๊ทธ๋ฅผ ๋ช ์ ์ ์ผ๋ก ์ค์ ํด์ผํ์ต๋๋ค. ๊ธฐ๋ณธ๊ฐ์ ํด๋น ํ๋๊ทธ๋ฅผ 0์ผ๋ก ์ค์ ํ์ง๋ง open3d๋ ์ ์์ ์ผ๋ก ์๋ํ๊ณ ํด๋น ํ๋๊ทธ๋ฅผ 1๋ก ์ค์ ํ๋ฉด ROS์ ์ ํตํฉ๋ฉ๋๋ค.
@ finger563 ๊ทธ๊ฒ์ ์ฌ์ฉํ์ฌ ros ๋ฉ์์ง๋ฅผ ์ด๋ป๊ฒ ๋ ๋๋งํฉ๋๊น?
์ฌ๋ + rgb ์ด๋ฏธ์ง ( sensor_msgs/Image
)๋ฅผ ํฌ์ธํธ ํด๋ผ์ฐ๋์ ํฌ์ ํ ๋ค์ open3d๋ฅผ ์ฌ์ฉํ์ฌ ๋ณต์
๊ทธ๋ฆฌ๋๋ฅผ ์์ฑํ๋ ์ฝ๋๊ฐ ์์ต๋๋ค. ๋จ์ผ ๋
ธ๋์ด๊ณ ์ ๋๋ฉ์ด์
๋ฐ ํค ์ฝ๋ฐฑ์ ์ํ๊ธฐ ๋๋ฌธ์ ๋ช
์ ์ ์ผ๋ก ์ฐฝ์ ๋ง๋ค๊ณ ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ๊ด๋ฆฌํด์ผํฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ ์์
ํด์๊ณ ์ด์ ์์ด ๋ฌธ์ ์ ์ง๋ฉด ํ C ++ ์ธก๋ฉด์์๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค.
๋ํ ๋ช ์ฃผ ์ ์ ROS์ ํจ๊ป Open3D๋ฅผ ์ค์นํ๋ ค๊ณ ํ์ง๋ง ์ฑ๊ณตํ์ง ๋ชปํ์ต๋๋ค. Open3D ๋ฐ ROS ์ข
์์ฑ์ด ์ถฉ๋ํ์ฌ undefined reference
์ ์๊ฐํ ํจ์๊ฐ ๋ฐ์ํ๋ค๋ ๊ฒ์ ๊ธฐ์ตํฉ๋๋ค. ๊ทธ๋์ ROS์์ Open3D๋ฅผ ์ ๊ฑฐํ๊ณ Open3D funcs์ ์ ์ฌํ ๋ด ํจ์๋ฅผ ์์ฑํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
@ ipa-mah ์ ๋งํฌํ๋ ๋์ ์ ์๋์ง ์์ ์ฐธ์กฐ๋ฅผ ์ฐํํ๋ ค๋ฉด ์์ค์์ Open3D๋ฅผ ์ปดํ์ผ ํ ๋ cmake ๋น๋ ํ๋๊ทธ๋ฅผ ์ค์ ํ๋์ง ํ์ธํด์ผํฉ๋๋ค.
-DGLIBCXX_USE_CXX11_ABI=ON
์
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 ..
๊ทธ๋ฌ๋ฉด ROS๊ฐ์๋ catkin ์์ ๊ณต๊ฐ์์ ๋ชจ๋ ๊ฒ์ด ์ ๋๋ก ์ปดํ์ผ๋๊ณ ๋งํฌ๋ฉ๋๋ค.
ํฌ์ธํธ ํด๋ผ์ฐ๋๋ฅผ ROS์์ Open3D๋ก ๋๋ ๊ทธ ๋ฐ๋๋ก ๋ณํํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ธฐ ์ํด ๋ฐฉ๊ธ open3d_ros
์ ์ถ์
๋ํ ๋ช ์ฃผ ์ ์ ROS์ ํจ๊ป Open3D๋ฅผ ์ค์นํ๋ ค๊ณ ํ์ง๋ง ์ฑ๊ณตํ์ง ๋ชปํ์ต๋๋ค. Open3D ๋ฐ ROS ์ข ์์ฑ์ด ์ถฉ๋ํ์ฌ
undefined reference
์ ์๊ฐํ ํจ์๊ฐ ๋ฐ์ํ๋ค๋ ๊ฒ์ ๊ธฐ์ตํฉ๋๋ค. ๊ทธ๋์ ROS์์ Open3D๋ฅผ ์ ๊ฑฐํ๊ณ Open3D funcs์ ์ ์ฌํ ๋ด ํจ์๋ฅผ ์์ฑํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ํด๊ฒฐ ํ์ต๋๊น?
๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ํด๊ฒฐ ํ์ต๋๊น?
์ฌ๊ธฐ์๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@ ipa-mah ์ ๋งํฌํ๋ ๋์ ์ ์๋์ง ์์ ์ฐธ์กฐ๋ฅผ ์ฐํํ๋ ค๋ฉด ์์ค์์ Open3D๋ฅผ ์ปดํ์ผ ํ ๋ cmake ๋น๋ ํ๋๊ทธ๋ฅผ ์ค์ ํ๋์ง ํ์ธํด์ผํฉ๋๋ค.
์
๊ทธ๋ฌ๋ฉด ROS๊ฐ์๋ catkin ์์ ๊ณต๊ฐ์์ ๋ชจ๋ ๊ฒ์ด ์ ๋๋ก ์ปดํ์ผ๋๊ณ ๋งํฌ๋ฉ๋๋ค.