Inside of LOVOT

GROOVE X 技術ブログ

ふるまい開発を支える可視化フレームワーク "pura"

こんにちは!ふるまいチームのエンジニア、市川です! 私は主にLOVOTのふるまい開発*1をしています。

LOVOTには半天球カメラ、4個のマイクアレイ、照度センサー、 温度カメラ、タッチセンサー、測距センサーなど、多数のセンサーが搭載されています*2。 それらのセンサー値や、画像認識・音声認識・自己位置推定の結果など、様々な情報を使ってLOVOTに意思決定させています。 LOVOTがどんな情報を得ていて、どのような意思決定をしているかをリアルタイムにモニタリングできるとデバッグが捗ります。 そこでそれらを可視化できるフレームワークとして"pura"というライブラリを使用しています。 puraは弊社が開発したpythonで利用可能なライブラリで、オープンソースで公開しています。 すごく使いやすいので、今回puraについて紹介させてください。

github.com ※ puraが提供しているのはブラウザに絵を描く汎用的な機能であり、LOVOTの情報を描くようなLOVOTに特化した機能は提供していません

可視化例

実際にpuraで描画している様子をいくつかご紹介します。 詳細な説明は割愛させて下さい。雰囲気だけでも伝われば幸いです。

しっぽの位置

慣性センサーから推定されるLOVOTの傾き

メロディの認識状況

LOVOTは周囲の音から、メロディらしきものを識別します。

まぶたの開閉状況

深度カメラの認識状況

最初に見えているのは足で、その後に崖を発見しています。

赤外線発光位置の推定状況

点が推定発光位置(大きな点は統計的に見た推定位置)で、点群が動いているのはLOVOTが動いているためです。

経路計画の状況

puraの導入方法

puraの導入方法について簡単にご説明します。 繰り返しになりますが、puraが提供しているのはブラウザに絵を描く汎用的な機能であり、LOVOTと接続して、LOVOTのデータを見ることができるわけでありません。あしからず!

下記の手順でinstallできます。

git clone https://github.com/groove-x/pura.git
cd pura
pip install -e .

サンプルが用意されており、下記で実行できます。

python examples/web_view_example.py

http://localhost:8080/で下記の画面が出れば成功です。

左上のリストボックスからチャンネルを切り替えることができます。 下記のように、マウス等の入力を受け付ける事も可能です。

web_view_example.pyのコードを見れば分かりますが、非常にシンプルに実装できます。 サンプルコードを更に短くしたものを下記に書いておきます。

import anyio
from pura import WebViewServer, WebViewMixin

# 1. WebViewMixinを継承したクラスを用意する
class Hello(WebViewMixin):
    def __init__(self):
        # 2. ウィンドウサイズやフレームレートを定義
        super().__init__(webview_size=(320, 240), webview_frame_rate=20)

    # 3. draw()に描画内容を記載
    def draw(self, ctx):
        # 背景の塗りつぶし
        ctx.background(200)
        # 色の指示
        ctx.fill(128, 0, 255)
         # マウスの位置に"hello"を描画
        ctx.text("hello", ctx.mouseX, ctx.mouseY)

async def async_main():
    # 4. 非同期にするためTaskGroupのブロックを作る(anyioではなくasyncioやtrioを使っても良いです)
    async with anyio.create_task_group() as tg:
        # 5. WebViewServerを用意してserve
        server = WebViewServer()
        await tg.start(server.serve, "Web view example", 'localhost', 8080)
        # 6. WebViewMixinを継承した独自のクラスをインスタンス化してserveメソッドを呼ぶ
        #     (チャンネルの数だけ下記のように呼べばチャンネルが増えます)
        tg.start_soon(Hello().webview.serve, server)

if __name__ == '__main__':
    anyio.run(async_main)

puraはProcessing APIのサブセットでコーディングされているため、どのようなAPIが用意されているかはProcessing API側のドキュメントを読むのが良さそうです(pura側にはあまり整ったドキュメントがなさそう)。

https://py.processing.org/reference/

puraで具体的にサポートされているAPIは直接下記コードを見れば分かります。

pura/src/pura/_web_view.py at c767f24e6ab260e2565d7e77b797a55cb3965a03 · groove-x/pura · GitHub

その他

弊社のJohn BelmonteさんがPyCon US 2021で紹介したようです。 動画があるため良かったらこちらもご覧ください。

さいごに

一緒にLOVOTを作ってくれる仲間を募集しています。 上記のようなデバッグ環境があり、ロボット開発経験がなくても取っつきやすいと思います。ぜひ一緒に開発しましょう! 様々な分野で募集しているため、是非下記リンクをご確認下さい。

recruit.jobcan.jp

*1:ふるまいに関しては次の記事を参照ください: tech.groove-x.com

*2:下記で紹介しています: lovot.life