2020年6月24日水曜日

Intel RealSenseでSkeleton Trackingを行うCubemosのライブラリをPythonで使ってみた

はじめに

(2022.11追記:調べたら、Skeleton Tracking SDK は既に利用できなくなっているようですね。Cubemos 社と Intel 社の契約が切れたのでしょうか。そのため、RealSense と骨格認識を組み合わせるには、mediapipe などを使うのが良いと思います)

距離を計測可能な深度カメラとして、Intel RealSense D415 および D435が良く知られています。

RealSense をロボットなどに搭載すれば、映像を取得できるだけではなく対象物までの距離も取得できるようになるというわけです。しかし、その「対象物」の位置自体はなんらかの方法で事前に見つけておく必要があります。例えば、人物までの距離を測定したい場合、人物の位置をあらかじめ知る必要があるのです。

RealSense を用いて人物の骨格の位置を得る方法として、Raspberry Pi と Coral USB Accelerator を用い、ディープラーニングの PoseNet を用いる方法を別サイトで紹介しました。
この方法により、RealSense を用いて人物の姿勢とその距離を得られるようになったのですが、この方法は Windows などの一般的な PC では速度が非常に遅いという難点がありました(そのため、上記ページではWindows 用プログラムは公開しませんでした)。

そこで、本ページでは、RealSense を用いて人物の骨格の位置を得る方法として、公式サイトで紹介されている Cubemos 社による Skeleton Tracking SDK を用いる方法を紹介します。これにより、Windows などの一般的な PC でも RealSense を用いて人物の骨格の位置を高速に得ることができます。

なお、Cubemos 社による Skeleton Tracking SDK は 75ドルの商品なのですが、本ページの内容は 30 日間の無料トライアルでも試すことができます。私自身は 30 日間の無料トライアルで本ページの内容を記しましたが、最終的このライブラリを購入する予定です。

実際に RealSense を用いて人物の骨格の位置を得ている様子が下図です。青~赤に色付けされているのは距離に相当し、骨格に相当する黄色の線分で表示されています。


本ページでは、これを Windows 10 + Python (Anaconda) で実現する方法を記します。RealSense は D415 と D435 が使えます。なお、公式によるシステム要件として以下が挙げられて言いますのでご注意ください。
  • CPUs: 6th to 10th generation Intel Core and Xeon Processors
  • GPUs: Intel Iris Pro, Inte HD Graphics 520, 530, 630

Skeleton Tracking SDK のインストール

ここでは、Skeleton Tracking SDK のインストールを行います。本ページではこの SDK を Windows 上の Python で利用することを意図しています。その場合、Visual Studio や RealSense SDK が PC にインストールされている必要はありません。

まず、Skeleton Tracking SDK のページにある「Try for free」ボタンをクリックしましょう。名前やメールアドレスを入力する欄が現れますので、英語で入力して Submit (送信) ボタンをクリックします。少し待つと、30日間の無料トライアル用のライセンスキーと、SDKのダウンロードリンクが書かれたメールが届きますので、まずは SDK をダウンロードしましょう。

ダウンロードした圧縮ファイル cubemos_SDK.zip を右クリックして「すべて展開」を選択することなどにより、展開してください。そして中に含まれている Windows 用のインストーラー(執筆時は cubemos-SkeletonTracking_2.3.1.6cffde4.exe )をダブルクリックし、インストールしましょう。なお、「Microsoft Visual C++ 2017 Redistributable (x64)」も(インストール済でなければ)合わせてインストールされます。

インストールが終わったら、ライセンスの設定を行います。このとき、職場や学校などのプロキシ環境下ではライセンスの設定ができません(Skeleton Tracking自体はプロキシ環境下でも実行できるのですが)。そのため、ライセンスの設定時のみは、PC をスマートフォンのテザリングなどによりインターネットに直接接続する必要があります。

さて、PCをインターネットに直接接続したら、エクスプローラーで「C:\Program Files\Cubemos\SkeletonTracking\scripts」に移動し、中にある「post_installation.bat」をダブルクリックして実行します。すると、以下のようなウインドウが現れますので、先ほど届いたライセンスキーをコピーして貼り付け、「OK」ボタンをクリックすると、ライセンスの登録が始まります。


