QiBuildでPepperを動かしてみる。[C/C++]

##前書き
初めまして、2015年の5月からロボットクリエイターを名乗らせてもらっています。RYOといいます。

Qiitaの書き方にまだ慣れていないので、その点はご容赦いただければと思います。

今回、記事にしようと思ったのは、Pepperの先輩である、NAOを使って、赤外線通信を実装しようと思ったことから始まります。

ドキュメントを読んで、いろいろ調べているうちに、AldebaranさんのGitHubにたどり着きました。

そこに、C++で書かれたInfraredのコードがあったので試してみようと思い、まずはそれの導入として、今回の記事を書くに至ります。

##前提

####RYOの開発環境
* * *
機種名 : MacBook Pro
OS : Yosemite 10.10.3
プロセッサ名 : Intel Core i5 2.6 GHz
メモリ : 16 GB
グラフィック : Intel Iris 1536MB

その他 : iTerm2
英語力 : 英検三級

####注意
* * *
* Windows,Linuxについては検証しておりません。

* この記事を書くにあたって、主に公式ドキュメントの、**[C++ SDK Installation]**の項目を参考にしています。

※公式ドキュメントには
>A - Compiler and IDE
>B - Cross-platform build system

という項目が載っていますが、今回IDEやCross-platformは利用しないで、行うので、割愛させてもらいます。

追記(2015/06/09):
また、brewというMacのパッケージ管理マネージャーである、brewを利用しています。

>Homebrew
>http://brew.sh/index_ja.html

を参考に、インストールしてください。

```lang:zsh
% ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

 でインストールできます。

##概要
まずは大まかな流れを書いていこうと思います。

1. SDKのダウンロード
2. qibuildをインストール
3. アプリケーションのビルド

##詳細
###1. SDKのダウンロード
####Ⅰ. Aldebaranの公式サイトからSDKをダウンロードしてきます。
追記(2015/06/04):おそらく、NAOやPepperのヒモ付をしていないとDL出来ません。

https://community.aldebaran.com/en/resources/software

僕がDLしてきたのは、**naoqi-sdk-2.1.3.3-mac64.tar.gz**です。
Windowsの方も、Linuxの方も、C++SDKをDLしてもらえば、大丈夫かと思います。

####Ⅱ. DLしてきたファイルを解凍します。
この、解凍して出来たフォルダを任意の場所に移します。

ここで注意していただきたいのが、qibuildの環境を作成する際に、

> qibuild init

を行うのですが、**階層構造**などもまとめて、**.qi**というフォルダに保存されるようなので、後々移動させる必要がない場所に移してください。

また、パスに日本語名があるとバグの原因になることがあるので、そのようにならない場所がオススメです。

僕は以下の位置におきました。
**ex) /Users/ryo/NAOqiSDK/naoqi-sdk-2.1.3.3-mac64**

###2. qibuildをインストール
####Ⅰ.cmake,pythonをインストール
macであれば
>brew install cmake
>brew install python

でそれぞれインストールできます。

公式ドキュメントには
>CMake version 2.8.3 or higher
>Python 2.7

となっていますので、

*CMake : ver2.8.3~
python : python2.7*

をインストールしておいてください。

ちなみに僕がインストールしたものは以下のようになっています。

```lang:zsh
% python -V
Python 2.7.10

