SIGVerse Server for Win32
Simple Wiki Based Contents Management System
Home Projects Memo Misc Topics Software
ソフトウェア関連 >> SIGVerse Server for Win32

SIGVerse Server (SIGServer) を Windowsで動作させる

SIGVerseは、NIIの稲邑先生が中心となり開発が進められているHRI(Human-Robot Interaction)の研究を行うためのシミュレーションソフトウェアです。詳細は、公式Wikiに記載されおりますが、基本的に物理シミュレーション等を行うSIGServerと3Dモデルの描画、3Dビューイメージを生成するためのSIGViewerにわかれています。
オフィシャルサポートでは、SIGServerはLinux上で動作し、SIGViewerはWindows上で動作するという仕様であり、2つの異なるOSが必須でした。これでは、OpenRTMへの対応などを進める上で少し不便を感じましたので、SIGServerの方をWindowsで動作させるようにしてみました。
SIGServerのソースコードを少し覗いてみると、あらかじめマルチプラットフォームでの動作が想定されており、比較的簡単に移植が行えるという期待がありました。

SIGServerの移植作業

SIGServerの移植作業を行う前に、必須のライブラリを整備しておきます。ここでも記載していますが、SIGServerには、C++のコンパイラ、JDK、XMLパーザ、X3Dのパーザ、ODEが必要です。(音声認識には、Juliusも必要ですが)
C++のコンパイラに関しては、VS2010以降として複数のバージョンに対応したいと考えました。また、オリジナルの場合には、Linuxでしたので、autoconfを使ってMakefileを作成していましたが、Windowsの場合には、autoconfが使えませんので、代わりにCMakeを使うことにします。
そこで、下記のツール群を整備します。
  • C++コンパイラ(VS2010Express, VS2012Express, VS2013Express)
  • CMake
  • JDK 1.8
  • ODE-0.13
  • xerces-c-3.1.1
VisualC++とCMakeに関しては特に問題ないと思います。JDKは、OpenJDKにしようかと思いましたが、Oracle JDKを使うことにします。ODEとxercesに関しては、オフィシャルサイトからダウンロードして、各VisualC++でコンパイルします。
ここで1つ問題になるのは、ODEとxercesに関しては、正式にはVS2010までしかサポートしていません。VS2008とVS2010では大きく変更があったようで、自動変換に失敗することが多かったのですが、VS2010→VS2012→VS2013 と順序良く自動変換を行えば、問題ないようです。
ODEとxcerce-cのビルドに関しては、下記のリンクを参照してください。

CMakeLists.txtの作成

ツールとライブラリが揃ったところで、CMakeのためのファイル群を作成していきます。作成するにあたり考慮する点として、
  • VC++コンパイラのバージョンに応じた変数の設定
  • ODE, xercesの自動検出とコンパイラ、リンカ用の変数設定
  • SIGServerとエージェントコントローラ作成ライブラリ用の変数設定
です。上の2つは、CMakeの機能を使えば、ほぼ問題なくできそうです。ただし、ODEとxercesの自動検出に関しては、ソースからコンパイルしたことを前提として作成していきます。
また3番目のSIGServerとエージェントコントローラ作成ライブラリに関して、オリジナルのSIGVerseは、srcs/commonlibの下のファイルが、server とその他のツールのディレクトリにシンボリックリンクを作成して、コンパイルするようになっており、Windowsではそのままでは使えないので、少し工夫しています。
追加したCMake用のファイルは以下の通りです。
  • CMakeLists.txt
  • cmake/SIGVerse_Env.cmake
  • cmake/SIGVerse_find_libs.cmake
  • cmake/SIGVerse_model_Env.cmake
  • srcs/commonlib/CMakeLists.txt
  • srcs/model/CMakeLists.txt
  • srcs/simserver/CMakeLists,txt
  • srcs/x3d/CMakeLists.txt
このファイルを見ればわかるのですが、 cmake/SIGVerse_find_libs.cmake では、SIGVerseのソースディレクトリ。ODEのライブラリのディレクトリ、Xercesライブラリのディレクトリ、JRE,JDKがインストールされたディレクトリを推定しています。ODEとXercesに関しては、ソースコードからコンパイルされていることを前提としていますので、気を付けてください。特に、VS2012以降のVisualC++を使う場合には、ODEとXercesにはソリューションファイルがありませんので、VS2010のソリューションファイルを自動変換で使うことになります。この場合には、ライブラリが生成される場所がVS2010とかぶってしまいますので、cmake/SIGVerse_find_libs.cmakeで見つけることができません。その場合には、cmakeを実行したときに手動で設定変更を行うか、適切な場所にライブラリを配置するしか方法がありません。

移植作業の実行

