邪悪な目覚まし時計
システムの概要
設定した時刻にアラームを再生し、人が止めようとすると顔認識によって自動で逃げ回る。また、Androidアプリからの外部操作も可能で、ロボットの移動操作およびカメラ映像の確認を行える。
開発背景
- 動き回るものを作りたい
貸出部品の中にあるキャタピラに少年心を刺激された。動き回るものを作りたい
- いたずら心のある作品にしたい
止めようとすると勝手に逃げる目覚まし時計という嫌らしい作品になった。
ユーモアの一環で、本作品には上司や学校の教師が、起こされる人の私室に設置して、叩き起こす、または監視をするというディストピア的構想を含んでいる。
設計
本作品はAndroidアプリ、仲介するCGIサーバーおよび目覚ましロボット本体からなる。
ロボットにはモーター、カメラ、スピーカーが搭載されている。これらの制御はRaspberry piによって行われる。
使用法
(1)目覚まし時計として
本作品はAndroidアプリからアラーム時刻を設定する。
一般的な目覚まし時計と同様に、設定時刻にスピーカーからアラーム音を鳴らす。背面のスイッチを押すことでアラームを止められるが...
この作品の嫌らしいところはアラームを止めようと近づいてきた人間を人間認識によって検知し、勝手に逃げる点にある。
(2)外部操作機能
Androidアプリからはリアルタイムのカメラ映像の確認と、モーターの操作を行うことができる。使い方次第で一人暮らしの学生が実家のお母さまから優しく起こしてもらうことも、会社の上司が部下の私生活に介入して監視するような使い方もできる。
開発
モーター
Raspberry Pi内のmotortest.cにコマンドを引数で渡すことで対応した操作を行う。
| 8 前進 | ||
| 4 左旋回 | 5 停止 | 6 右旋回 |
| 2 後退 |
Androidアプリではmotortestコマンドを呼び出して各種移動命令を出している。
Androidアプリ
Androidアプリから前述した通りのアラーム時刻の設定と、リアルタイムのカメラ映像の確認および移動命令を出すことができる。
サーバー
手早く安価にhttpsでの通信を行えるサーバーを用意する必要があったため、中継サーバーには筑波大学の全学計算機システムの CGI サーバーを使用した。
通信部のデータフローは詳細には以下のようになる。ロボット側がカメラ画像を送信・Android側がアラーム設定や操作コマンドをCGIサーバーにアップロードし、もう片方がCGIサーバーからそれらをダウンロードする。
人間検出・回避
軽量な人間検出のために、opencvではhaar cascadeなど様々な手法を手軽に試すことができる。目覚まし時計では、寝ていたり後ろを向いたりしている人間を検知する必要があるため、機械学習を使った人間の認識を利用した。
人間検出はCaffeで実装された学習済みのMobileNetを、opencvのdnnモジュールで読み込み利用した。モデルを扱う形式はonnxが有名であるが、onnxのバージョンをうまく合わせることができず、うまく学習済みモデルをロードすることができなかった。
検出した人間から逃げるために、人間をカメラの中心でとらえて回避するロジックを以下の図に示す。各動作はそれぞれ0.1秒間継続されたのち、再び人間検知を行う。
デモ動画
アラーム音源はデモ動画としてうるさすぎないものを使用している。
アプリから右旋回命令を出している。
コメント