% cmake /V                                                                                                                                                                                                                                         
cmake version 3.2.2
```

追記(2015/06/09):
####Ⅱ.qibuildのインストール
Pythonのパッケージ管理システム、**pip**を利用して、qibuildをインストールします。

コメントの方にも書きましたが、

>pip install qibuild

でインストールすることが出来ます。


####Ⅲ.初期設定
NAOqiSDKディレクトリ下に、"workspace"と言う名のディレクトリを作成します。
このディレクトリが作業環境になります。

```lang:zsh
% pwd
/Users/ryo/NAOqiSDK
% mkdir workspace
% ls
naoqi-sdk-2.1.3.3-mac64	workspace
```

追記(2015/06/12):
workspaceを作成したら、そのworkspace下で初期化を行います。

> qibuild init

```lang:zsh
% cd workspace/
~/NAOqiSDK/workspace % qibuild init
```
これを行うと、**.qi**というフォルダが作成され、その中に、

> path.conf    qibuild.xml  worktree.xml

と言った、ファイルが作成されます。
何か、qibuildを使っていて、不具合がおきてやり直す場合は、**.qi**というファイルを削除してください。

続いて、エディタの設定を行います。
公式ドキュメントには、QtCreaterを使ったほうが良いみたいなことが書いてあるみたいですが、スルーしていきます。

>qibuild config --wizard

上記のコマンドを使うことによって、エディタの設定が行えます。
一覧に表示されるのは、自分の所有しているエディタみたいです。

```lang:zsh
% qibuild config --wizard
Found CMake: /usr/local/bin/cmake
:: Please choose a generator
   1 Unix Makefiles 	(default)
   2 Ninja
   3 Xcode
   4 CodeBlocks - Ninja
   5 CodeBlocks - Unix Makefiles
   6 CodeLite - Ninja
   7 CodeLite - Unix Makefiles
   8 Eclipse CDT4 - Ninja
   9 Eclipse CDT4 - Unix Makefiles
   10 KDevelop3
   11 KDevelop3 - Unix Makefiles
   12 Kate - Ninja
   13 Kate - Unix Makefiles
   14 Sublime Text 2 - Ninja
   15 Sublime Text 2 - Unix Makefiles
> 1
:: Please choose an IDE
   1 None 	(default)
   2 QtCreator
   3 Eclipse CDT
   4 Xcode
> 1
```

今回は、どちらもデフォルトの1にしました。

####Ⅳ.ToolChainの作成
NAOqiSDKを用いてビルドする際の関連付けのです。

まずは、以下の通りにコマンドを実行します。

> qitoolchain create mytoolchainA ~/NAOqiSDK/naoqi-sdk-2.1.3.3-mac64/toolchain.xml

**qitoolchain create**とはtoolcahinを作るためのコマンドです。今回はDLしてきたSDK内のtoolcahinを利用するために、**mytoolchainA**という名前をつけて、クリエイトしました。

**mytoolchainA**というところは、好きな名前をつけて大丈夫なようです。

```lang:zsh
% pwd                                                                                                                                                                                                                                           
/Users/ryo/NAOqiSDK
% qitoolchain create mytoolchainA ~/NAOqiSDK/naoqi-sdk-2.1.3.3-mac64/toolchain.xml
Updating toolchain mytoolchainA with feed /Users/ryo/NAOqiSDK/naoqi-sdk-2.1.3.3-mac64/toolchain.xml ...
Adding packages
* (1/1) libnaoqi
Done
```

次に、いま作成したものを、開発環境で使えるようにします。
ここの説明は公式ドキュメントには載っていないものですが、やったらうまくいったので、多分大丈夫だと思います。
**多分大丈夫だと思います。**大事なことなので(ry

> qibuild add-config -t mytoolchainA mytoolchainB

先ほど、toolchainを作成しましたが、作成しただけでは使えるようになっていません。
なので、コンフィグに追加してあげることで利用可能になります。

**mytoolchainB**はおそらく、config名みたいなものだと思います。これを実際に使って、ビルドを行っていくので、わかり易い名前をつけておきましょう。

```lang:zsh
% pwd                                                                                                                                                                                                                                           
/Users/ryo/NAOqiSDK
% qibuild add-config -t mytoolchainA mytoolchainB
```

***
#####*補足:

```lang:zsh
% pwd                                                                                                                                                                                                                                           
/Users/ryo/NAOqiSDK
% qibuild -h
    add-config          Add a build configuration
