この記事は Akerun Advent Calendar 2021 - Qiita の15日目の記事です。
WebエンジニアのBunです。主にiOSアプリの開発を担当しています。
日々いろんな解錠方法について考えています。特にiOSアプリで使えるいろんな便利な機能を使った解錠方法とその実装手順をまとめます。 今回はiOS(iPhone / Apple Watch) + JINS MEMEでの解錠について書きます。
JINS MEME
JINS MEMEはスマホ、スマートウォッチとつながるウェアラブルメガネです。つい最近最新版がリリースされました。
JINS MEMEは鼻当て部分のCOREに2つのセンサーが搭載されたウェアラブルデバイスです。COREに内蔵されたBluetoothでスマホアプリと連携。センサーが取得したさまざまな情報をスマホで解析し、あなたのカラダとココロの状態を計測します。
6軸モーションセンサー、眼電位センサーから体と目の動きのデータが取れるので、姿勢チェック、集中度計測などヘルスケアに関連する色々面白いことができそうです。
ちなみに、以前初代JINS MEMEのハッカソンに参加し、JINS MEMEと連携したアプリ(the zen)を作ったことがあります。
JINS MEMEで解錠
JINS MEMEと連携したアプリを使えば、Akerunの近くてまばたきするだけで解錠できます。
弊社の「タッチレスエントリー・ソリューション」と組み合わせると、完全タッチレスでより快適な解錠を実現できます。
JINS MEMEとの連携
JINS MEMEから「20Hzデータ」、「15秒間隔データ」、「60秒間隔データ」を取得できますが、 リアルタイムでAkerunを制御するには、JINS MEMEからBluetooth経由で20Hzデータを取得する必要があります。
※https://jins-meme.github.io/sdkdoc2/
JINS MEME SDK
SDK共通事項 - JINS MEME DEVELOPER DOCUMENTS
JINS MEMEを購入する前にちゃんと調べていなかったので、購入後SDKが使えないことを知って少しがっかりしましたが、お問い合わせしたところ、期間限定でご提供いただきました。有り難く使わせていただきます。
非公開情報なので、JINS MEME SDKの詳細については触れません。JINS MEME Platformに公開されている範囲内の内容についてご説明します。
JINS MEME SDK(framework)導入
SDKは一般的なframeworkとして提供されるので、Targetの「Frameworks, Libraries, and Embedded Content」にframeworkを追加すれば使えます。
Akerun施錠解錠実装
施錠解錠API
今回はAkerunアプリで使われているBluetooth専用APIを使っていますが、Akerun公開APIからも施錠解錠が可能です。 具体的な実装は割愛します。弊社のAkerun Developersと下記の関連記事をご参照ください。
施錠解錠トリガー
下記通りシンプルです。
JINS MEMEから取得したモーションセンサーデータ(頭の動き)と眼電位センサーデータ(まばたき)から施錠解錠コマンドを判定し、Akerunにコマンドを送信するだけです。
施錠解錠判定
以下の二つの方法で試してみました。
頭の動き(傾き)とまばたき回数の組み合わせ
まばたき回数と間隔
頭の動き(傾き)とまばたき回数の組み合わせ
単純にまばたきだけだと、意図しない施錠解錠処理が走る可能性が高いので、頭の動き(傾き)も判定するようにしました。
※https://jins-meme.github.io/sdkdoc2/basics/definition.html
- 頭の動き
普段の動きから見ると、前後の傾きとか左右回転は多少不自然な動きになるので、左右傾きのrollのデータを使います。
右方向への傾きを解除とし、左方向への傾きを施錠とします。それぞれrollの範囲は「-180-0」と「0-180」になります。
閾値ですが、小さすぎると、誤動作が発生やすいし、大きい過ぎると、不自然な動きになります。何より首が痛い。。。
色々試した結果20前後が割と良さそうなので、今回は20を取ることにしました。
if data.roll > 20 { // 右傾き:解錠判定 } else if data.roll < -20 { // 左傾き:施錠判定 } else { // クリア }
- まばたきと回数
まばたき速度(blinkSpeed)とまばたき強度(blinkStrength)両方を見てまばたきの判定をします。
こちらについても色々試した結果、まばたき速度は60以上、まばたき強度は30以上にすれば問題なさそうです。
まばたき回数ですが、1回だと誤動作が発生しやすいので、2回まで見ることにしました。
ただ、普段も頭を傾いてまばだきする時もよくあるので、意図しない施錠解錠を減らすために、さらにタイマーを掛けて、「2s以内にまばたき2回」の条件をつけました。
最初は1s以内にしてみましたが、JINS MEMEかSDKの制限(?)で1s以内に複数回まばたきしても検出できないようなので、2sにしています。
多分、下記だと思うので、来年改善を期待します。
まばたきの検出が遅い→2022年に対応ファームウェアを公開する方向で検討中
まばたきの検出は前世代では0.3s、現世代では0.5sのディレイがあります。これは「ライフログで一番精度が上がる」ように誤判定の原因になりそうな前後のシグナル推移のウィンドウを確保しているのが理由です。こちらは2022年以降に対応ファームウェアを公開する方向で検討しております。
※https://jins-meme.github.io/sdkdoc2/basics/motion-tracking-howto.html
解錠判定処理を下記になります(一部抜粋)。
if data.roll < -20 { if self.unlockBlinkCount < 2 { if data.blinkSpeed > 60 || data.blinkStrength > 30 { self.unlockBlinkCount += 1 if self.unlockBlinkCount == 1 { self.startSignalTimer() } else if self.unlockBlinkCount == 2 { self.stopSignalTimer() return .unlock } } } } private func startSignalTimer() { self.signalTimer = Timer.scheduledTimer( timeInterval: self.signalTimeout, target: self, selector: #selector(self.notifySignalTimeout(_:)), userInfo: nil, repeats: false ) } @objc func notifySignalTimeout(_ tm: Timer) { self.unlockBlinkCount = 0 }
まばたき回数と間隔
詳細は割愛しますが、解錠だけの場合まばたき回数と間隔を調整すれば、頭の動きを見なくても特に問題なく解錠ができます。
例えば、1s前後の間隔でまばたき3回で解錠します。
この方法だと、JINS MEMEのジャイロセンサーを使わないので、バッテリー持ちが良くなります。また、首の負担が大分減ると思います。これ大事です。
Akerunはautolock機能があるので、解錠さえできれば十分だと思います。
今後の改善
今回はシンプルにまばたき回数しか使っていないですが、さらにまばたきの詳細パターン(回数、間隔、速度、強度)をチューニング、学習すれば、精度を上げられそうです。
まばたきは「静止指標」で、頭の動きも含めて歩いている状態だと少しノイズが入るので、精度が低くなります。noiseStatusを使って補正ロジックを入れるなど工夫が必要そうです。
まばたきの検出が遅い問題について、次バージョンファームウェアを待つしかないですが、検出が早くなると、施錠解錠精度がもっと上がるように色々工夫ができそうです。
視線の動きも入れることで誤動作などを減らせそうですが、うまく検出できない時もあるので、今後ファームウェア改善されたら試してみます。
まとめ
非公開のため詳細は割愛しましたが、JINS MEME SDKはシンプルで使いやすかったです。サンプルコードもあったので、すぐアプリに組み込むことができました。
スマホの場合、画面をみないと処理が始まったのか、検出と判定にエラーが出たのか分からないので、Apple Watchのバイブレーションを使えば、分かりやすくなると思います。次回試してみたいと思います。
日常で使えるウェアラブルデバイスとしてJINS MEMEはとても素晴らしい製品なので、今後も色々連携してみたいと思います。SDKが一般公開されれば、さらに広がりそうですね。
株式会社フォトシンスでは、一緒にプロダクトを成長させる様々なレイヤのエンジニアを募集しています。 hrmos.co
Akerun Proの購入はこちらから akerun.com