取り敢えず、CMake用の設定ファイル群を作成し、VisualStudio用のソリューションファイルを作成して、そのままコンパイルしてみました。案の定、たくさんのエラー発生しコンパイルが通らない状態でした。エラーの多くは、Linuxのみにあるヘッダーファイル、システムAPI群を利用していることに起因していましたので、同じ機能をWIN32APIで置き換えていきました。結局、そのほとんどが Socket、時刻取得、Thread関連なので順調でしたので、今までの経験上特に問題なく置き換えていきました。
何度となくコンパイル&リンク作業を続けて、エラーメッセージが出ないものを作成し、SIGServerの実行ファイルができましたが、まともに動作しませんでした。原因は、Worldファイルの解析に失敗していましたので、調査したところXercesがXMLの解析時に呼び出す関数の実装が間違っていることでした。間違っているといってもLinuxでは問題なく動作していますが、g++よりもVC++の方が引数の型チェックが厳しくString要素をパージングする関数を呼び出せないだけでしたので、その部分を修正しています。
今後、g++でも引数の型チェックが厳しくなるようですので、正式版も修正をした方がいいかもしれません。
あとは、オリジナルの実行環境もVPS上に作っておいたSIGServerでTutorialの実行結果と同じようになるように、エージェントコントローラを作成しながら、修正を重ね、動作するバージョンを実装しました。
実装したソースファイルは、NIIの稲邑先生のご厚意でオリジナルのGitHubのリポジトリにBranchを作成して公開しています。
このソースコードのダウンロードは、上記のURLからダウンロードすることができます。Git Shellがインストール済みの場合には、
git clone https://github.com/SIGVerse/SIGServer/tree/win32_develop
で大丈夫だと思います。

SIGServer for win32 のビルド

すべての準備が終われば、ダウンロードしたSIGVerseの最上位のディレクトリにて、cmakeを実行してください。cmakeでは、ビルドするディレクトリを選択することができますので、適当な場所(私は、buildというサブディレクトリを生成して実行しています)を指定すれば、ソリューションファイルが生成されると思います。
cmakeを実行するときに、CMAKE_INSTALL_PREFIX の場所にインストールしますので、適当な場所を指定してください。インストールすると、SigServerの起動バッチファイルとエージェントコントローラを生成するためのバッチファイル(内部では、nmakeを呼び出しています)をインストールすることできます。
これらのバッチファイルによって、ほぼLinux版のSIGServerと同じような使い勝手を実現しています。(同じようなというのは、全く同じではなくWindowsでの制約の下、極力同じようにできるようにバッチファイル等を作成したものですので、動作しない場合には、バッチファイルとnmakeファイルを読んでみてください)

SIGServer for win32の簡易インストール

SIGVerseのサーバーとエージェントコントローラ開発用のライブラリを簡単にインストールするために私がコンパイルしたものをこのページに添付しています。現在のところVS2012のものを添付していますので、すぐに試したい方はダウンロードしてご活用ください。

このパッケージの使い方

最初に、このページの一番下にあるリンクをクリックして必要なファイルをダウンロードします。VS2012用のSIGVerseの場合には、 sigverse_vc11.zip になります。
ダウンロード後、適当なディレクトリに展開してください。通常は、C:\ の方がいいかもしれません。
次に、展開したディレクトリをエクスプローラで開いてください。下図のようにフォルダができていると思います。

これらのフォルダが確認できたら、bin\sigcreate.bat をダブルクリックで起動してください。

これを行うと、展開したディレクトリの下に work というフォルダができていると思います。

また、work というフォルダには下図のように3つのファイルができていると思います。

これSIGServerの準備が整いましたので、コマンドプロンプトを起動させます。コマンドプロンプトの起動は、Win+R ファイル名を指定してcmdコマンドを実行するか、でエクスプローラで目的のディレクトリを開き(C:\に展開すれば、C:\sigverse_vc11\work になると思います)、上部のインライン入力部に「cmd」と入力すれば、コマンドプロンプトが起動します。
下図は、ファイル名を指定して起動したときの画面です。


SIGServerの起動は、このコマンドプロンプトからsigserver.batを実行すれば、デフォルトのWorldファイルを読み込んでサーバーが起動します。
自分で作成したWorldファイルでサーバーを起動したい場合には、
> sigverser.bat -w .\[Worldファイル名]
です。Linux上で動作するときのsigserver.sh とオプションは同じにしています。

エージェントコントローラを作成する

独自のエージェントコントローラを作成するときには、workディレクトリにコピーされているControllerTempl.cppをコピーして作成してください。基本的には、オリジナルのLinux版とAPIは同じなのですが、最後の3行のみ若干違います。これは、WindowsでDLLを作成して、外部プログラムから内部の関数をコールしたい場合には、明示的な宣言をするかマップファイルを作成しておかなければいけないためです。そのため、"EXPORT_FUNC"というマクロを定義しています。
このファイルのままでもLinuxでもコンパイルすることができると思います。
では、ControllerTempl.cppを適当な名前を付けて(MyController.cppとしておきます)コピーします。
> copy ControllerTempl.cpp MyController.cpp
次に、お好きなエディタでファイルを編集してエージェントコントローラを実装してください。(まずは、オフィシャルWikiのTutorialを行っていただく方がよいと思います。)
エージェントコントローラの実装が終われば、コンパイルしDLLを作成します。DLLの作成には、同じディレクトリ内にある sigmake.bat を利用してください。このファイルは、nmake.exe と share\sigverse\etc\mkdll.nmake を使ってVS2012でコンパイルします。
> sigmake.bat MyController.cpp
上記を実行すれば、MyController.dll, MyController.exp, MyController.lib, MyController.objの4つのファイルが生成されていると思います。
以上で、エージェントコントローラの作成は終了ですので、Worldファイルに追記してサーバーを起動してください。

Windowsへの移植作業に際して…

SIGVerseのサーバーとエージェントコントローラ開発用ライブラリをWindowsへ移植を行った際に気が付いたこと、今後改修すべき点について以下に書いていきます。ここで記載した内容は、原の個人的見解なのでオリジナルのSIGVerseで実現されていくか不明です。

資料