途中で「Visual Studio 用のファイルを生成するか? (y/n)」というようなメッセージが現れますが(スクリーンショットを取り忘れました)、Python で Skeleton Tracking SDK を使う限り不要なので、「n」を入力して Enter して先に進めます。

最終的にこのプログラムは終了するのですが、ライセンスの登録に成功したかどうかは注意して確認する必要があります。 ライセンス登録のログは「C:\Users\ユーザー名\AppData\Local\Cubemos\SkeletonTracking\logs」フォルダに格納されています。AppData フォルダは隠しフォルダになっているのでエクスプローラーで「隠しフォルダを表示する」設定を行わないと見られませんので注意してください。そのフォルダにあるログファイルをテキストエディタで開いたとき、ライセンスの設定がうまくいっていれば、末尾が下記のようになっているはずです。
(中略)
[CUBEMOS_LOG_20][2020-Jun-19 18:21:11.519998][info]Loaded the cubemos plugin C:\Program Files\Cubemos\SkeletonTracking\bin\cubemos_intel_inference_engine_plugin.dll
[CUBEMOS_LOG_21][2020-Jun-19 18:21:11.520994][debug]Cubemos handle is now valid
しかし、ライセンスの登録に失敗している場合は、その問題を解消しない限り Skeleton Tracking SDK は使えません。 私が遭遇したエラーとしては、まず下記のものがあります。
(中略)
[CUBEMOS_LOG_16][2020-Jun-12 17:24:28.132243][info]The provided activation key has been accepted for creation of the cubemos handle.
[CUBEMOS_LOG_17][2020-Jun-12 17:24:28.203042][error]Exception caught in file C:\Users\sid\Documents\core_binaries\sources_and_scripts\core\modules\engine\src\engine.cpp and line 226 with error message: "boost::dll::shared_library::load() failed: 指定されたモジュールが見つかりません。"
このエラーの原因はよくわからなかったのですが、Skeleton Tracking SDK とともにインストールされる「Microsoft Visual C++ 2017 Redistributable (x64)」との連携がうまくいっていないのかもしれません。私の場合、一度 Skeleton Tracking SDK をアンインストールし、もう一度 Skeleton Tracking SDK をインストールしたらこの問題は解決しました。その際、再インストール時もスマホのテザリングによりPCを直接インターネットに接続したので、それが効いたのかもしれませんが未確認です。

もう一つ遭遇したのは、以下のエラーです。 CPU がサポート外だと言われています。
(中略)
[CUBEMOS_LOG_9][2020-Jun-19 18:06:42.372179][error]Exception thrown in file C:\Users\sid\Documents\core_binaries\sources_and_scripts\core\modules\engine\src\internal_api.cpp and line 79 with error message: "An attempt to activate the cubemos SDK was made on an incompatible CPU (Intel(R) Core(TM) i7-1065G7 CPU @ 1.30GHz) . In order to avoid consuming the license, the process will abort here. Please retry activation on a compatible hardware. . Return code: 6"
[CUBEMOS_LOG_10][2020-Jun-19 18:06:42.372179][error]Hardware information reading failed: An attempt to activate the cubemos SDK was made on an incompatible CPU (Intel(R) Core(TM) i7-1065G7 CPU @ 1.30GHz) . In order to avoid consuming the license, the process will abort here. Please retry activation on a compatible hardware. 
[CUBEMOS_LOG_11][2020-Jun-19 18:06:42.372179][error]Exception thrown in file C:\Users\sid\Documents\core_binaries\sources_and_scripts\core\modules\engine\src\internal_api.cpp and line 134 with error message: "An attempt to activate the cubemos SDK was made on an incompatible CPU (Intel(R) Core(TM) i7-1065G7 CPU @ 1.30GHz) . In order to avoid consuming the license, the process will abort here. Please retry activation on a compatible hardware. . Return code: 1"
古い PC がサポート外と言われるならわかるのですが、私の場合、2020年に購入した Surface Laptop 3 (Core i7-1065G7) でもこのエラーが出ました。サポートに問い合わせたらまだサポート外だそうです。古い PC だけでなく、新しいPC でもサポート外のエラーが出ることがあるのは注意が必要です。

最終的に、私の場合 2016年頃に購入した Surface Pro 4 (Core i7-6650U) でライセンス登録に成功しました。