% qibuild add-config -h
usage: qibuild add-config [-t TOOLCHAIN] name

optional arguments:
  -t TOOLCHAIN, --toolchain TOOLCHAIN
```

必要なところだけ、抜き出しましたが、ヘルプは上記のようになっています。

***


####Ⅴ.実際にビルドする
ビルドするには元となるソースが必要なので、SDKに付属する"helloworld"を利用します。

```lang:zsh
% pwd                                                                                                                                                                                                                                           
/Users/ryo/NAOqiSDK
% cp -r naoqi-sdk-2.1.3.3-mac64/doc/dev/cpp/examples/core/helloworld workspace
```

helloworldディレクトリに移動します。

```lang:zsh
% pwd                                                                                                                                                                                                                                           
/Users/ryo/NAOqiSDK
% cd workspace/helloworld
% pwd
/Users/ryo/NAOqiSDK/workspace/helloworld
% tree
.
├── CMakeLists.txt
├── example.html
├── example.rst
├── helloworld.cpp
├── helloworld.h
├── index.html
├── index.rst
├── main.cpp
├── qiproject.xml
└── testhelloworld.cpp
```
*treeコマンドはbrewでインストールしてあります。

これで、必要なファイルの用意が出来ました。
ここからは実際にビルドを行っていきましょう。

>qibuild configure -c mytoolchainB

このコマンドで、toolchainの先ほど作ったコンフィグを読み込んでいます。

```lang:zsh
% qibuild configure -c mytoolchainB
Current build worktree: /Users/ryo/NAOqiSDK/workspace
Using toolchain: mytoolchainA
* (1/1) Configuring helloworld
-- The C compiler identification is AppleClang 6.1.0.6020053
-- The CXX compiler identification is AppleClang 6.1.0.6020053
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++
-- Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Using qibuild 3.8.1
-- Binary: helloworld
-- Binary: testhelloworld
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/ryo/NAOqiSDK/workspace/helloworld/build-mytoolchainB
```

実行後、ディレクトリの中を見ると**build-mytoolchainB**というディレクトリが作成されます。

最後に、

>qibuild make -c mytoolchainB

実行ファイルを作成します。

```lang:zsh
% qibuild make -c mytoolchainB
Current build worktree: /Users/ryo/NAOqiSDK/workspace
Using toolchain: mytoolchainA
* (1/1) Building helloworld
Scanning dependencies of target helloworld
~中略~
[100%] Built target testhelloworld
```

これで、実行ファイルが作成されました。
あとは実行するだけです。

```lang:zsh
% ./helloworld --pip 169.254.158.71
dyld: Library not loaded: libboost_signals.dylib
  Referenced from: /Users/ryo/NAOqiSDK/workspace/helloworld/build-mytoolchainB/sdk/bin/./helloworld
  Reason: image not found
zsh: trace trap  ./helloworld --pip 169.254.158.71
```

実行しようとした、ライブラリがないぞ！と怒られました。
なので、パスを通してあげます。

```lang:zsh
% export DYLD_LIBRARY_PATH=DYLD_LIBRARY_PATH:~/NAOqiSDK/naoqi-sdk-2.1.3.3-mac64/lib
```

これで再度実行します。

```lang:zsh
% ./helloworld --pip 169.254.158.71
~前略~
Saying hello to the console ...
Hello world
Calling say method of ALTextToSpeech module ...
~後略~
```

「へるおおるるど」という感じに発音しましたが、一応出来たということでいいでしょう。


##後書き
もともとC/C++のディベロッパーだったこともあり、C/C++で開発できるなら！と思ってやっと開発環境が整いました。
もちろん、NAO・Pepperの開発は主にpythonでは有るのですが、他の言語も充実してくると嬉しいですね。
最後まで読んで頂きありがとうございました。


##参考資料
* Choregraphe 2.1.3付属の公式ドキュメント
* Aldebaran - GitHub
https://github.com/aldebaran