Ubuntu Weekly Recipe

第589回 M5StickVの開発用にMaixPy IDEをUbuntuで動かす

この記事を読むのに必要な時間:およそ 5 分

MaixPy自体は非常にシンプルな画面です。ファイルを選択して,それを編集し,実機上で実行する,それだけです。

図8 MaixPy IDEの基本画面

画像

初回起動時はあらかじめターゲットボードを選択しておいてください。⁠ツール」「Select Board」から「M5StickV」を選びます。

図9 ターゲットボードの選択

画像

次にM5StickVをPCに接続し,MaixPy IDEから操作できるよう接続します。具体的には画面左下の緑色の鎖アイコンをクリックしてください。うまく行けば赤色のアイコンに変わるはずです。

図10 ターゲットボードの接続

画像

選択しているPythonスクリプトを実行するには,画面左下の再生ボタンを押します。うまく動作すればカメラの映像が「フレームバッファ」に表示され,さらにカメラの映像に合わせてヒストグラムが変化するはずです。

図11 スクリプトの実行

画像

画面中のスクリプトはprint(clock.fps())とFPSの値を標準出力に表示しています。画面下の「シリアルターミナル」を選択すると,標準出力の内容を表示するウィンドウが現れます。

図12 シリアルターミナルの表示

画像

これでMaixPy IDEによる開発環境が整いました。あとは「いい感じ」のPythonスクリプトを書くだけですね。

シリアルコンソールが必要なGUIアプリをLXDで動かす

MaixPy IDEはインストーラー・実行環境ともにバイナリでのみ提供されているように見えます※3⁠。どのようにビルドされたか不明なバイナリを,ホスト上で直接実行することに,そこはかとない不安を感じる人もいるかもしれません。

※3
同梱のドキュメントを読む限りライセンスはGPLのようなので,ソースコードを入手することは可能なはずです。

そこで今回は,MaixPy IDEをLXDコンテナ上で動かす方法も紹介しましょう。LXD上でGUIアプリケーションを動かす方法はこれまでにも,Scratch 2.0をLXD上で動かした第416回VivaldiをLXD上で動かした第420回Windows版のKindleをLXD上のWineで動かした第433回で紹介してきました。これらはいずれも「X転送 over SSH」を利用して実現しています。今回はより効率的なX用のUnixドメインソケット/tmp/.X11-unix/X0をホストとコンテナで共有する方法を解説します。

さらにM5StickVのようなホットプラグ可能なUSBシリアルコンソールをコンテナと共有する方法も合わせて紹介します。

あらかじめ次のようにMaixPy IDE用のコンテナを「maixpy」の名前で作成しておきます。LXDそのもののインストールや使い方については第521回を参照してください※4⁠。

$ lxc launch ubuntu:18.04 maixpy
Creating maixpy
Starting maixpy
※4
本連載のLXD記事をベースにいくつか修正・追記を行った『ふわっと知りたいLXD』を技術書典7で公開しました。電子書籍版はBOOTHで,物理冊子版(電子書籍版ダウンロードコード付き)とらのあな(通販サイトに加えて秋葉原店の技術書コーナーでも)BOOTHで販売しているので,インターネットを活用できない環境でLXDを利用したい方はぜひご購入ください。なおBOOTHの物理書籍版は10月6日時点でまだ「入荷待ち」のようです。

GUIコンテナを作成する

今回の記事でいう,⁠GUIコンテナ」とはホストとコンテナでX Window SystemのUnixドメインソケットを共有するコンテナを意味します。つまりホスト上ではXサーバーが動作していることが前提となります。さらにコンテナの中で動かせるのはX Window Systemに対応したアプリケーションのみです。Waylandオンリーなアプリケーションは今回の方法だけでは動作しませんので注意してください。GPUデバイスは共有しますので,コンテナに関連ライブラリーさえインストールされていれば,GPUアクセラレーションは機能します。

X Window SystemのUnixドメインソケット/tmp/.X11-unix/X0はディスプレイマネージャーでログインした際のアカウントで作成されます。よってホストとコンテナでこのUinxドメインソケットを共有する場合は,コンテナの内外で同じUIDである必要があります。

$ ls -l /tmp/.X11-unix/X0
srwxrwxrwx 1 shibata shibata 0 10月  5 15:25 /tmp/.X11-unix/X0

ホストとコンテナの間でUIDを一致させる方法は第479回に記載しています。とりあえずUbuntuコンテナ上の初期ユーザー「ubuntu」のUIDとGIDをそれぞれホストのインストール時に作成したユーザーのUID・GIDと同じ1000に設定したい場合は,次のコマンドを実行してください。

$ lxc config set maixpy raw.idmap 'both 1000 1000'

これはコンテナの再起動後から反映されます。しかしながら他にも設定項目があるので,先にそれを行ってしまいましょう。

Xアプリケーションを動かすためには,環境変数DISPLAYが設定されている必要があります。これは通常はGUIログイン時に自動的に設定されるものです。LXDのGUIコンテナの場合,GUIログインはしないので明示的に指定する必要があります。普通に目の前のPCに自分自身のみがログインしているケースだとDISPLAYには:0が設定されているはずなのでハードコードしてしまいましょう。

$ lxc config set maixpy environment.DISPLAY ':0'

次にホスト上の/tmp/.X11-unix/X0をコンテナからもアクセスできるようにします。ちなみにこのX0の部分もログイン状態で変わりえます。LXDの文脈で言うdiskデバイスタイプで追加すると,コンテナからもアクセスできるようになります。

$ lxc config device add maixpy X0 disk path=/tmp/.X11-unix/X0 source=/tmp/.X11-unix/X0

コンテナのgpuデバイスタイプを利用すると,ホストのGPUデバイスにコンテナからもアクセスできます。GPUのアクセラレーション機能を使いたいなら必須です。これも追加しておきましょう。

$ lxc config device add maixpy gpu gpu

さらにX Window Systemアプリケーションを動かすために,必要なライブラリー群をインストールします。

$ lxc exec maixpy apt update
$ lxc exec maixpy -- apt install -y x11-apps x11-xserver-utils mesa-utils

最後にUIDとGIDのマッピングを反映させるために,インスタンスを再起動しておきます。

$ lxc restart maixpy

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。