見出し画像

【Mac】openFrameworksでPCL導入時のエラーまとめ

この記事が初めての投稿となります。
noteの使い方をいまいち理解できていません。。。

自分の立場ですが、openFrameworksからプログラミングに触れ始めたタイプの開発者です。
 ofは普段触ってはいるもののc++はほとんど勉強中。。という状態です。

PCLの環境構築時にエラーにぶちあたりまくったこと、よく分からずに調べたところを備忘録としてまとめます。

開発を行う環境

・macOS Catalina ver.10.15.3
・Xcode 10.3 (Xcode11.4.1から問題があったので変更)
・openFrameworks of_v0.11.0

そもそも今回やろうとしたこと

[openFrameworks]
・KinectV2からRGB画像と深度画像を取得し、カラー付きのポイントクラウドを形成。
・取得したポイントクラウドをPCLのVoxelGridFilterを使いダウンサンプリング。
・ ポイントクラウドを上位ビット、下位ビット、カラー情報に分けてそれぞれテクスチャを作成。
・作成したテクスチャをそれぞれSyphonで送信

動機

ポイントクラウドで、扱う頂点の個数を調整するためにPCLというのがあるということを知りました。
PCL(Point Cloud Library)
2D3Dの点群データを扱う際の処理を簡単にできるようにまとめられたライブラリとザックリ解釈。
今回はその処理の中で点群の個数の調整がが行えるVoxelGridFilterというのが使いたい分けです。
VoxelGridFilter
https://tom0930.hatenablog.com/entry/2018/07/14/151552 
この記事などを参考にすると、点群が配置されている空間を指定したサイズのボクセル単位でスキャンして範囲内のものを一点に置き直していくイメージのようです。

実際にやったこと

・KinectV2からRGB画像と深度画像を取得し、カラー付きのポイントクラウドを形成

こちらのアドオンofxKinectV2を使用します。
以前まではofxMulitiKinectV2を使用していたのですが、久しぶりにexample動かしてみるとどうにもRGB画像だけ取得できない。。ofxTurboJpegに問題があるのか。。なので今回はofxKinectV2を使用しています。
SDKを直接叩くところは今回は敬遠しました。
このあとPCLをライブラリからつかうので本来はアドオン使わずにやった方がいいと思います。

・取得したポイントクラウドをPCLのVoxelGridFilterを使いダウンサンプリング

すでにofxPCLまたはこっち)というアドオンがありますが、サンプルファイルの行列計算のところでエラーが出てしましい、自力では解決ができませんでした。。
せっかくなので今まで遠ざけていたライブラリを組み込むところからやろうという流れです。

まずはPCLをインストールするところから始めます。
https://qiita.com/ucla99/items/4d88565412bfbff6ded0
このQiitaの記事を参考にしました。
Homebrewを使ってインストール。

$brew update
$brew install -vd boost Eigen flann vtk
$brew install -pcl 

ここですんなりいくように書いてありましたが、自分の環境ではエラーが。(エラーコードをログとっていなくてすいません。。)

$brew info pcl
pcl: stable 1.9.1 (bottled), HEAD
Library for 2D/3D image and point cloud processing
http://www.pointclouds.org/
/usr/local/Cellar/pcl/1.9.1_8 (1,173 files, 147.4MB) *
 Poured from bottle on 2020-04-14 at 14:07:00
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/pcl.rb
==> Dependencies
Build: cmake ✔, pkg-config ✔
Required: boost ✔, cminpack ✔, eigen ✔, flann ✔, glew ✔, libusb ✔, qhull ✔, vtk ✔

 本来brew info pcl で確認すると上のように、pclのバージョンと依存関係が出てくるのですが、エラーが出たときにはboost, flann, glewあたりに✅ではなく❌がつきまくっていました。
それらの依存関係をbrew info で見てみるとまた❌が。。
みたいな感じでどうもライブラリがボロボロになっていました。おそらく過去にbrewで適当にコマンドかけたりしていたからなのでしょうか。。

$brew unlink ~
$brew reinstall ~

はじめは上記のコマンドで一個一個直していましたが、どうにもpython3.8 だけは正常にインストールができない。

結局、時間と通信量はかかりましたが、ここのQiitaを参考にbrewを丸ごと入れ直してなんとかpclをインストール。

先ほどの記事にしたがって次にXcodeでライブラリのを使う設定をしていきます。

・openFrameworksのprojectGeneratorをつかってプロジェクトを生成。

・TARGETSのBuild SettingからHeader Search Pathsに(念のためUser Header Search Pathにも)以下を追加。
プロジェクトにHeaderの場所を教えてあげます。

/usr/local/include/pcl-<バージョン名>
/usr/local/include/eigen3
/usr/local/include
/usr/local/Cellar/vtk/<バージョン名>/include

・Library Search Pathsに以下を追加。
同じくdylibの場所を教えてあげます。

