1 Matterport3D シミュレータのソース コードをコンパイルする
Windows 上で Matterport3D Simulator をコンパイルするには少し不便で、CMakeLists.txt をいくつか変更する必要があります。より良い方法があればコメントしてください。
1.1 ソースコードのダウンロード
または、 Github で Matterport3D Simulator のリポジトリを直接検索し、ソース コードをダウンロードします。
pybind11 @ 86e2ad4
zip 方式を使用する場合は、圧縮パッケージをダウンロードした後、クリックして pybind11 のリポジトリにジャンプしてソース コードをダウンロードし、
pybind11 のソース コードを Matterport3D シミュレーターのルート ディレクトリの pybind11 フォルダーに解凍する必要があります。ソースコードは以下の通り。- git を使用してダウンロードする場合は、次のコマンドを使用し、必ず
--recursive
オプションを追加してください。
git clone --recursive https://github.com/peteanderson80/Matterport3DSimulator.git
最後に、ソースコードのルートディレクトリとpybind11ディレクトリは以下の通りです。
1.2 プロセスの構成
ソース コードを準備した後、CMake gui を開き、次のようにソース コード パスとコンパイル パス
を設定し、[構成] をクリックして構成し、ポップアップの黄色のボックスで Visual Studio と x64 を選択します
。エラー メッセージと
その理由を確認してください。 OpenCV が見つからないため、「OpenCV_DIR」を OpenCVConfig.cmake を含むパスに設定する必要があります。これは最初に変更する必要があります。
1.2.1 OpenCV_DIRの追加
先ほどダウンロードしてインストールした OpenCV のルート ディレクトリを開きます。「build\x64\vc15\lib」ディレクトリに、OpenCV が提供する OpenCVConfig.cmake があります。このディレクトリの絶対パスをCMakeLists.txt に設定する
だけです。 Matterport3D シミュレーターのルートを開き、ディレクトリ内の CMakeLists.txt ファイルに上記の文を追加しますfind_package(OpenCV REQUIRED)
set(OpenCV_DIR D:/1-Compiler/dependency/opencv/build/x64/vc15/lib)
独自の対応する絶対パスを続けて、「\」の代わりに「/」を使用することに注意し、
以下に示すように保存し、CMake gui に戻って再度設定すると、上記のエラーはスキップされます。しかし、驚くことではありません。再びエラーが報告されました。情報は次のとおりです。PkgConfig が
見つかりません。解決策は PkgConfig をインストールすることですが、Windows で PkgConfig を使用する良い方法が見つからなかったので、PkgConfig を直接次のように変更しました。同様の機能を持つ find_package コマンド。これは 2 番目の変更です。
1.2.2 pkg_check_modules を find_package に置き換えます
直接注釈が最初にfind_package(PkgConfig REQUIRED)
配置され、次に配置されます。
pkg_check_modules(JSONCPP REQUIRED jsoncpp)
に変更されました
find_package(JSONCPP REQUIRED jsoncpp)
変更結果は以下の通りですが、より良い解決策があればコメントでお知らせください。
保存後、CMake gui に戻って再度設定すると、上記のエラーはスキップされます。しかし、驚くべきことではありません。エラーが再び報告されます。メッセージは次のとおりです。文字通り、
JSONCPP が見つからないことを意味します。これは、以前に OpenCV が見つからなかったのと同じエラーです。これは、変更する必要がある 3 番目の場所です。
1.2.3 JSONCPP_DIRの追加
「OpenCV_DIR」の追加と同様に、先ほどダウンロードしてインストールしたjsoncppのルートディレクトリを開くと、 「 \lib\cmake\jsoncpp 」ディレクトリ内にjsoncppが提供するjsoncppConfig.cmakeがありますが、ここでもう一つ修正が必要です。
まず、jsoncppConfig.cmake ファイルを開き、下部に文を追加します
set(JSONCPP_FOUND True)
次に、Matterport3D シミュレーターのルート ディレクトリにある CMakeLists.txt ファイルを開き、find_package(JSONCPP REQUIRED jsoncpp)
上記の文を追加します
set(JSONCPP_DIR D:/1-Compiler/dependency/jsoncpp-master/lib/cmake/jsoncpp)
独自の対応する絶対パスを続けて、「\」の代わりに「/」を使用することに注意し、
以下に示すように保存し、CMake gui に戻って再度設定すると、上記のエラーはスキップされます。しかし当然のことながら、再びエラーが報告されました。情報は次のとおりで、
文字通り GLEW が見つからないことを意味します。これは 4 番目の修正が必要です。
1.2.4 グローパスの追加
以前にインストールした GLEW ルート ディレクトリを開いて注意深く検索すると、対応する config.cmake ファイルがないことがわかり、OpenCV や JSONCPP のような glew の問題を解決できません。CMakeLists.txt を読むと、最初のエラーが報告されている場所は、
最初に find_package を使用して glew の場所を見つけ、次に glew のライブラリ パスを変数GLEW_LIBRARIES
として設定するという趣旨の次の文です。GL_LIBS
find_packageが見つからないので、GLEW_LIBRARIES
glewライブラリディレクトリの絶対パスとして直接設定し、
以下のようにfind_package(GLEW REQUIRED)に直接アノテーションを付けて、以下の文を追加します。
set(GLEW_LIBRARIES D:/1-Compiler/dependency/glew-2.2.0/lib/Release/x64)
保存後、CMake gui に戻って再度設定すると、上記のエラーはスキップされ、今回は他のエラーは報告されず、コンパイルされたファイルは正常に生成されます。
1.2.5 Python インタープリターの指定
上記の変更が完了すると、構成でエラーは報告されなくなりますが、現時点ではプロジェクトを生成できないため、CMake GUI で関連するオプションを構成する必要があります。PYTHON_EXECUTABLE
ここでは、使用したい Python インタープリターにオプションを設定する必要があります。ここでは、次のように Miniconda に付属のインタープリターに一時的に設定します。
1.2.6 指定 CMAKE_BUILD_TYPE
同時にCMAKE_BUILD_TYPE
Releaseに設定します。
これらを完了した後に再度設定し、コンパイルされたプロジェクトを生成して開くことを選択します。
1.3 コンパイルプロセス
以下に示すように、上記で生成されたコンパイル済みプロジェクトを開き、
構成がリリース + x64 であることを確認してから、プロジェクトのコンパイルを開始します。
1.3.1 MatterSim プロジェクトをコンパイルする
まず、MatterSim プロジェクトをコンパイルします。右クリックしてコンパイルします。驚くことではありません。多くのエラーが報告されます。
順番に見てみましょう。エラーは次のとおりです。
- 致命的エラー C1083: インクルード ファイルを開けません: 'GL/glew.h': そのようなファイルまたはディレクトリはありません
- 致命的エラー C1083: インクルード ファイルを開けません: 'json/json.h': そのようなファイルまたはディレクトリはありません
- エラー C2131: 式が定数として評価されませんでした
1.3.1.1 致命的エラー C1083: インクルード ファイルを開けません:
致命的なエラー C1083 エラーは、ヘッダー ファイルが見つからないことを意味します。これは簡単に解決でき、Matterport3D シミュレーターのルート ディレクトリにある CMakeLists.txt に対応するヘッダー ファイル ディレクトリを含めるだけです。
CMakeLists.txt を開いて、glew が設定されている場所に追加します。
include_directories(D:/1-Compiler/dependency/glew-2.2.0/include)
jsoncppの設定に関連する箇所に追記
include_directories(D:/1-Compiler/dependency/jsoncpp-master/include)
追加した結果は以下のようになります
1.3.1.2 エラー C2131: 式が定数として評価されませんでした
ダブルクリックしてエラーが報告されている場所を見つけ、
以下に示すように注意深く読んでください。Visual Studio コンパイラは配列の動的作成をサポートしていないことがわかりますが、ソース コードは実際には Linux でコンパイルされています。 C++11 ではこの書き方をサポートしています。
したがって、ダブルクリックして間違った行にジャンプし、これらの書き込み方法を動的メモリ割り当てに置き換えるだけで済みます。
- 意思
float gaussian_range[filter_size];
と置換する
float* gaussian_range = new float[filter_size];
- 意思
uint8_t im[NN];
と置換する
uint8_t* im = new uint8_t[NN];
- 意思
int pyr_heights[num_scales];
int pyr_widths[num_scales];
int pyr_offsets[num_scales];
と置換する
int* pyr_heights = new int[num_scales];
int* pyr_widths = new int[num_scales];
int* pyr_offsets = new int[num_scales];
上記の場所を変更した後、CMake GUI で再構成して再度生成し、新しいコンパイル プロジェクトを開いて MatterSim プロジェクトを再度コンパイルしても、まだ 2 つの小さなエラーが残っています
- 致命的エラー C1083: インクルード ファイルを開けません: 'glm/glm.hpp': そのようなファイルまたはディレクトリはありません
この問題については、次のように、Matterport3D シミュレーターのルート ディレクトリにある CMakeLists.txt に glm の関連ディレクトリを追加するだけで済みます。
- 致命的エラー C1083: インクルード ファイルを開けません: 'jsoncpp/json/json.h': そのようなファイルまたはディレクトリはありません
このjsonのヘッダーファイルが追加されており、これまでのインクルージョンの書き方とは異なりますので、統一してダブルクリックで見つけて直接変更してください。
#include <json/json.h>
次に、次のようにプロジェクトを再生成してコンパイルし、再度エラーを報告します。
1.3.1.3 エラー C2065: 'M_PI': 宣言されていない識別子
このエラーは、MatterSim.hpp と MatterSim.hpp の M_PI が定義されていないことを示しているため、これら 2 つのファイルの先頭に直接追加します
#define M_PI 3.1415926
次のようにし
て再度コンパイルすると、今度は次のようにリンクエラーが発生しました
1.3.1.4 エラー LNK2019: 未解決の外部シンボル
よく見てみると、jsoncpp 関連のライブラリが見つからないことがわかります。Matterport3D シミュレーターに jsoncpp ライブラリ ファイル ディレクトリを追加し、CMakeLists.txt の jsoncpp 関連の場所に追加するだけです。
set(JSONCPP_LIBRARIES D:/1-Compiler/dependency/jsoncpp-master/lib/jsoncpp.lib)
次のように結果を追加し
、再生成して再度コンパイルし、最終的に正常にコンパイルされると、結果は次のようになります。
1.3.2 mattersim_main プロジェクトをコンパイルする
次に、次のように右クリックして mattersim_main プロジェクトをコンパイルします。驚く ことではありませんが、Release\MatterSim.lib へのリンクが見つからないという
小さなエラーが表示されますが、CMakeLists.txt はそれが実際にダイナミック ライブラリであることを指定しています。
今コンパイルしたものは確かに dll ファイルです。
この問題を解決するには、静的ライブラリを直接コンパイルするだけです。生成された型を Visual Studio で直接変更しようとしましたが、うまくいきませんでした。 Matterport3DシミュレーターのルートディレクトリにCMakeLists.txtを
配置し、
add_library(MatterSim STATIC src/lib/MatterSim.cpp src/lib/NavGraph.cpp src/lib/Benchmark.cpp src/lib/cbf.cpp)
に変更されました
add_library(MatterSim SHARED src/lib/MatterSim.cpp src/lib/NavGraph.cpp src/lib/Benchmark.cpp src/lib/cbf.cpp)
その後、MatterSim プロジェクトを再構成、生成、コンパイルするだけで、無事に MatterSim.lib が取得できました。
以下のようにして MatterSim.lib を取得したら、ダイナミック ライブラリのコンパイルに戻ります。
add_library(MatterSim SHARED src/lib/MatterSim.cpp src/lib/NavGraph.cpp src/lib/Benchmark.cpp src/lib/cbf.cpp)
に変更されました
add_library(MatterSim STATIC src/lib/MatterSim.cpp src/lib/NavGraph.cpp src/lib/Benchmark.cpp src/lib/cbf.cpp)
次に、再度再生成して、mattersim_main を個別にコンパイルすると、直接成功します。
1.3.3 テストプロジェクトをコンパイルする
テスト プロジェクトを再度コンパイルすると、直接成功します。
1.3.4 MatterSimPython プロジェクトをコンパイルする
次に、右クリックして MatterSimPython をコンパイルすると、小さなエラーが発生します。
- リンク : 致命的なエラー LNK1149: 出力ファイル名が入力ファイル名 'D:\1-Compiler\dependency\Matterport3DSimulator-master\build\Release\MatterSim.lib' と一致するため、名前が重複しています。名前を変更します。 MatterSim.lib は
MatterSim0.lib を生成し、MatterSimPython プロジェクト構成のリンカー入力にある MatterSim.lib を MatterSim0.lib に変更し、
保存して再コンパイルして、
最終的に MatterSim.cp39-win_amd64.pyd を直接正常に取得します。
1.4 概要
ここまでで、Matterport3D シミュレーターのソース コードのコンパイルが完了しました。次に、Python を使用して Matterport3D シミュレーター API を呼び出す方法を記録します。