MZ APIを用いたRaspberry PiでのMZアプリ実行Raspberry Pi でMZ Platformアプリケーションを実行する方法について説明します。 Raspberry Piとは、名刺のケース程度にコンパクトなシングルボードコンピュータで、 OSとしてLinuxが動作します。 日本語の解説はこちら。 通常のPCと同様にUSBカメラやOpenCVなどが使えて、 さらにGPIOでフィジカルコンピューティング的な使い方もできるようなので、 Model Bを入手して試してみました。 (2015/01/08追記)後にModel B+も入手して試してみました。 (2015/02/12追記)さらにRaspberry Pi 2 Model Bも入手して試してみました。 OSがLinuxでJavaも利用できるので、 最終的にMZ Platformアプリケーションを実行することができました。 ただし、MZ PlatformはLinux版がありますが対象プロセッサはx86系限定で、 Raspberry PiのARMは対象外のため、そのままでは動作しません。 ここでは、MZ Platform APIを用いた方法を紹介します。 Raspberry Piの設定Raspberry Piを通常のLinuxのPCのように使用するには、 キーボードとマウス、HDMI接続できるディスプレイ(またはコンポジット映像入力のあるテレビ等)、 SDカードを準備する必要があります。このSDカードがOSの入ったストレージとなります。 ここで紹介する例ではLANとインターネットに接続する必要があるので、 有線/無線で接続する環境も必要です。 ![]() 本家の情報を参考に、 まずはRaspberry Pi用のLinuxの一つRaspbianのSDカードを作成しました。 このあたりの情報は日本語でもたくさん入手できると思います。 SDカードを作成してRaspberry Piを起動し、正常に動作することを確認した後、 下記の追加作業を実施しました。なお、最初の設定でSSHを有効にしておく必要があります。(2015/01/08追記)Model B+を入手して試した時点では、Raspbianに最初からJava8がインストールされていたので、その場合はJavaの個別インストールは不要です。また、日本語フォントも最初の設定時にロケールの追加で日本語を選択しておくと、下記の作業が不要でした。
Raspberry Piには電源スイッチがなく、ACアダプタを挿したら電源が入ります。 HDMI出力は電源が入る前に挿しておく必要があるようです。 コマンドモードで起動してからGUIの画面にしたい場合は下記のコマンドを入力します。 $ startx終了する場合は下記のコマンドを入力して、処理が完了したら電源を抜きます。 $ sudo shutdown -h now(2015/01/08追記)Model B+を入手して試しているときに知りましたが、終了時には下記のコマンドを使う方が普通?のようです。 $ sudo halt MZ Platform APIとアプリケーションの準備Raspberry Piで実行するアプリケーションを準備するために、 まずはPC LinuxにMZ Platformをインストールし、MZ Platform API一式をコピーします。 いずれもMZ PlatformのインストールCDに含まれています。 (2015/01/08追記)3.2からインストールCDではなくユーザー会のサイトからダウンロードとなりましたが、同様にすべて含まれています。 続いて、MZ Platform API経由で実行するアプリケーションには、次のような準備が必要です。 例として、Web情報取得のアプリケーションを用いました。 MZ Platform APIでは、 アプリケーションの中にある公開コンポーネントのメソッドを起動することが可能です。 逆に言うと、アプリケーションの開始イベントを発生させることはできませんし、 公開していないコンポーネントのメソッドを起動することはできません。 そのため、APIからアプリケーションを実行するためには、 下図のようにサブルーチンを追加して公開コンポーネントとし、 アプリケーション開始イベントの処理をサブルーチンの処理に移動して、 代わりにアプリケーション開始イベントが発生したときに、 このサブルーチンの処理を呼び出すように書き換えます。 公開コンポーネントの設定としては、属性のAllowRemoteInvocationをtrueとし、 属性のComponentPublicNameに文字列を入力します。ここでは、remoteCallとしています。 ![]() 上記のように準備したアプリケーションは、 MZ Platform APIに付属するサンプルのコマンド実行アプリケーションから起動できます。 まずはPC側のLinux上で起動できるか確認してみます。 MZ Platform API一式のうち、必要なファイル以外は削除して、 下記のようなディレクトリ構成とします。 Raspberry Piにコピーする最上位のディレクトリ名をmzapp_piとし、 上記のアプリケーション名をwebinfo.mzaxとしました。 jarsにはアプリケーションに応じて必要なJARファイルを入れておきます。 この例ではスクリプト実行とネットワーク接続に必要なJARファイルを2つ追加しています。 (2015/01/08追記)注:このフォルダ構成が示す通り、ここで紹介する方法はJavaのみで動作する機能を利用する場合に成功します。ネイティブの実行形式ファイルや動的リンクライブラリはプロセッサが異なると動作しないので、それらを使う必要がある機能は利用できないという制限があります。 $ cd ~/mzapp_pi $ ls -R .: jars mzapi webinfo.mzax ./jars: bsh-2.0b4.jar jsch-0.1.50.jar mzplatform.jar ./mzapi: etc log mzapi.jar mzcmd.jar ./mzapi/etc: hostfile.ini java.policy mzapi.ini mzapi_c.ini ./log:さらに、MZ APIの設定ファイルmzapi/etc/mzapi.iniを編集して、直接起動方式を指定しておきます。 mz.api.type=DIRECT 以上のような準備ができた上で、 Linux上でコマンド実行アプリケーションを起動するには、下記のように入力します。 必要なJARファイルをクラスパスに含め、ロケールが日本語となるようにオプションを指定し、 コマンド実行アプリケーションのクラス名を指定しています。 (Windowsと異なりLinuxではJavaのクラスパスの区切り文字にコロンを用いるようです) $ java -cp mzapi/mzapi.jar:mzapi/mzcmd.jar:jars/mzaplatform.jar:jars/bsh/bsh-2.0b4.jar: jars/jsch-0.1.50.jar -Duser.language=ja -Duser.region=JP jp.go.aist.mz.api.sample.MZCmdコマンド実行アプリケーションを起動するとプロンプトが表示されるので、 下記のように入力してアプリケーションを起動します。 > mzcmd webinfo.mzax remoteCall call voidコマンド実行アプリケーションを終了するには下記のように入力します。 > quit 実行が確認できたら、 LinuxのPC上で準備したMZ APIとアプリケーション一式を、Raspberry Piにコピーします。 下記ではSSH接続でコピーするので、Linux PCとRaspberry PiがLANに接続している必要があります。 $ cd .. $ tar zcvf mzapp_pi.tgz mzapp_pi $ scp mzapp_pi.tgz (ユーザ名)@(IPアドレス):~/ Raspberry Pi側で一式を展開すれば準備完了です。 $ tar zxvf mzapp_pi.tgz $ cd mzapp_pi 実行例Raspberry Pi上で展開した位置に移動して、 前述のコマンド実行アプリケーションからPC Linux上と同様に実行できます。 (このアプリケーションの実行ではインターネットに接続している必要があります) ただし、通常のPCに比べてRaspberry Piの性能はかなり劣るので、 Javaを用いたMZ Platformアプリケーションの読み込みと実行にはかなり時間がかかります。 下図に示すWeb情報取得の例だと、 フレームが表示されるまでに30秒程度、 Web情報取得ボタンを押してから結果が表示されるまでに20秒程度かかります。 (2015/01/08追記)Model B+を入手して試したところ、処理実行に要する時間が短くなりました。ハードが新しいからか、OSのバージョンが新しいからか、JavaがJava8になったからか、どの影響が大きいか調べていませんが、フレーム表示と情報取得がそれぞれ半分程度の時間で済むようになりました。 (2015/02/12追記)Raspberry Pi 2 Model Bは処理性能が6倍になったということで、入手して試したところ、確かに処理実行に要する時間が短くなりました。バラツキはありますが、フレーム表示に5秒、情報取得に4秒程度です。ここまで速くなると、MZアプリ実行用の小型PCとしてかなり有力という印象です。 ![]()
作成日 2013-11-28
最終更新日 2015-02-12
|