MC_RTC_BUILD_STATICをプログラムでサポートする方法

MC_RTC_BUILD_STATICは、mc_rtcのビルドオプションです。主に、オンラインデモを実現するために使用されます。このオプションを使用すると、コントローラー、有限オートマトンの状態、ロボットモジュール、観測器、プラグインを動的に読み込めなくなります。そのため、これらのコンポーネントをmc_rtcのライブラリに組み込む必要があります。

このページでは、まず、このオプションを使用してプロジェクトをコンパイルする際に必要な作業について説明します。次に、デモをWebに公開するためのガイドラインについて説明します。

プロジェクトを修正する

まず、コントローラーその他の必要なコンポーネントをmc_rtcのソースツリー内でビルドする必要があります。といっても、mc_rtcのcontrollersフォルダー、observersフォルダー、pluginsフォルダー、robotsフォルダーのいずれかにプロジェクトを置いてビルドするだけです。各フォルダーは、単にプロジェクトを整理する手段として用意されているだけで、どのフォルダーも機能的には同じです。

mc_rtcのソースツリー内に移動しているか調べる

通常、mc_rtcのパッケージを見つけるには以下のようにします。

find_package(mc_rtc REQUIRED)

mc_rtcのソースツリー内に移動しているか調べるには、mc_rtcのパッケージを別の場所から探す必要があるかどうかで判断します。

if(NOT TARGET mc_rtc::mc_control)
  find_package(mc_rtc REQUIRED)
endif()

jrl-cmakemodules を使用している場合、mc_rtc内でビルドするにはこれをインクルードする必要があります(いずれにせよmc_rtcを介してすべての機能を使用できます)。

依存関係を調べる

例えば、コントローラーでcopraパッケージが必要であったとします。この場合、一般に以下のCMakeコードを使用して依存関係を調べます。

find_package(copra REQUIRED)

このコントローラーをmc_rtcでビルドすると、copramc_rtcと依存関係を持つようになります。したがって依存関係を調べるコードは以下のようになります。

if(NOT MC_RTC_BUILD_STATIC)
  add_required_dependency(copra REQUIRED)
else()
  find_package(copra REQUIRED)
endif()

mc_rtcのコンポーネントを追加する

find_package(mc_rtc)によって提供されているマクロ(add_controller(NAME ...), add_robot(NAME ...) 等) を使用すれば、面倒な作業を行う必要はほとんどありません。そうでない場合は、mc_rtcのソースツリー内にあるsrc/CMakeLists.txtを参照し、どのように変更すべきかを理解してください。主な違いは、ソースのパスを相対パスではなく絶対パスで与える必要があるという点にあります。

これに関して注意すべき点が1つあります。コントローラーをmc_control::fsm::Controllerから派生させる場合、add_fsm_controller(NAME ...)を使用する必要があります。

また、使用するコンポーネントを外部のライブラリとリンクさせる場合、そのライブラリを関連するmc_rtcのライブラリとリンクさせる必要があります。

例:

add_controller(myController "${myController_SRC}" "${myController_HDR}")
target_link_libraries(myController PUBLIC copra::copra)

これは以下のようになります。

if(NOT MC_RTC_BUILD_STATIC)
  add_controller(myController "${myController_SRC}" "${myController_HDR}")
  target_link_libraries(myController PUBLIC copra::copra)
else()
  add_fsm_controller(myController "${myController_SRC}" "${myController_HDR}")
  target_link_libraries(mc_control_fsm PUBLIC copra::copra)
  # コンポーネントの種類に応じて以下のライブラリを使用します
  # - mc_control (FSMを使用しないコントローラ)
  # - mc_rbdyn (ロボットモジュール)
  # - mc_observers (オブザーバ)
  # - mc_control (プラグイン)
endif()

このパッチ を適用すると、lipm_walking_controllerMC_RTC_BUILD_STATICを使用できるようになります。

mc_rtcのデモをWebに公開する

デモをWebに公開するには、emscriptenプロジェクトを使用します。このプロジェクトを使用すると、C++のコードをコンパイルしてWebAssemblyを作成し、互換性のある任意のブラウザーでWebAssemblyを実行させることができます。なお、私たちの知る限りでは、mc_rtcのすべてのAPIを使用できます。

emscriptenに関する一般的な制約事項

emscriptenに関する一般的な制約事項の詳細については、emscriptenポーティングガイドを参照してください。通常、この制約事項はそれほど大きな影響はありません。

最も大きな制約事項は、ファイルシステムの問題に関するものです。仮想ファイルシステムを使ってWebアプリケーションにアクセスする場合、以下のいずれかで対処する必要があります。

  1. ビルドシステムのファイルシステム階層構造と同じ構造を仮想ファイルシステム内に構築する
  2. オンラインデモ用に作成された「ダミー」パスでビルドされるように設定する

下記のリンクで示されたmc_rtcオンラインデモは、2番目の方法で公開されています(2番目の方法のほうが、何をデモとして公開するかを管理するのが少し簡単になります)。

オンラインデモをビルドする

とりあえず、既存のmc-rtcオンラインデモを自分のプロジェクトに合わせて変更した上で使用することを推奨します。このビルドスクリプトを使って、オンラインホストにデプロイする前にデモをローカルでビルドすることができます。

FirefoxとGitHubページに関する注意点

GitHubのページにデモを公開した場合、このデモはFirefoxでは動作しません(このチュートリアルを書いた2020年11月27日時点)。Firefoxを使用する場合、Webサーバーから特定のHTTPヘッダーを与える必要がありますが、GitHubのページではそのヘッダーが提供されません(現在、このヘッダーをカスタマイズする方法はありません)。

そのヘッダーを以下に示します。

Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp