MRPT in Mac OS X

丸1年何も書かないのも如何なものかと思う次第なわけでして。

Mac OS XでMRPTをビルドする

最近、Mac(OS X 10.9.2 + clang)でMRPTのビルドに成功しました。バージョンアップが進み、以前に比べてMacでもビルドしやすくなっているようです。推奨の依存ライブラリをHomebrewで入れ、主にヘッダのインクルード絡みの問題を排除していったらビルドできてしまいました。(とは言っても、少なくとも名前なしセマフォの実装を直さないといけませんし、mrpt::hwdriversの一部クラスはビルドできないのですが)

f:id:yuya-oc:20160206212106p:plain

この記事が下書きの間にパッチのプルリクをmasterにマージしてもらえました。1.1.1からはcmakeオプションを幾つかOFFにするだけでビルドできるようになると思われます。やった!

$ cmake .. -DBUILD_ARIA=OFF -DBUILD_XSENS_MT3=OFF -DBUILD_XSENS_MT4=OFF

OS Xの制限

ビルドしたものを使ってみるのですが、CDisplayWindow3Dを使うとすぐに落ちてしまいます。適当にググってみるとMacではGUIのメッセージループをメインスレッド以外から呼ぶのはNGっぽいです。

試しに、wxWidgetsチュートリアルの初期化部分を、mrpt::guiのスレッド内での初期化の流れと同様にすると下のコードになり、これは実行できます。

c++ `wx-config --cflags --libs` wx_gui_thread.cpp

wxTheApp->Run()でメッセージループに入るので、ここをmrpt::guiと同様に別スレッド化します。上のコードではUSE_GUI_THREADの定義を有効にすると、OS Xでの並列処理に使うらしいdispatch_queueを使います。これを実行すると、Assertionで失敗します。pthreadも多分ダメだと思います。

2014-03-08 13:05:30.242 a.out[14510:1603] *** Assertion failure in +[NSUndoManager _endTopLevelGroupings], /SourceCache/Foundation/Foundation-1056.13/Misc.subproj/NSUndoManager.m:328
2014-03-08 13:05:30.243 a.out[14510:1603] +[NSUndoManager(NSInternal) _endTopLevelGroupings] is only safe to invoke on the main thread.

メインスレッド以外はNGとなると、GUIを使うプログラムのメインスレッドは必ずメッセージループに入る、と解釈できてしまいます。そうなるとmrpt::guiを使用する既存コードを維持したまま、mrpt::guiだけをMac用に改良するというのは無理そうです。RawlogViewerなどは動かせているので、GUIが欲しければmrpt::gui以外の方法で作ることになります。

mrpt::guiは当然ながらMRPTクラスとの連携がバッチリな上に、基本的な描画周りの処理をやってくれて便利なのでぜひ使いたかったのですが。

glutの場合はglutMainLoop()をdispatch_queueで呼んでも動いてしまうように見えるのですよね。

元はと言えばロボトレース用のシミュレータをUbuntuで作っていただけだったのにどうしてこうなった。