naoqi仮想マシンを利用してROSをクロスコンパイルする

皆様，こんにちは
以前[このような記事](http://qiita.com/hakuturu583/items/24426ae4194699848820)を投稿していた者です．
なんとかあの方法で動かそうと頑張ってみたのですが・・・
自分の環境は汚くなるし32bitのライブラリにリンクさせたりがあまりにも手間がすごくてついに心が折れてしまいました・・・
そこでついにnaoqiの仮想マシンを用いてROSをビルドする方法を試してみました．
これでWindowsマシンでも同じ手順で開発できますね！！
naoqiの仮想マシンは[naoqi SDKの配布場所](https://community.ald.softbankrobotics.com/)と同じところで配布されています．
VirtualBox向けのイメージが配布されていますのでダウンロードし，VirtualBoxにインポートしてください．
基本的な考え方は[この情報](https://github.com/rqg0717/ROS_Nao/wiki/Installation-using-Virtual-Machine)を参考にしました．

#依存ライブラリのビルド
僕がインストールしたライブラリの一覧は以下の通りです．
バージョン等は[先ほどの情報](https://github.com/rqg0717/ROS_Nao/wiki/Installation-using-Virtual-Machine)を参考にしていただければと思います．
expat-2.1.0 apache-log4cxx-0.10.0 tinyxml　apr-1.5.2　lz4-r131　urdfdom　apr-util-1.5.4 netifaces-0.10.4　bzip2-1.0.6 urdfdom_headers　poco-1.6.1 urdfdom_headers-0.3.0 yaml-cpp-release-0.3.0　console_bridge zlib-1.2.11　curl-7.43.0 sip-4.18.1
参照した情報ではインストールディレクトリは/home/nao/ros_toolchain_installになっていますが，僕は/home/nao/ros_naoqi_ws/ros_toolchain_installで設定しました．

#ROS関係のモジュールのビルド
まずはrosのソースコードのダウンロードから始めましょうros_naoqi_ws内部で以下の処理を実行してください．

```
sudo pip install -U catkin_pkg rosdep rosinstall_generator wstool rosinstall empy
rosinstall_generator nao_robot --rosdistro indigo --deps > nao_ros_indigo.rosinstall
wstool init src nao_ros_indigo.rosinstall -j8
cd src
rm -rf diagnostics/self_test diagnostics/test_diagnostic_aggregator
```
以下のコマンドでROS関連のモジュールをビルドします．

```
src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release -DCATKIN_ENABLE_TESTING=OFF -DCMAKE_INSTALL_PREFIX=/home/nao/ros_naoqi_ws/ros_toolchain_install -j4
```
#ビルド結果の転送
とりあえず/home/nao/ros_naoqi_ws以下のファイルをすべて転送しました．

```
scp -r /home/nao/ros/naoqi_ws nao@(ROBOT_IP):/home/nao/
```
ROBOT_IPの部分にはロボットのIPアドレスが代入されます．

#NAO内部での環境変数の設定
.bashrcに以下の内容を追記

```bash:/home/nao/.bashrc
source /home/nao/ros_naoqi_ws/devel_isolated/setup.bash
source /home/nao/ros_naoqi_ws/ros_toolchain_install/setup.bash
python /home/nao/ros_naoqi_ws/ros_toolchain_install/_setup_util.py
export ROS_HOSTNAME=localhost
```
上記の手順で環境変数を設定したらいよいよroscoreを走らせます．

#roscoreを走らせてみた
![Screenshot from 2017-07-14 20_33_58.png](https://qiita-image-store.s3.amazonaws.com/0/160346/ca347561-9661-0713-1bff-b1127b9a0f6c.png)
やったぜ！！roscoreが走った！！
次回は今回ビルドしたnaoqi_driver等のモジュールを利用してnaoをコントロールするのにチャレンジしてみたいと思います．

#ビルドの際に頻発するエラー
僕の屍を超えてくれるロボカッパー（いればいいなあ・・）のために僕が作った環境で頻発したエラーを残しておきます．

###boost関係のエラー
<<内容>>

```
error: 'boost::noncopyable_::noncopyable::~noncopyable()' declared with non-public access cannot be defaulted in the class body
```
<<原因>>
C++11系の実装になっているがnaoqiの仮想マシンではどうもコンパイルできない模様
<<解決策>>
該当するソースコードに以下のdefine文を追加
[こちらの情報](https://svn.boost.org/trac10/ticket/6578)を参考にしました．

```cpp
#define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
```

ros/ros.hとかに追加しておくとほぼすべてのモジュールで有効になりそうな気がするので楽でいいかもしれません．

###C++11に関するエラー
<<内容>>
```
cc1plus: error: unrecognized command line option "-std=c++11"
```
<<原因>>
naoqiの仮想マシンにインストールされているコンパイラではC++をコンパイルする際にstd=c++11オプションを使えないようです．
<<解決策>>
該当する箇所ではstd=c++0xかstd=gnu++0xあたりを使用するとよさそうです．
このオプションはCMAKE_CXX_FLAGS変数で設定できます．

###ライブラリパスに関するエラー
<<内容>>
ほとんど大丈夫なのですが，ごくまれにあるライブラリが見つからないというエラーが発生
<<原因>>
正常にライブラリのインストールができていない，あるいはパスをうまく通せていない
<<解決策>>
ライブラリの再インストールを試してみてそれでもだめなら手動でパスを設定しました．
CMAKE_TOOLCHAIN_FILE等を使用して自分で設定ファイルを書きました．
簡易な例を下に記しておきます．

```cmake:additional_library.cmake
set(LIBRARY_NAME_INCLUDE_DIR /path/to/include/dir)
set(LIBRARY_NAME_LIBRARY /path/to/library)
```
LIBRARY_NAMEにはライブラリの名称が入ります．
さらに，完全に手動で変数を設定したいので該当するライブラリのfind_package文をコメントアウトします．
ビルドする際には以下のオプションを追加してください

-DCMAKE_TOOLCHAIN_FILE=/path/to/additional_library.cmake