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 状態のままとなっていた。

出典:平成24年度 秋期 応用情報技術者試験 午後 問7