このサンプルは、RasPike-ARTにおいて、Raspberry-Piに接続されたUSBカメラで読み込んだQRコードにより、SPIKE側の制御を変えるサンプルになります。これをベースにQRを使った制御をしてみてください。
本プログラムではSPIKEを動かすRasPike-ARTのプログラム(aspプログラムと呼びます)とpythonで記載されたQRコードの解析プログラムの2つから構成されています。 aspプロセスではTOPPERSのASP3を使ったプログラムが動作しています。 これらのプログラムを二つ立ち上げ、その間で通信を行うことで制御を行なっています。
プロセスとはプログラムの実行単位です。WordとExcelを起動するとそれぞれ異なる単位として起動されるのと同じイメージです。ケースによっては同じプログラムが複数のプロセスとして実行されることもあります(Windowsで強制終了させる際のプロセス一覧に出てくるもののイメージです)。 プロセスはそれぞれ独立して実行され、お互いのデータ(メモリ上のもの)に直接アクセスすることはできません。今回QRコードを解析するのにOpenCVなどを使っています。RasPike-ARTの作り上、aspプロセス内で直接OpenCVを使うことが難しいため、pythonでの別プロセスとして処理を行わせています。ただ、これだとaspプロセスに対してQRコードの結果を伝えることができません。 そのためにプロセス間通信というものを使ってプログラム間でやり取りをしています。
プロセス間通信にはいくつか種類がありますが、こんかいはUNIXドメインソケットというものを使用しています。 詳細は調べていただきたいのですが、同じシステム内(今回はRaspberry-Pi内)でプログラムが通信する際に使える通信方法です。ネットワークの通信と同じようにデータを送受信できます。
プログラムが実行される単位としては他にもスレッドやタスクがあります。スレッドはプロセス内で並行して動作する実行単位です。一つのプロセス内で複数動作することができます。同じプロセス内のスレッド同士はメモリを共有しており、プロセス間通信のような複雑な仕組みを使わなくても簡単にデータを共有できます(グローバル変数をお互いに参照するなど)。
タスクは一般的にはコンピュータに対して仕事をさせる単位の概念です。この説明においてはプロセスとタスクが同じような意味として使用されることが多いです。ただし、スレッドのことをタスクと呼ぶ場合もあります。TOPPERS/ASPの中で使われるタスクという言葉は仕組み的にはスレッドのことを指しています。プロセスとスレッドは違いが明確に定義されていますが、タスクという言葉は使われる状況により意味が変わることがあるので、注意が必要です。
QRを読み取るPythonコードは Zbarのシステムライブラリに依存しています。 RasPike-ARTの新しいバージョンではこれらの環境をセットアップ時に自動に読み込みます。
古いバージョンを使っている場合はRasPike-ARTを最新にして、 sdk/workspaceの下で make -f ../common/Makefile.raspike-art setup_spike_env を実行してください。
RasPike-ARTのsdk/workspaceの下でサンプルをcloneしてください。
cd sdk/workspace
git clone https://github.com/ETrobocon/QRSample
sdk/workspaceにて
QRSample/qr_reader.sh
を実行してください。
本来はQRコード用のプログラムを実行するには、libraspike-art/tools以下のpythonを使う必要があります。
libraspike-art/tools/bin/activate
上記のシェルスクリプトはこの手間を省くためのショートカットとして用意しています。
RasPiに接続するSSHウィンドウをもう一つ起動します。 こちらはasp(SPIKEを動かすプログラム)用です。 sdk/workspaceに移動し、
make img=QRSample
でmakeしたのち、
make start
で開始します。
必ずQRコード読み込みプログラムを実行した状態で、実行しましょう。
qrsample/qrcodesの下にあるQRをRasPiに接続したUSBカメラから読み取ってください。 本体の色が変わります。
出力例(python実行側):
QR Reader Server starting...
Camera initialized successfully
QR recognition thread started
Socket server listening on /tmp/qr_socket
Client connected
Received handshake: ASP_QR_CLIENT
Handshake successful
QR Code detected: Red
Sent to client: Red
aspプログラムの方をCtr+cで停止したのち、QR Readerプログラムも同様に停止させてください。