qicliの使い方

　本記事は以下の環境で動作を確認しています。

| |バージョン|
|:---|:---|
|NAOqi|2.5.5.5|
|Choregraphe|2.5.5.5|
----
# この記事の内容
　Pepperのロボアプリ開発ではChoregrapheを活用し、プログラムを転送・実行したり、メモリ内容を確認したりします。Choregrapheはロボアプリの開発になくてはならないツールではありますが、ちょっとしたAPIのテスト等にはグラフィカルツールのゆえに使いにくい場面があります。そんな場面で役に立つツールが qicliです。この記事ではqicliの基本的な使い方を紹介します。

# qicliでできること
　APIの調査、APIの直接実行、ロボアプリの実行、ALMemoryの監視、ログの取得が行えます。Chroregrapheだけではなくqicliも使いこなすと効率よく開発できます。

# qicliの使い方

## qicliの起動
　qicliはPepperの中にインストール済みのユーティリティープログラムです。以下の手順で利用します。

1.	操作を行いたいPepperのIPアドレスもしくはホスト名を調べる。
2.	PCからSSHクライアントを利用し操作を行いたいPepperにログインする。（初期設定：user: nao, password: nao）
3.	qicli コマンドを入力する。

## qicliのコマンド
　qicliコマンドの基本構文は以下の書式になります。

```sh:
Pepper> qicli <コマンド> <パラメーター> …
```

注：`Pepper>`はPepper側内部で実行するコマンドを示します。入力する部分は`Pepper>`以降の文字です。

\<コマンド\>はqicliで行いたいことを指定します。\<コマンド\>は"info" "call" "watch" "log-view"を覚えていただければと思います。詳細については後述いたします。
\<パラメーター\>は\<コマンド\>に従い変化します。各<コマンド>の説明箇所で解説いたします。
qicliは独立したプログラムのため、実行するには、その都度qicliを入力します。**qicli \<コマンド\> \<パラメーター\>の順番で入力する**ことを覚えてください。

### コマンド info
 　infoはモジュールの情報を取得するためのコマンドです。以下のように使います。

```
Pepper> qicli info <パラメーター：モジュール名>
```

　\<パラメーター：モジュール名\>は省略可能です。省略すると全モジュールの一覧を表示します。

```sh:
Pepper> qicli info
001 [ServiceDirectory]
002 [LogManager]
003 [PackageManager]
004 [ALServiceManager]
005 [ALCloudToken]
006 [ALFileManager]
...
```

　ALMotionの情報を表示するには、以下のように入力します。

```sh:
Pepper> qicli info ALMotion
030 [ALMotion]
  * Info:
   machine   502f3f4c-f795-4387-81a5-318b53dca268
   process   3109
   endpoints tcp://127.0.0.1:44063
  * Methods:
   100 exit                           Void ()
   102 pCall                          Value Value
   103 version                        String ()
   104 ping                           Bool ()
   105 getMethodList                  List<Strin
…
```

　モジュールにどのようなメソッドが用意されているのか確認できます。
### コマンド call
　callはAPIを直接実行するためのコマンドです。以下のように使います。

```
> qicli call <パラメーター：モジュール名.メソッド名> <APIパラメーター> …
```

　ALMemory にデータを挿入する場合はALMemoryProxy::insertDataを利用します。APIの定義を確認したいと思います。

**APIの定義：**
> **void ALMemoryProxy::insertData(const std::string& key, const int& value)**
Inserts a key-value pair into memory, where value is an int
**Parameters:**
key – Name of the value to be inserted.
value – The int to be inserted

　qicli では、モジュール名**ProxyをのぞいたALMemoryをモジュール名にし入力します。

```sh:
Pepper> qicli call ALMemory.insertData "key" "value"
```

　"key"と"value"は具体的な値に置き換えてください。

　試しに、ALTextToSpeechProxy::sayを使ってPepperを喋らせたいと思います。（APIの定義は割愛いたします）

```sh:
Pepper> qicli call ALTextToSpeech "こんにちは"
```

　Pepperが「こんにちは」と話してくれました。

　また、アプリの起動も行って見ましょう。ここでは試しに設定アプリを起動してみます。
アプリを起動するためには、ビヘイビアパスが必要です。設定アプリのビヘイビアパスは"boot-config/."ですが、どのようにコマンドを入れればよいでしょうか。アプリを起動するALAutonomousLifeProxy::switchFocusのAPIの定義を見てみましょう。

**APIの定義：**
> **int ALAutonomousLifeProxy::switchFocus(const std::string& activity_name)**
The focused activity is the one running activity. This has the same effect as calling switchFocus(activity_name, 0)
**Parameters:**
activity_name –
The name of the activity to start and switch focus to.
The current focused activity is stopped first.
Format: “package-uuid/behavior-path”

　以下のように入力すると、設定アプリが起動できます。

```sh:
Pepper> qicli call ALAutonomousLife.switchFocus boot-config/.
```
　いかがでしょうか。qicliコマンドを使えば1つのAPIを実行させるために、わざわざChoregrapheで１からPythonコードを書く必要はありません。

### コマンド watch
　コマンド watchは主にシグナルを監視するためのコマンドです。以下の書式になります。

```sh:
Pepper> qicli watch <バラメーター：モジュール名.シグナル名>
```

　例えば、シグナルqi::Signal<int> ALPeoplePerception::justArrivedを監視したい場合は以下のように入力します。

```sh:
Pepper> qicli watch ALPeoplePerception.justArrived
justArrived:  3536
justArrived:  3635
```

　また、シグナルではないALMemoryの特定のイベントを監視することにも使えます。以下の書式になります。

```sh:
Pepper> qicli wathc --almemory <ALMemoryキー名>
```

　先ほどはシグナルqi::Signal<int> ALPeoplePerception::justArrivedを監視していましたが、イベント"PeoplePerception/JustArrived"の場合も監視できます。

```sh:
Pepper> qicli watch --almemory "PeoplePerception/JustArrived"
PeoplePerception/JustArrived: 7148
```

### コマンド log-view
 　naoqiのログはChoregrapheの［ログビュアー］パネルや以下のコマンド（`Pepper> tail -f /var/log/naoqi/tail-naoqi.log`等）によって取得できます。しかし、qicliからも簡単に確認できます。

```sh:
Pepper> qicli log-view
[WARN ] ALMotion.OmniWheelTask :terminate:0 98880 Move task not started because of internal higher priority task.
[WARN ] ALMotion.OmniWheelTask :terminate:0 98879 Move task not started because of internal higher priority task.
```

# まとめ
　qicli を使うことで、ChoregrapheでPythonコードを記述しなくてもAPIが実行できます。他にも、qicliからイベントを擬似的に発火させたり、データを書き換えたりできます。
　また、watchコマンドでは特定のシグナルの監視をしたり特定ALMemoryキーを監視でき、log-viewコマンドではログを確認できます。
　開発及びテストで効果的にqicliを活用しロボアプリの品質向上に役立てていただければと思います。