2012年 秋期 応用情報技術者試験 問7
スマートフォンのアプリケーションプログラム設計
G 社は、スマートフォン(以下、端末という)で稼働する歩数計アプリケーションプログラム(以下、歩数計アプリという)を開発することになった。
歩数計アプリは、人が歩くことによって変動する加速度を解析し、歩数を算出する。
端末は、加速度センサと、加速度センサを制御するためのミドルウェアとを搭載している。歩数計アプリは、このミドルウェアを使用して、加速度センサのデータを取得する。
【端末の仕様】
端末は、電力の消費をできるだけ少なくするために、使用していないときはディスプレイを消灯し、MPU へのクロック供給を停止している。
端末の状態には、MPU へのクロック供給を行っているウェイク状態と、MPU へのクロック供給を停止しているサスペンド状態がある。
端末をサスペンド状態にする条件(以下、サスペンド条件という)は、端末が通話及びデータ通信を行っていない状態で、利用者が端末を 60 秒間操作しないことである。
一方、端末がサスペンド状態のときに、着信があるかもしくは利用者が端末を操作すると、MPU へのクロック供給を再開し、ウェイク状態になる。
ミドルウェアの API には、"サスペンド禁止" と "サスペンド許可" がある。アプリケーションプログラムが "サスペンド禁止" を実行すると、サスペンド状態になることが禁止され、サスペンド条件が成立しても、端末はウェイク状態を維持する。
一方、アプリケーションプログラムが "サスペンド許可" を実行すると、サスペンド状態になることが許可され、サスペンド条件が成立したとき、端末はサスペンド状態になる。
なお、電源投入後 "サスペンド禁止" を実行するまで、端末はサスペンド状態になることが許可されている。
【加速度センサ】
端末に内蔵されている加速度センサは、(横、縦、高さ)の加速度を(X、Y、Z)とし、それぞれ、−19.6 メートル/秒²〜19.6 メートル/秒²の範囲で測定できる。
動作確認のために端末を水平な机の上に置いた。ディスプレイ面を上にしたとき Z の値は負で、下にしたとき Z の値は正であった。机の上で、ディスプレイ面を上にして端末を図 1 の①及び②の方向に動かしてみた。Z の値は a メートル/秒²でほぼ一定であったが、X 及び Y の値は図 2 のように変化した。
<figure>
<div class="figure-grid">
<div class="figure-left">
<div class="terminal-diagram">
<div class="screen">
<div class="arrow">②</div>
<div class="circle">○</div>
<div class="arrow">①</div>
</div>
</div>
<figcaption>図1 端末を動かした方向</figcaption>
</div>
<div class="figure-right">
<div class="graph-container">
<div class="graph">
<div class="axis-label">X</div>
<div class="axis-label">Y</div>
<div class="data-points">
<div class="note">①方向に動かしたとき<br>Yはほとんど変化なし</div>
<div class="note">②方向に動かしたとき<br>Xはほとんど変化なし</div>
</div>
<div class="time-axis">時間</div>
</div>
</div>
<figcaption>図2 ①、②方向に動かしたときの加速度の変化</figcaption>
</div>
</div>
</figure>
さらに、端末の b 歩行したところ、加速度は図 3 のように Z の値だけが大きく変化し、X 及び Y の値は、Z の値の変化の大きさに比べるとほとんど変化しなかった。
<figure>
<div class="graph-container">
<div class="graph">
<div class="axis-label">Z</div>
<div class="data-points">
<div class="note">X、Yはほとんど変化なし</div>
</div>
<div class="time-axis">時間</div>
</div>
</div>
<figcaption>図3 歩行したときの加速度の変化</figcaption>
</figure>
【歩数計アプリ】
歩数計アプリが加速度センサのデータを取得するとき、ミドルウェアの API である "センサ設定" を実行する。この API には、加速度センサのデータ取得間隔として 50、100、200 及び 1,000 ミリ秒のいずれかを指定し、ミドルウェアから加速度センサのデータを取得するための関数を歩数計アプリが用意して登録する。
ミドルウェアは指定された間隔で加速度センサのデータを取得し、メートル/秒²単位の浮動小数点数に変換し、歩数計アプリで用意した関数に渡す。
歩数計アプリが終了するとき、歩数計アプリはミドルウェアの API である "センサ設定解除" を実行し、"センサ設定" で設定した関数の登録を取り消す。
利用者が端末をどのような向きで持ち、歩行するかは特定できない。そこで、3 軸方向の加速度を合成して、重力加速度が正の方向になるように補正した。その補正した値を用いて、端末にかかる加速度の変化を調べる。
静止しているとき、端末は重力の影響で一定の加速度を受けている。一方、歩行しているとき、端末は上下に動くので、合成された加速度は図 4 のように周期的に変動する。この周期を検出し、変動の 1 周期を 1 歩と判定する。ただし、変動の大きさが所定の値よりも小さいときは、静止しているものとする。
<figure>
<div class="graph-container">
<div class="graph">
<div class="axis-label">加速度</div>
<div class="data-points">
<!-- 波形のデータポイント -->
</div>
<div class="time-axis">時間</div>
</div>
</div>
<figcaption>図4 歩行中の加速度の変化</figcaption>
</figure>
歩数計アプリは、1 秒間に最大 4 歩まで計測できるようにする。
歩数計アプリは加速度センサのデータを一定時間ごとに取得(以下、サンプリングという)している。サンプリングによって、復元できるデータの周波数は、サンプリングする周波数の 1/2 までとする。
1 秒間に最大 4 歩のデータを復元するには、1 秒間に c 回以上、サンプリングしなければならない。消費電力を考慮し、できる限りサンプリング周期を長くしたい。そこで、加速度センサのデータ取得間隔を d ミリ秒とした。
歩数計アプリは、歩数計アプリ用のアイコンをタッチすることで起動する。歩数計アプリは、起動されると "サスペンド禁止" を実行し、計測した歩数をディスプレイに表示する。
ディスプレイに表示している終了ボタンをタッチすると、歩数計アプリは終了する。
【運用試験】
歩数計アプリをインストールした端末を、野外に持ち出して試験したところ、歩数計アプリを一度使用すると、歩数計アプリを終了しても電池の消耗が激しい、という指摘があった。
原因を調べたところ、歩数計アプリ終了時に e を実行しておらず、その結果、歩数計アプリが終了しても、端末の状態は f 状態のままとなっていた。