golangでPaPeRo iのアプリをつくる

 golang(go言語)はGoogleが開発しているコンパイラ言語です。
あえて継承を持たないなど独特の設計思想を持っていますが、すでに広く使われている様です。
golang自体については他をご参照頂きたいのですが、golangがPaPeRo iのアプリ開発向きだという事と、弊社開発中PaPeRo i制御用golangライブラリについて紹介します。

PaPeRo iにgolangは何が嬉しいのか

 golangの特長の一つにクロスコンパイル機能があります。
開発環境をインストールすると、インストールしたマシン用の実行ファイルを作れるだけでなく、サポートするすべてのターゲットの実行ファイルを作成できるのです。例えばWindows PCに開発環境をインストールすれば、そのままPaPeRo i用の実行ファイルが作れます。
しかも作られた実行ファイルはランタイムが不要でそのまま動きます。Python同様、PCでデバッグしてPaPeRo i本体で動かす、ということができるのです。
 Pythonとの比較では、PaPeRo iにPythonをインストールするには数千ファイル/100MB以上あり数十分かかりますが、golangで作ったアプリのインストールは1ファイル/(普通)数MB程度なので、1分以下で済み圧倒的な差があります。
 さらに、コンパイル言語なので逆アセンブルされにくいという面もあるかもしれません。但しgolangはリフレクションをサポートしているのでC/C++に比べれば劣ることは確実で、どの程度なのか弊社では確認できておりません。この点についてはそれぞれでご判断をお願いします。
 逆に劣っている点としては、golang用のサードパーティーパッケージは沢山ありますが、Pythonほどは無い、と言えるかと思います。

PaPeRo i制御用golangライブラリについて

 PaPeRo i制御用golangライブラリ(yapapero.go)は、PaPeRo i 制御用Pythonライブラリ(pypapero)同様、PaPeRo i 制御用WebSocket通信アドオンシナリオを前提としたPaPeRo i制御ライブラリです。アドオンシナリオのインストール方法についてはPaPeRo iをRaspberry Pi上のpythonから操作するを参照してください。
 現在golangライブラリの開発は停止中で、pypapero相当の機能のコーディング完、ほとんどテストできておらずドキュメントもないという状態で、本来公開できるレベルでは無いのですが、このまま眠らせて置くよりはということで公開します。
 弊社としては今後もPaPeRo iのアプリ作成にはPythonを推奨する予定で、golangについてはご質問頂いてもお答えできない可能性もあり、ご使用の際には何かあってもソースを見て自己解決して頂くという前提でお考え頂きたく、よろしくお願いいたします。

サンプルの動かし方

 Windows PCで開発する場合について説明します。golangの開発環境のインストールについては他をご参照ください。
(1) パッケージのインストール
 まず、Gorilla WebSocketを使用していますので、PCにインストールしてください。PaPeRo iにはgolangの開発環境も含め、インストールは不要です。

> go get github.com/gorilla/websocket

(2) ライブラリのダウンロード
 PaPeRo i制御用golangライブラリをダウンロードして任意の場所に展開してください。
本来制御用ライブラリをpackageとすべきなのかも知れませんが、煩雑になるため、サンプルプログラムpaperospeechに制御用ライブラリyapapero.goを含めています(package mainになっています)。

(3) ビルド
 ビルドは

> go build

でできます。実行ファイル名はpaperospeech.exeとなります。念のためWindows 32bit/64bit向けにビルドしたものも同梱しています(paperospeech32.exe/paperospeech64.exe)。
また、ごく簡単なものですが、arm向けとWindows向けにビルドするためのバッチファイルを同梱しています(buildarm.bat/buildwin32.bat/buildwin64.bat)。buildarm.batでarm向けにビルドした後にWindows向けに再ビルドする場合にはbuildwin32/64.batを実行する必要があります。

(4) サンプルの実行

サンプルプログラムは、以下の様に-speechを付けて実行すると、パペロが指定文字列(こんにちは)をしゃべったあと終了します。

> paperospeech -wssvr 192.168.1.1:8088/papero -speech こんにちは

-speechを付けない場合、入力待ちになり、端末に入力した文字列をしゃべり、その後頷きます。

> paperospeech -wssvr 192.168.1.1:8088/papero

また、左右座布団ボタンでLEDが光り、真ん中ボタンでLEDを消灯します。ソースコードには異なるLEDを光らせるたのコメントアウトされた行がありますので、変更して再buildして動作を確認してください。変更する行は以下の部分です。

case msg.IsDetectButton("L"):
    //app.papero.SendTurnLedOn("ear", []string{"W3W3", "10", "NN", "10"},
    app.papero.SendTurnLedOn("mouth", []string{"G3G3NG3NG3NG3G3", "10", "NNNNNNNNN", "10", "Y3Y3Y3Y3Y3Y3Y3Y3Y3", "10"},
                             &ApiParams{Repeat: "false"})
case msg.IsDetectButton("R"):
    //app.papero.SendTurnLedOn("forehead", []string{"R3", "10", "G3", "10", "Y3", "10", "NN", "10"},
    //app.papero.SendTurnLedOn("cheek", []string{"R3", "10", "NN", "10", "R3", "10"},
    app.papero.SendTurnLedOn("chest", []string{"W3", "10", "N", "10","W3", "10",},
                             &ApiParams{Repeat: "false"})

(5) PaPeRo i本体で実行

 buildarm.batでarm用の実行ファイルpaperospeechを作成し、PaPeRo iに転送します。
/Extensionディレクトリの有無でPaPeRo i本体で実行されているか判定しており、-wssvrの指定は不要です。

$ paperospeech -speech こんにちは

$ paperospeech

いずれもWindowsと同じ動作となります。

ライブラリの使い方

ライブラリの使い方は基本的にpypaperoと似ており、同じように使用できますが、改良のため、また言語仕様の違いのため異なる部分もあります。

(1) APIがパスカルケース
 golangの規定に基づき、APIはパスカルケースになっています(send_turn_led_on -> SendTurnLedOn)。

(2) デフォルト引数
 golangはデフォルト引数をサポートしていません。このため省略可能な引数をすべてApiParamsに定義し、それを引数としています。

app.papero.SendTurnLedOn("chest", []string{"W3", "10", "N", "10","W3", "10",},
    &ApiParams{Repeat: "false"})

(3) イベントの判定メソッド
イベント(Msg)には種別を判定するメソッドがあるので、これでイベント種別を判定してください。

case msg.IsDetectButton("L"):

 他にもchannelなどgolang固有の機能を使用しており、ドキュメントを用意出来ておりませんので、paperospeech.goをベースにして改造してアプリを作成するというのがお勧めです。

現時点でgolangのお勧めのIDE(統合開発環境)

 Windows用の、主にデバッガの観点から使ってみた感想なのですが、Pythonでは安定感があって非常に良かったJetBrains社製のIntellij IDEA+golang用プラグインは現状安定性に欠ける様で、step inでpanicになったりしました。
LiteIDEは軽く、ちゃんと動作するのですが、使用感は今ひとつです。
今の所Visual Studio Codeが一番良い感触でした。但しデバッガが標準入力に未対応だったり、mapの変数表示が?だったりと難があります。
結局Pythonのような信頼できるIDEは発見できませんでした。全く使い物にならないという事では無いので、使いながら改良を待つという感じでしょうか。