beryulog

iOSアプリ/サーバーサイド開発者のメモと雑記

ミニ四駆用ラップタイマーアプリを作りたい Part.1

ここ半年ほど、ミニ四駆専用のブログを開設するレベルミニ四駆にどっぷりハマっています。
楽しいと思っているポイントはいくつかあるんですが、一番楽しいのは何と言っても各コースに合わせてセッティングを試行錯誤し、より速いタイムを叩き出すことだと思います。
そこでiOS向けの丁度良いラップタイマーアプリを探してるんですが、これがなかなか目的に合うものが見つかりません。。

f:id:beryu:20161031182943j:plain

そこで、この自分の欲しいラップタイマーアプリを作ってみることにしました。
はてなブログにたまたま

今週のお題「2017年にやりたいこと」

というお題が挙がっていたので、これに乗っかって計画段階から記事を書いてみます。

既存のラップタイマーアプリで満たせない要件

実は、ミニ四駆用のラップタイマーアプリは既に存在します(例:M4 LAPTIMER)。
しかし、それらのアプリでは私の要件が満たせなかったのです。

私の自宅にはコースを置けるほどの空間や環境が無いので、ミニ四駆コースの設置してあるミニ四駆ステーションに走らせに行くことがほとんどです。
特にタミヤ プラモデルファクトリー 新橋店にはよく行くんですが、ここにはラップタイマーが設置されておらず、かつ来客数もかなり多いのでたった1つのコースで大勢の方が同時にミニ四駆を走らせています。

ここで何が困るかというと、自分のマシンを走らせている間に他のマシンがゴールラインを通過してしまうので、ラップタイムが計測出来ないのです。
これはアプリだからNGというわけではなく、市販のラップタイマーを使っても同様の問題が起きます。

これから作るアプリの要件

以上を踏まえて、作りたいアプリの要件を整理すると下記の2点になりそうです。

  1. ラップタイムを計測する
  2. 私のマシンを他人のマシンと区別する

作っていくなかで様々な追加要件が出てくるとは思いますが、まずは上記2点を要件とします。

要件1.「ラップタイムを計測する」の実現方法

iPhoneのカメラを使って、コースを通過するマシンを検知して時間を計測する方法になりそうです。
具体的には、「コースだけの画像」と「コースにマシンが通過しているときの画像」の差分を取って、差分が閾値以上になったら「マシンが通過した」と判定すれば良さそうです。
ただ、多くのミニ四駆コースは室内なので、蛍光灯が少し古かったりするとカメラに映る画像の明るさが連続的に変化する傾向がありそうなので、ここの調整工程はかなりTry&Errorを繰り返す事になりそう。。

要件2.「私のマシンを他人のマシンと区別する」の実現方法

各自が作るミニ四駆をそれぞれ区別する方法としてまず思いつくのは「色」だと思います。
実際、私がコースを走らせている自分のマシンを区別しようとしても早すぎて輪郭が分からないので、区別するときは色を頼りにすることが多い気がします。
ただ、シールや複雑な塗装で1台のマシンに様々な色が配色されている場合もあるので、平均色(※)を求める方がいいのかなと(今は)思っています。
(※)平均色…複数の色を平均した「色の傾向」を単一の色として扱ったもの

ただ、走っているマシンの平均色を取る、なんて思い切ったことがスマホの性能で出来るのかは未知数です。
(もし無理だったら別の区別方法を考えなきゃな…)

直近やること

まずは、要件1「ラップタイムを計測する」を実現するためにカメラの画像を解析してミニ四駆ゴールラインを超えたことを検知する実装方法を調査するところから始めます。
恐らく背景差分法というアルゴリズムを使って実装することになりそうですが、何も考えずに実装すると性能的にかなり無理が出そうなので、iOSアプリで効率よく実装する方法を調べないといけません。。