Open3d: Open3D๋ฅผ PCL ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ROS์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์˜ˆ์ œ

์— ๋งŒ๋“  2018๋…„ 06์›” 26์ผ  ยท  14์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: intel-isl/Open3D

์•ˆ๋…•ํ•˜์„ธ์š”,
PCL ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ROS์™€ ํ•จ๊ป˜ Open3D๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋“ ์ง€ Open3D์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์—์„œ ํฌ์ธํŠธ ํด๋ผ์šฐ๋“œ pcl ๋˜๋Š” ๋ฉ”์‰ฌ pcl๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์˜ˆ์ œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?
๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

question

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@ 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 ์ž‘์—… ๊ณต๊ฐ„์—์„œ ๋ชจ๋“  ๊ฒƒ์ด ์ œ๋Œ€๋กœ ์ปดํŒŒ์ผ๋˜๊ณ  ๋งํฌ๋ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  14 ๋Œ“๊ธ€

ํ˜„์žฌ 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์™€ ์œ ์‚ฌํ•œ ๋‚ด ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐ ํ–ˆ์Šต๋‹ˆ๊นŒ?

๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐ ํ–ˆ์Šต๋‹ˆ๊นŒ?

์—ฌ๊ธฐ์—๋„ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