nao向けにROSをクロスコンパイルする〜第一回：ビルド編〜

こんにちは、僕はロボカップSPLリーグにおいてROSベースのロボカップ用ソフトウェアを開発しています。
普段はWifiを経由して分散制御系を作っているのですが、SPLリーグにおいてはロボットに搭載されている計算機以外を使用することは禁止されています。
そこで今回はROSをnao向けにクロスコンパイルし、roscoreをnaoの内部で動作させる手順に関して簡単にまとめたいと思います。
この記事では環境構築からビルドまでをまとめます。

#クロスコンパイル
ROSをnao向けにクロスコンパイルする方法はROSのWikiにまとめられています。
http://wiki.ros.org/action/show/nao/Tutorials/Installation?action=show&redirect=nao%2FInstallation
僕は特にこのページを参考にしました。
http://wiki.ros.org/nao/Installation/compileWithToolchain

##naoqi-sdkのダウンロード
まずはc++用のnaoのsdkをダウンロードします。
1.ソフトバンクロボティクスのアカウントを作成、ログインしcommunityのページを開いた上でResourcesの中からSoftwareを選択
2.C++ naoqi-sdkの項目を見つけたらview-archivesをクリック
3.Cross Toolchain 2.1.0 Linux 32をダウンロード

##依存ライブラリのダウンロード
[参考ページ](http://wiki.ros.org/nao/Installation/compileWithToolchain)によると
http://robotpkg.openrobots.org/packages/bsd/OpenNao-2.1.0.19-i386/All/console-bridge-0.2.7.tgz
http://robotpkg.openrobots.org/packages/bsd/OpenNao-2.1.0.19-i386/All/log4cxx-0.10.0~doc.tgz
http://robotpkg.openrobots.org/packages/bsd/OpenNao-2.1.0.19-i386/All/lz4-121r1.tgz
でダウンロードできるとあるのですが、少しだけリンクが変わってしまっているようです。
現在のはこちらからダウンロードできます。
http://robotpkg.openrobots.org/packages/bsd/OpenNao-2.1.0.19-i386/pub/console-bridge-0.2.7.tgz
http://robotpkg.openrobots.org/packages/bsd/OpenNao-2.1.0.19-i386/pub/log4cxx-0.10.0~doc.tgz
http://robotpkg.openrobots.org/packages/bsd/OpenNao-2.1.0.19-i386/pub/lz4-121r1.tgz

##ワークスペースの作成
ワークスペースを作成します、頑張ればcatkin_wsでもできないことは無いような気はしますが今回はとりあえず作って見ました。
cd
mkdir ros_naoqi_ws
cd ros_naoqi_ws
cp ~/Downloads/linux32-atom-pub.zip .
unzip linux32-atom-pub.zip
mkdir deps
cd deps
cp ~/Downloads/console-bridge-0.2.7.tgz .
cp ~/Downloads/log4cxx-0.10.0~doc.tgz .
cp ~/Downloads/lz4-121r1.tgz .

##ビルド
touch Makefile
エディタでMakefileを開き以下の内容を書き込み

```make:Makefile
#naoqi-sdkのパスを記述
export SDK_PATH=/home/nao/ros_naoqi_ws/linux32-atom-pub

make:
	src/catkin/bin/catkin_make_isolated --merge -DCMAKE_CXX_FLAGS=-wall --cmake-args -DCMAKE_TOOLCHAIN_FILE=$(SDK_PATH)/cross-config.cmake

init:
    ##依存ライブラリを展開
	tar -xvf deps/console-bridge-0.2.7.tgz -C $(SDK_PATH)/libnaoqi-sysroot/
	tar -xvf deps/console-bridge-0.2.7.tgz -C $(SDK_PATH)/libnaoqi-sysroot/
	tar -xvf deps/log4cxx-0.10.0~doc.tgz -C $(SDK_PATH)/libnaoqi-sysroot/
	tar -xvf deps/lz4-121r1.tgz -C $(SDK_PATH)/libnaoqi-sysroot/
	find $(SDK_PATH)/libnaoqi-sysroot/share/ -type f -print0 | xargs -0 sed -i 's,/opt/openrobots/,'"$(SDK_PATH)"'/libnaoqi-sysroot/,'
	cp -fr $(SDK_PATH)/bzip2/* $(SDK_PATH)/libnaoqi-sysroot/
	rm -fr $(SDK_PATH)/libnaoqi-sysroot/share/cmake/boost*
	rm -fr $(SDK_PATH)/libnaoqi-sysroot/share/cmake/bzip2*
	rm -fr $(SDK_PATH)/libnaoqi-sysroot/share/cmake/opencv*
	cp -fr /usr/share/cmake-2.8/Modules/ $(SDK_PATH)/libnaoqi-sysroot/share/cmake/
	sed -i 's,list(INSERT CMAKE_FIND_ROOT_PATH 0  "${_TC_DIR}"),list(INSERT CMAKE_FIND_ROOT_PATH 0  "${ALDE_CTC_CROSS}" "${ALDE_CTC_SYSROOT}" "${ALDE_CTC_ROOTDIR}/libnaoqi-sysroot"),' $(SDK_PATH)/cross-config.cmake
	sed -i '$ d' $(SDK_PATH)/cross-config.cmake
	echo set\(CMAKE_CXX_FLAGS \"$\{CMAKE_CXX_FLAGS\} -DOE_CROSS_BUILD -Wl,--allow-shlib-undefined\" CACHE STRING \"\" FORCE\) >> $(SDK_PATH)/cross-config.cmake

generate:
	rosinstall_generator roscpp rospy roscore --rosdistro indigo --deps --upstream > nao_ros_indigo.rosinstall

download:
	wstool init src nao_ros_indigo.rosinstall

clean:
	rm -rf build_isolated
	rm -rf devel_isolated
	rm -rf src
```
make init
make generate
make download
make
以上の手順を実行するとビルドが始まります