NAOqi C++ 開発環境の動作確認


## はじめに

前回、「[NAOqi C++ 開発環境のインストール(OS X 環境)](http://qiita.com/Suna/items/153a69bbc71e0d029490)」で、とりあえず make できるところまで確認したのですが、それからどうして良いのか分かりませんでした。

その後、いろいろ試してみて、最低レベルでは何となく把握できたので記録しておきます。

参考: [NAOqi Frameworkとは？](http://qiita.com/naoqi/items/cd21327b345c663ae88c)

何をやろうかと言うと、PC 側でバーチャルロボット(Broker)に接続する Proxy を作成し、ロボット側のモジュールを使って操作を行う、です。


## プロジェクトの作成

### 雛形の生成

```bash
$ cd /path/to/project
$ qibuild init
```

.qi ディレクトリが作成されます。とりあえず見なくても大丈夫そうなので、内容には踏み込みません。

続けて、以下のコマンドでプロジェクトの雛形を作成します。

```bash
$ qisrc create HelloWorld

$ ls -la
total 0
drwxr-xr-x  4 suna  staff  136 12 24 02:14 .
drwxr-xr-x  4 suna  staff  136 12 24 02:08 ..
drwxr-xr-x  4 suna  staff  136 12 24 02:14 .qi
drwxr-xr-x  6 suna  staff  204 12 24 02:14 HelloWorld

$ cd HelloWorld
$ ls -la
total 32
drwxr-xr-x  6 suna  staff  204 12 24 02:14 .
drwxr-xr-x  4 suna  staff  136 12 24 02:14 ..
-rw-r--r--  1 suna  staff  271 12 24 02:14 CMakeLists.txt
-rw-r--r--  1 suna  staff  271 12 24 02:14 main.cpp
-rw-r--r--  1 suna  staff  283 12 24 02:14 qiproject.xml
-rw-r--r--  1 suna  staff  459 12 24 02:14 test.cpp

$ cat main.cpp
/*
 * Copyright (c) 2012-2014 Aldebaran Robotics. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the COPYING file.
 */
#include <iostream>

int main()
{
  std::cout << "Hello, world" << std::endl;
  return 0;
}
```

ただの Hello World みたいです。

### 雛形の実行

```bash
$ qibuild configure
$ qibuild make
$ build-sys-darwin-x86_64/sdk/bin/HelloWorld
Hello, world
```

## コードの修正

### main.cpp の修正

```main.cpp
/*
 * Copyright (c) 2012-2014 Aldebaran Robotics. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the COPYING file.
 */
#include <iostream>
#include <alcommon/alproxy.h>

int main()
{
  std::string ip = "127.0.0.1";
  int port = 9559;

  AL::ALProxy proxy("ALTextToSpeech", ip, port);

  proxy.callVoid("say", std::string("Hello World"));

  return 0;
}
```

### CMakeLists.txt の修正

* set 行の追加
* qi_use_lib 行の追加

```CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(HelloWorld)

set(CMAKE_CXX_FLAGS "-stdlib=libstdc++")

find_package(qibuild)

# Create a executable named HelloWorld
# with the source file: main.cpp
qi_create_bin(HelloWorld "main.cpp")

qi_use_lib(HelloWorld ALCOMMON)

# Add a simple test:
enable_testing()
qi_create_test(test_HelloWorld "test.cpp")
```

## configure & make

```bash
$ qitoolchain create mytoolchain /path/to/sdk/toolchain.xml
Updating toolchain mytoolchain with feed: /path/to/sdk/toolchain.xml
Adding packages
* (1/1) naoqi-sdk-mac64
Now try using
  qibuild configure -c mytoolchain
  qibuild make -c mytoolchain
```

```bash
$ qibuild configure -c mytoolchain
Current build worktree: /path/to/project
Using toolchain: mytoolchain
Build type: Debug
* (1/1) Configuring HelloWorld
-- The C compiler identification is AppleClang 6.0.0.6000056
-- The CXX compiler identification is AppleClang 6.0.0.6000056
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Using qibuild 3.7
-- Binary: HelloWorld
-- Binary: test_HelloWorld
-- Configuring done
-- Generating done
-- Build files have been written to: /path/to/project/HelloWorld/build-mytoolchain
```

```bash
$ qibuild make -c mytoolchain
Current build worktree: /path/to/project
Using toolchain: mytoolchain
Build type: Debug
* (1/1) Building HelloWorld
Scanning dependencies of target HelloWorld
[ 50%] Building CXX object CMakeFiles/HelloWorld.dir/main.cpp.o
Linking CXX executable sdk/bin/HelloWorld
[ 50%] Built target HelloWorld
Scanning dependencies of target test_HelloWorld
[100%] Building CXX object CMakeFiles/test_HelloWorld.dir/test.cpp.o
Linking CXX executable sdk/bin/test_HelloWorld
[100%] Built target test_HelloWorld
```
## Choregraphe のバーチャルロボットで実行

Choregraphe を起動し、バーチャルロボットの Port を確認します。

**編集 > 設定 > 「バーチャルロボット」タブ**

### 実行1 (失敗)

```bash
$ build-mytoolchain/sdk/bin/HelloWorld
dyld: Library not loaded: @executable_path/../lib/libalproxies.dylib
  Referenced from: /path/to/project/HelloWorld/build-mytoolchain/sdk/bin/HelloWorld
  Reason: image not found
Trace/BPT trap: 5
```

### 実行2 (失敗)

実行1 で「dyld: Library not loaded」とか言われているので、DYLD_LIBRARY_PATH を指定してから再実行します。

```bash
$ export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:/path/to/sdk/lib:/path/to/sdk/lib/naoqi

$ build-mytoolchain/sdk/bin/HelloWorld
[INFO ] Starting ALNetwork
[INFO ] NAOqi is listening on 127.0.0.1:54010
libc++abi.dylib: terminating with uncaught exception of type AL::ALNetworkError: 	ALNetwork::getModuleByName
	failed to get module ALTextToSpeech http://127.0.0.1:52716
Abort trap: 6
```

何やら動き始めてのエラーのようです。

...だいぶ悩んだのですが、解決できませんでした。
一応、Choregraphe のバーチャルロボットへの接続は実績あるみたいなのですけど。

参考: [PepperのPython SDKでバーチャルロボットにさわる](http://qiita.com/yacchin1205/items/b2d9d97d609942bb9340)


## Webots for NAO で実行

参考: [Webots for NAOのインストール](http://qiita.com/naoqi/items/6b904ae8f0cc1902048d)

見た目を Pepper にはできないっぽいですが、試せそうな感じでしたのでインストールしてみました。

### 実行3 (成功)

```bash
$ build-mytoolchain/sdk/bin/HelloWorld
[INFO ] Starting ALNetwork
[INFO ] NAOqi is listening on 127.0.0.1:54011
[INFO ] Stopping ALNetwork
[INFO ] Exit
```

![2014122401.png](https://qiita-image-store.s3.amazonaws.com/0/20418/00fd2f2d-f18f-2b47-cb36-8bae25396dc0.png "2014122401.png")


## 未解決

* SDK から Choregraphe のバーチャルロボットへの接続


## 感想

* ただの興味から C++ SDK を試してみましたが、Pepper のプログラミングなら、まずは Choregraphe で頑張るのが正しい道であることを認識しました。はい。