/usr/local/lib
/usr/local/Cellar/vtk/<バージョン名>/lib
/usr/local/Cellar/boost/<バージョン名>/lib

インストール時でディレクトリのバージョン名が異なるので変更します。

・TARGETSのBuild PhasesからLink Binary with Librariesに以下を追加

OpenGL
Cocoa.framework
IOKit.framework
libz.tbd
/usr/local/Cellar/vtk/<バージョン名>/lib/libvtk*.dylib 
/usr/local/Cellar/pcl/<バージョン名>/lib/libpcl*.dylib

・TARGETSのBuild PhasesからCopy Filesで
Distination→Frameworksに設定
Copy only when installingに✅
Link Binary with Librariesに追加したものと同じものを追加
(ここで行っていることの意味をわかっていないままです。)

これでリンク付けはできたので、まずは一度なにも書かずに実行。
ビルドは通って、実行まで成功しました。

ということで次に、VoxelGridFilterのサンプルファイルをコピペして実行。

void ofApp::setup(){
     pcl::PCLPointCloud2::Ptr cloud (new pcl::PCLPointCloud2 ());
 pcl::PCLPointCloud2::Ptr cloud_filtered (new pcl::PCLPointCloud2 ());

 // Fill in the cloud data
 pcl::PCDReader reader;
 // Replace the path below with the path where you saved your file
 reader.read ("table_scene_lms400.pcd", *cloud); // Remember to download the file first!

 std::cerr << "PointCloud before filtering: " << cloud->width * cloud->height 
      << " data points (" << pcl::getFieldsList (*cloud) << ").";

 // Create the filtering object
 pcl::VoxelGrid<pcl::PCLPointCloud2> sor;
 sor.setInputCloud (cloud);
 sor.setLeafSize (0.01f, 0.01f, 0.01f);
 sor.filter (*cloud_filtered);

 std::cerr << "PointCloud after filtering: " << cloud_filtered->width * cloud_filtered->height 
      << " data points (" << pcl::getFieldsList (*cloud_filtered) << ").";

 pcl::PCDWriter writer;
 writer.write ("table_scene_lms400_downsampled.pcd", *cloud_filtered, 
        Eigen::Vector4f::Zero (), Eigen::Quaternionf::Identity (), false);

 return (0)
}

ビルドは通った!のですが、実行時にエラーで停止。

dyld: Library not loaded: @rpath/... Referenced from: ... 
Reason: no suitable image found

    code signature invalid


https://hacknote.jp/archives/19874/ 
https://qiita.com/nakagawa1017/items/4be5ca91b790e95f0205
https://qiita.com/gki/items/3607e0fe0c83d1c64dc4
上記のエラーメッセージでググって出てきた対処法を一通り試しましたが、エラーはなくならず。
https://qiita.com/Arime/items/e1df2a8c3d4c2ce75069
code signature invalidでコード署名がされていないよと指摘されているdylibファイルに自分で作った証明書でサイン(ここを参考)したものの、延々とファイルのサインを要求され続ける状態に。

同様のライブラリのリンクをopenCVでも試したところ、同じようなdyld: Library not loaded:に続くエラーがでたため、pclの問題ではないのかも、と思い、Xcodeのバージョンを変えてみました。
結果、Xcodeをそのとき使っていたバージョン11.4.1から10.3にバージョンを落とすことで実行ができました。
なので結局、根本的解決には至っていませんが、今回は10.3で進めることにしました。

・ ポイントクラウドを上位ビット、下位ビット、カラー情報に分けてそれぞれテクスチャを作成。

今回はpclには影響がないの割愛。

・作成したテクスチャをそれぞれSyphonで送信

ofxSyphonをつかって画像を送信します。
が、ここでアドオンを追加したことで、またエラーが出ました。

/Applications/of_v0.11.0_osx_release/libs/openFrameworks/events/ofEvent.h:204:40: A space is required between consecutive right angle brackets (use '> >')
〜
〜
〜
Too many errors emitted, stopping now

どうやらof内のboostとpcl内のboostがぶつかってる?(正確には分かりません)ためにエラーが出たようです。

・TARGETSのBuild SettingからApple Clang - Language - C++を

C++ Language Dialect → GNU++ 11
C++ Standard Library → libc++

に変更することでエラーは回避できました。
が、これも何故なのかの理解には至っていません。。。

以上の手順でなおらない場合、(私の場合は他のアドオンofxOscを追加すると再度同様のエラーが出るようになった)
・TARGETSのBuild PhaseのCopy Files にコピーした.dylibファイルを削除。
・Copy only When Installingのチェックマークを外す
で対処ができました。

一通りここまでで目的としていたことは実現しましたが、何故解決したのか分からない点については解明次第追記していければと思います。

この記事が気に入ったらサポートをしてみませんか?