なお、ライセンスの登録に成功すると、その情報が C:\Users\ユーザー名\AppData\Local\Cubemos フォルダに格納されます。同一マシンの別ユーザーで Skeleton Tracking SDK を使いたい場合(例えば、ライセンス登録するユーザーとプログラム開発をするユーザーが違う場合など)、このフォルダを別ユーザーにコピーすれば問題なく使えます。

Anacondaのインストールと設定

SDKをインストールしたら、それを使うための環境である Anaconda をインストールしましょう。Anaconda は、Python で機械学習を行うためのパッケージを提供するプラットフォームです。Python での機械学習の利用が容易になるので用います。 以下では、Windows 10 に Anaconda をインストールし、含まれている開発環境 Spyder で Python を利用する方針で記します。

その前に、いくつか設定が必要です。まず、下図のような Windows 10 の環境変数を設定するウインドウを表示します。このウインドウの表示方法は、Google などで検索すれば見つかるでしょう。

そして、上側にある「新規」ボタンを押し、 変数名に
CUBEMOS_SKEL_SDK
を、変数値に
C:\Program Files\Cubemos\SkeletonTracking
を入力してOK という変数を新規で作成し、以下の値を保存しましょう。下図の最上部に見えているように「CUBEMOS_SKEL_SDK」というユーザー環境変数が保存されます。


なお、環境変数 CUBEMOS_SKEL_SDK は、SDKのインストール時に「システム環境変数」(上図の下半分の領域)として自動的に登録されています。しかし、本ページで用いる Spyder では「システム環境変数」(下半分)ではなく「ユーザー環境変数」(上半分)しか読み込まないようなので、 「ユーザー環境変数」に新たに追加する、というわけです。

次に、Windows 10に Anaconda をインストールします。 「Anaconda のページ」をページ末尾までスクロールすると、下記のような内容が現れます。


64ビット版 Windows をご利用の場合、Python 3.8 用の「64-Bit Graphical Installer」をクリックします。なお、上図には macOS や Linux 用のリンクも見えます。ですから、それらの OS でも本ページの内容は実行可能なはずです。本ページの以下では Windows を例に実行方法の解説を行いますのでご了承ください。

ダウンロードが完了すると、「ダウンロード」フォルダなどに「Anaconda3-2020.07-Windows-x86_64.exe」のようなファイルが保存されています。ダブルクリックし、Anaconda のインストールを開始しましょう。

インストールが終わったら、スタートメニューの「A」の項目に下図のように「Anaconda3 (64bit)」という項目が増えています。 このうち「Anaconda Prompt (Anaconda3)」を選択して実行してください。


現れた下記の画面がプロンプトであり、ここでコマンド(命令)を実行することで、各種ツールのインストールを行います。「neura」の部分はユーザー名であるので人により異なります。


まず、プロンプト上で下記のコマンドを入力して実行して、「仮想環境」と呼ばれるものを作成します。「仮想環境」とは、Anacondaのデフォルトの環境とは別に、本ページ用の環境を作るために用います。ここでは本ページの演習を実行するために作成する仮想環境の名称を「cubemos」としました。
また、Anaconda は Python 3.8用のものをダウンロードしましたが、仮想環境は Python 3.7 用のものを作成しますのでご注意ください。
conda create -n cubemos python=3.7
なお、以後長いコマンドが続きます。ブラウザ上で上のコマンドをコピーし、下図のようにプロンプトの左上のアイコンをクリックして現れるメニューから「貼り付け」を選択すればコマンドをプロンプトに貼り付けられます。


すなわち、本ページからコピーしたコマンドを上図の方法でプロンプトに貼り付け、Enterキーを入力することでコマンドを実行するのです。この方法により、確実にコマンドを実行するようにしましょう。

なお、このとき「Continue creating environment (y/[n])?」や「Proceed (y/[n])?」と聞かれますので、どちらの場合もキーボードで「y」をタイプして「Enter」キーを押して作業を進めてください。 仮想環境の作成が完了したら、下記のコマンドを実行して作成した仮想環境「cubemos」に入ります。
conda activate cubemos
その結果、プロンプトの行頭が「(base)」から「(cubemos)」に変化しており、環境が「base」から「cubemos」に変わったことがわかります。

そのままの状態で、下記の3つのコマンドを一つずつ順に実行して、本ページの演習に必要なツールをインストールしましょう。これらコマンドは特に長いので、一つずつ注意してコピーして実行しましょう。先ほどと同様、 「Proceed (y/[n])?」などと聞かれたときはキーボードで「y」をタイプして「Enter」キーを押して作業を進めてください。
conda install py-opencv spyder console_shortcut toml

pip install pyrealsense2

pip install --find-links="%CUBEMOS_SKEL_SDK%\wrappers\python" cubemos-skeletontracking
なお、最後のコマンドは以前の Cubemosのバージョン(バージョン2系)では以下でした。
pip install --find-links="%CUBEMOS_SKEL_SDK%\wrappers\python" cubemos-core cubemos-skel
これらのコマンドの実行が終わると(正確には一つ目のコマンドの実行が終わると)、スタートメニューの「Anaconda3 (64bit)」の項目には「Anaconda Prompt (cubemos)」や「Spyder (cubemos)」が追加されています。どちらも、仮想環境 cubemos で必要なツールです。「Anaconda Prompt (cubemos)」は仮想環境 cubemos へツールをインストールしたいときに、「Spyder (cubemos)」は仮想環境 cubemos でPythonプログラムを実行するときに用います。

ここまでが終わったらプロンプトを閉じ、スタートメニューから「Anaconda3 (64bit)」の「Spyder (cubemos)」を実行してください。カッコ内の文字が cubemos であることが重要です。

起動した Spyder(cubemos) で、メニューから「ツール」→「現在のユーザーの環境変数」を選択してください。警告画面でOKすると、以下のように Spyder で読み込まれている環境変数のリストが現れます。先ほど自分で登録した「CUBEMOS_SKEL_SDK」が存在することがわかります。それを確認できたら、この画面を閉じて構いません。


なお、仮想環境 cubemos 用のSpyder が起動して、インターフェースが日本語ではなかった場合、メニューから「Tools」→「Preferences」を選択し、現れたウインドウで「General」→「Advanced settings」を選択してLanguageを日本語に設定してください。その際、再起動を促されますのでそれに従えばインターフェースが日本語になります。

Skeleton Tracking SDK を Windows の Anaconda 上の Python で使ってみる

以上が終わったら、サンプルファイルを実行してみましょう。Skeleton Tracking SDK をインストールした PC に RealSense D415 または D435 を接続しましょう。本ページのスクリーンショットは D435 で試した結果です。

neuralassembly/realsense-cubemos-skeletonのページに移動し、「Clone」→「Download ZIP」とたどることで、realsense-cubemos-skeleton-master.zip をダウンロードしましょう。realsense-cubemos-skeleton-master.zip は圧縮ファイルなので、右クリックして「すべて展開」を選択することなどにより、展開してください。中に含まれる realsense_skeleton.py がサンプルプログラムなので、先ほど起動した Spyder (cubemos) のメニューから「ファイル」→「開く」を選択して読み込みます。

実行する前に、Spyder (cubemos) のメニューから「実行」→「ファイルごとの設定」を選択します。現れたウインドウで、下図のように、「コンソール」→「外部システムターミナルで実行」にチェックを入れ、OKボタンをクリックします。


以上が終わったら、Spyder (cubemos) のメニューから「実行」→「実行」を選択します。以下のように3つのウインドウが開きます。順に、カラー画像(骨格表示)、深度画像、上記2枚の重ね書きです。

カラー画像(骨格表示)


深度画像


上記2枚の重ね書き

これらはプログラム中の132~134行目で表示されています。不要ならばコメントアウトなどしてください。
        cv2.imshow('color', color_image)
        cv2.imshow('depth', depth_image)
        cv2.imshow('overlay', added_image)

少しだけコメント

関数 render_result の内部にあるfor 文
for index, skeleton in enumerate(skeletons):
の内部では、
skeleton.joints[i][0] : 関節 i の x 座標
skeleton.joints[i][1] : 関節 i の y 座標
skeleton.confidences[i] : 関節 i の confidence 
を用いることができます。2つの関節の confidence がともに 0.5 以上のときにその間が線分で結ばれます。「関節 i」の数字 i (0~17) は、「C:\Program Files\Cubemos\SkeletonTracking\docs\doc_doxygen\html\group__skeleton.html で表示される図の数値 (1~18) から 1 を引いたもの」となっています。 

おわりに

以上、お疲れさまでした。




「高校数学からはじめるディープラーニング」、「Raspberry Piではじめる機械学習」を執筆しました。

2018年6月15日金曜日

pi-top v2を購入してStretch系列のpi-topOSで使ってみた

0. はじめに

Raspberry Piを組み込んだノートPCであるpi-topの新しいバージョンが2017年10月に発売されたのですが、なかなか買う気になれずにスルーしてきました。

pi-topに関しては2015年10月頃に発売された旧バージョンを入手し、いくつかブログ記事を書いてきました。
この旧バージョンを使った上で、ちょっとひどいなと思ったのは下記の二点です。
  • とにかくキーボードのクオリティが低すぎる。なかなか反応しないキーがありノートPCとしては使い物にならない。外付けでUSBキーボードをつなぎたくなるレベル
  • なんらかの原因でバッテリーが突然使用不能になる。私の場合、使用時にはACアダプタの接続が必須となってしまいました
キーボードのクオリティの低さについては過去にブログに記しました。バッテリーが使用不能になる件については今回初めて記しますが、ネットで検索すると、同じ問題に当たった人がかなりいらっしゃるようです。Li-Poバッテリーのように過放電すると以後バッテリーが使えなくなる、という症状に似ているように思えます。

旧バージョンでそんな体験をしていますので、決して安くはない価格でまた似たようなクオリティの製品だったら嫌だなあと思い、なかなか手を出しにくかったのです。

しかし、発売後しばらくたってもこの新バージョンが旧バージョンと比べて進化しているのかどうかなど、私が知りたい情報があまり入ってこないので、諦めて購入して自分で確かめてみることにしました。

1. 外観

そんなわけで購入したpi-top v2の外観です。

pi-top v2の外観

旧バージョンに比べると、マウスのタッチパッドの位置が一般的なノートPCと同じ位置になり、洗練された印象を与えます。サイズは一般的なノートPCと比べるとかなり大きく持ち運びには向かないのですが、これは旧バージョンからそうですので割り切るしかないでしょう(ちなみにサイズは34.5x22x4cm、重さは1.5kg)。

なお、OSは公式サイトからStretch系列のpi-topOSをダウンロードして用いました。付属のOSインストール済SDカードには、古いJessie 系列のpi-topOSが入っていたためです。
なお、付属のSDカードはSanDisk Ultra 8GBでしたが、このSDカードは動作中に瞬間的に動作が固まる現象(プチフリ)が多いように思われますので、別のSDカードを用意した方が良いと思います。

Stretch系列でもいつも通り、起動時にスプラッシュスクリーン動画が流れ、Dashboardというアプリケーションが自動起動するのですが、これを無効にするには、下記の2コマンドをターミナルで実行すればOKです。
sudo systemctl disable pt-splashscreen.service
sudo systemctl disable pt-os-dashboard.service
さらに、ターミナルソフトウェアが最大化して開くのを抑制したければ、「Raspberry PiをノートPC化するPi-Topにユーザーpiでログインしてみた」の設定を参考に.config/openbox/lxde-pi-rc.xmlを編集してください。

組み立て時の写真は撮っていませんが、基本的にはRaspberry Piを組み込むだけですので、旧バージョンより組み立ての難易度は低めです。ただし、はめ込みのかみ合わせが合いにくかったり、ねじ穴の位置が微妙にずれていてねじが締めにくかったりなどの問題があり、慎重な作業が必要になりますので、小さな子供に任せられる作業ではないと思います。

2. キーボード

さて、問題のキーボードですが、結論から言えば旧バージョンのpi-topのものに比べると、大幅にクオリティアップしています。

pi-top v2のキーボード

pi-top v2内蔵のキーボードとマウスだけで作業をしても、まったく苦にならないレベルです。
何を当たり前のことを、と思うかもしれませんが、旧バージョンは普通の作業を内蔵キーボードとマウスで行うだけでもストレスを感じる作業だったのです。

ただし気になる点もいくつかあり、例えば図からもわかるように、
  • 左Shiftキーが小さく、その右隣に<、>キーがある
  • Enterキーの右隣にHome、Endキーなどがある
などの問題が挙げられます。これらは慣れないと何度もミスタイプします。不満と言えば不満ですが、この程度の特殊な配置のキーボードはノートPCにはよくあるので、まあ許容範囲かな?

3. キーボードをスライドさせる

pi-top v2の目玉の一つはキーボードをスライドさせてGPIOにアクセスできることでしょう。

緑色のプラスチックに触って下図のようにスライドさせると、素材のおもちゃっぽさを感じずにはいられないものの、仕組み自体はなかなかよくできていることがわかります。

pi-top v2のキーボードをスライドさせた様子

スライドにより、図のようにRaspberry PiおよびHUB2.0というメイン基板が露出されます。その横にさらにブレッドボードが見えますが、これはpi-topPROTO+という電子工作用のモジュールで、今回これが標準搭載されています。

旧バージョンのときはpi-topPROTOは別売りで、さらにpi-top本体の発売後しばらく入手可能にならないという問題がありましたので、今回これが標準搭載されたのは良い点だと思います。

旧バージョンのpi-topでのpi-topPROTO

なお、このpi-topPROTO+からRaspberry Piの全てのGPIOにアクセスできるのですが、今回そのピンがArduinoなどと同じメスピンになっているのですね。

個人的には、Raspberry Pi本体と同じくオスピンの方が混乱が少なくて良いと思うのですが、メスピンの方がショートのリスクが小さい、などと配慮した結果なのかもしれません。

ただまあ、そもそもHUB2.0のすぐ隣で電子工作をするというのはかなりリスクが高いですよね。手がすべってHUBを壊してしまったらそれでpi-topが使えなくなってしまいますから。

なお、キーボードをスライドさせると、Raspberry Pi本体に取り付けたSDカードが見えるようになりますが、これを手で取り外すのは困難です。

そのため、SDカード取り外し用の器具が添付されており、下図のようにSDカードをひっかけて引き抜けるようになっています。

SDカード取り外し用の器具の使い方

世の中には、Raspberry Pi本体からSDカードを取り出すことを全く考慮していない商品もありますので(例えば公式のディスプレイケース)、このような対処法が用意されているのは好ましいことだと思います(必ずしもスマートな方法ではないとは言え)。

4. 各種端子へのアクセス

USB端子2つ、LAN端子、およびイヤフォンジャックへは下図のように背面からアクセスできるようになっています。

USB端子2つ、LAN端子、およびイヤフォンジャック

旧バージョンでは、これらの端子へのアクセスが悪く、下記のようにUSBハブやヘッドフォン用の延長ケーブルを用いるなどの工夫が必要でした。LAN端子に至っては本体に固定するためのねじを取り外せばなんとか使えるかも?というレベルでした。

旧バージョンのpi-topでのUSB端子とイヤフォンジャックの利用

このように、これらの端子へのアクセスは旧バージョンから比べるとかなり進歩したところです。

ただし、残念な点もあります。下図のように公式カメラモジュールを接続する端子が銀色のカバーに塞がれており、実質公式カメラモジュールが使えなくなっているのです。銀色のカバーは、GPIOとHUB2.0との接続や、CPUのヒートシンクの役割をしているものです。

銀色のカバーを取り付ける前にあらかじめ公式カメラモジュールを取り付けておけば恐らく使えるでしょうが、銀色のカバーは頻繁に取り外すものではないので、公式カメラモジュールの使用を諦める方が多いのではないでしょうか。これは、非常に詰めが甘いと感じた点です。

公式カメラモジュールを接続する端子がふさがれている

5. バッテリー

バッテリーについては、今後使用していく上でどうなるか検証していきたいと思います(個人的にはあまり期待していませんが…)。

恐らく、「過充電、過放電しないよう気をつける」という方針で使うことになりますので、すぐ利用不能になることはないのではないでしょうか。

6. まとめ

そんなわけで、旧バージョンのpi-topを体験した方ならば、その欠点の多くがpi-top v2で解消されていることに驚くのではないかと思います。2015年当時からこのクオリティで出ていれば…と思いますが、ものづくりはそんなに甘くないということなのでしょう。

なお、この出来の良さだけに、公式カメラモジュールが使えないという詰めの甘さは残念なところです。

さて、ここまでpi-top v2について比較的高めの評価を与えてきましたが、これはあくまで旧バージョンのpi-topと比較してのことです。

Windows PCの代替にしようとか、子供にはじめて与えるPCにしようとか、という用途に用いるのは慎重になった方が良いと思います。大手メーカーの製品のように「正常動作し、なおかつ保証があって当然」というものではありませんので。
(そもそも英語キーボードの時点で、人を選ぶ商品ではあります)



「ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作」、「実例で学ぶRaspberry Pi電子工作」、「Raspberry Piではじめる機械学習」を執筆しました。

2018年6月2日土曜日

2つのmicro:bitで無線コントロールカーを作ってみた

0. はじめに

小中学生へのプログラミング教育用教材について興味があり、これまで下記のエントリを書いてきました。


どちらも Raspberry Pi 上の Scratch 1.4 を用いて物の制御を行う、という内容になっています。

しかし、この方法では以下の問題があり、やや敷居が高いのが難点です。

  • Raspberry Pi を初めて触る方にとっては物品の準備やOSのインストールから始めなければならないこと
  • Raspberry Pi 上ではScratch の新しいバージョン2が動作するものの、Flashベースのため動作が遅く、さらに電子工作に必ずしも適していないという点から、古いバージョン1.4を使わざるを得ない場面が多いこと

そこで、今回は目先を変えてBBC micro:bit をプログラミング教材として用いた場合に何が可能かを試してみました。BBC micro:bit とは、イギリスの英国放送協会 (BBC) が小学生の教育用に開発したマイコンボードです。

用いたのは以下のものです。


下図が完成状態です。
micro:bitを2つ持っていなかったので、コントローラー用の1台は、スイッチサイエンスにより開発されたmicro:bitの互換機であるchibi:bitを用いました。もちろん、chibi:bitでなくmicro:bitを用いても同じです。

chibi:bitには、スマートフォン用のモバイルバッテリーを電源として用いてます。


今回作成したのはタイトルにもあるように無線コントロールカーです。完成品の動画が下記になります。

2台のmicro:bitがBLEで通信して、バギーカー上のmicro:bitが車体を動かしています。


1. プログラム

プログラムはmicro:bitの公式サイトでプログラミング用のブロックを組み合わせることで作成します。

まず、受信側(機体側)のプログラムです。


送信機から 0 (静止)、1(前進)、2(左折)、3(右折)に対応する数値が送られてきますので、それに応じて2つの連続回転サーボを動かしています。

(P1, P2)のピンに対し、(90, 90)を出力すると静止です。
(0, 180)は全速で前進、(180, 0)は全速で後退、
(0, 0)は全速で左回転、(180, 180)は全速で右回転です。

上記のプログラムでは後退を用いず、左回転と右回転は速度を遅めにするためそれぞれ(80, 80)、(95, 95)と設定しています。これらは好みやモーターの特性によると思いますので、お好みで調整します。

次に、送信側のプログラムです。


こちらはあまり美しいプログラムにはなっていません。

micro:bitには「ボタンが押されたら」というイベントハンドラはあるのですが、「ボタンから指を離したら」というイベントハンドラがありません。

そのため、そのままでは「ボタンAを押したら」、「ボタンBを押したら」、「ボタンAとBを同時押したら」という3パターンしか動作を作れません。

このプログラムでは前進、左回転、右回転、静止、の4つの動作を作りたかったので、上記のプログラムではイベントハンドラを用いず、200msごとにボタンの状態をチェックすることにしています。

さらに、そのままでは最悪200msごとに通信が行われてしまいます。それを避けるために、現在のボタンの状態を表すstateという変数を導入し、stateの値が変化した場合のみ通信を行う、ということをしています。

上記を実現するため、「もし~なら~でなければ」の分岐命令を4重に組み合わせることになり、プログラミングの講義ではあまり教えたくないようなプログラムになってしましました。

2. まとめ

最後に、この題材の良いところと悪いところを列挙します。

良いところ
  • 普段使っているPC(Windowsなど)でブロックによるプログラミングができる
  • BLEによる通信が簡単
  • PCから切り離してもスタンドアロンで動作するプログラムが簡単に書ける(Raspberry Piでそれをやろうとするとそれなりに大変)
  • 連続回転サーボは標準のブロックだけで制御できるのでmicro:bitと相性が良い
悪いところ
  • 作ってみればわかりますが、:MOVE miniの機体の組み立てが、見た目ほどフレンドリーではない
  • 「ボタンを離したら」というイベントハンドラがないので表現できる状態が少ない
そんなところでしょうか。

どんな環境を用いる場合も当てはまりますが、後は用意する題材の工夫次第で十分面白い講義ができるのではないかと思いました。



「ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作」、「実例で学ぶRaspberry Pi電子工作」、「Raspberry Piではじめる機械学習」を執筆しました。