質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.53%

  • C

    3657questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • Arduino

    536questions

    Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

三軸加速度センサを用いた万歩計の作成

受付中

回答 4

投稿

  • 評価
  • クリップ 2
  • VIEW 2,656

ponnponnkotu

score 5

三軸加速度センサを用いて万歩計を作成したいのですが、センサの傾きに関わらず値を導出する方法がわかりません。
現在は
Zに1gがかかった状態(平らな上に置いた状態で)
500:500:700の値が取れています。傾けると
500:500:300のように値が変わります
万歩計の作成について色々調べた結果 
N=√(x^2+y^2+z^2)という式で傾きに依存せずに値を導出できるようなのですが、
これだと値が高い時と低い時でNの値に大きな差が出てしまい、閾値を設定することが難しいです。
何か良い方法はありませんか?わかりにくい文章ですみません

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ozwk

    2017/02/15 08:43

    「500:500:700の値が取れています。」これx:y:z(の想定)ですか?

    キャンセル

  • ardin

    2017/02/15 09:22

    プログラム外の質問だと思いますので、それ用の質問サイトで質問した方が答えがつくと思います。物理かな。なお、書いている値が実際の値であるならば、いくつかパターンを取って該当の式にあうかどうかを調べると良いと思います。違うのであれば、その式を提案しているところで条件を確認してみてください

    キャンセル

回答 4

+1

デバイスの動作確認そのものはやっていただくとして、ご質問の主題に回答します。


以前からスマホのヘルスケア機能などを見て「どうやって実現するのかな」と興味があったので、少し調べてみました。

まず、「万歩計」は特定の会社の商標なので、これをキーワードにウェブ検索しても情報が見つかりにくいです。一般的な呼び名である「歩数計」で検索するといいです。

また、英語の「pedometer」で検索すると、GitHubなどでコードも見つかります。AndroidやArduinoを使うものがあります。


アルゴリズムの解説をしている資料を見つけました。

これを読むと、単に閾値を超えた値を検出するだけではなく、次のようなことをやっているようです (上記記事「アルゴリズム」節の「歩行パラメータ」を参照)。

  1. 入力データの平滑化。
    入力データをローパスフィルタに通して、細かい振動などのノイズを除去します。デジタルフィルタのブロック図 (図4) がありますが、これは入力データの移動平均を取るのと同等の処理です。プログラムで実現できるでしょう。
  2. 動的に閾値を決める。
    適当な数のサンプルについて平均値 (中央値) を算出し、これを閾値として次のサンプルを調べます。閾値の算出に使うサンプルの範囲を時間軸にそってずらしていきます。このように「時間窓」を用いて動的に閾値を変えていくことで、歩行で生じるのとは違う周期の加速度変化 (乗り物の揺れなどでしょうか) を排除できるそうです。資料ではサンプル数の基準として、歩行2歩分の時間間隔を用いています。
  3. 閾値と入力を比較して一歩を判定する。
    閾値をまたいで加速度が変化 (減少) したら、一歩が踏み出されたと判定するとのことです。閾値を超えたかどうかではなく、いったん超えたものが元に戻ってくるところで判定するのが味噌のようです。
    ブロック図 (図6) がありますが、これもプログラムで実現できるでしょう。
  4. カウント調整。
    誤検出を減らすため、データの変化を一般的な歩行のパターンと照合します。最初の数歩がパターンにマッチするまではカウントを開始せず、確認できたら最初からのカウントをまとめて加算します。
    デジタル式ならではの処理で、高精度を実現できそうです。ここまでできれば完璧ですね。

上記のうち4. はかなり高度ですが、3. までやるだけでも、機械式の歩数計と同程度の精度にはなるのではないかと思います。

ちなみに、この資料では傾きの影響を避けるために、加速度ベクトルの大きさを求める (質問者さんがおっしゃっている方法) のではなく、単に3軸の値のうち絶対値が最大のものを採用するという方法をとっているようです。精度は落ちるかもしれませんが計算は簡単になるので、試してみる価値はありそうですね。

私が気になった点としては、加速度計から入力されるデータは重力によって下向きに1Gのオフセットがついているはずで、これが精度に影響を与えないか、ということがあります。ただ、走っているときの加速度変化の例のグラフ (図3) は振幅が2G強ありますから、重力の影響を無視してもそこそこうまくいくのかもしれません。


なお、実用的な感度と精度を得るにはパラメタチューニングは必須のようです。チューニングの経験を語った記事がありました。

なおこの記事の製品では、精度を上げるために、地磁気センサと併用して垂直方向を検出することもしています。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

ゆっくり傾けたときに"N"の値が大きく変わるなら、
それは加速度センサの値がうまく取れていないか、
"N"の導出が間違えてます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

こんにちは。

500:500:700の値が取れています。傾けると 
500:500:300のように値が変わります 

加速度センサーを使ったことはないのですが、その3つの値が順にx, y, z軸方向の加速度を表しているのであれば、x, y軸の加速度が取れていないように見えます。
傾けた時値は変化する筈なのに変化していませんから。

まずは、加速度センサーの仕様書を読んで、正しい出力を把握しましょう。
そして、その「正しい出力」通りに取れるようにプログラムすることが先決です。

ただ、500, 500と意味不明ながらも値が取れているようですので、ソフトウェア的な問題ではなく断線や固着等のハードウェア的な不具合があるかも知れません。
その場合はteratailで質問するには不適切ですので回路系の質問掲示板等を探して質問されるべきと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

地上で静止している物体には、鉛直方向(地球の中心に向かう方向)に1Gの重力加速度がかかります。
Z軸が鉛直方向である場合には、Z軸に1G、X軸とY軸は0です。

X,Y,Z軸方向の加速度の値をx,y,zで表すとすると、静止していればセンサの傾きに関わらず (x*x + y*y + z*z)の平方根が1Gになります。

質問では、この式があてはまりませんので何らかの問題があるのだと思われますが、それはセンサからデータを得る過程で生じているもので、処理(プログラム)の問題ではありません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    arduinoと温度センサ

    arduinoと温度センサ arduinoで温度センサを自作しようと考えています。 そこで、7セグLED温度センサのPICをarduinoで代用出来ないかと考えました。マイコン→A

  • 解決済

    Android端末のセンサについて

    現在、Xperia Z SO-02のジャイロセンサと加速度センサから物体の傾きを測定して、それに合わせてモータ(サーボかブラシレス)を動かして物体の水平を保つというシステムの開発を

  • 受付中

    Arudinoで取得したセンサ値をRaspberryPiで計算したい(Python)

    import sys import serial def main(): ser = serial.Serial('dev/ttyACM0',9600) whil

  • 受付中

    Androidアプリでセンサとのデータ受信

    今現在Androidアプリでbluetoothを扱おうと考え触っていたのですが、詳しい仕組みがわからず困っています。現在のサンプルコードでは接続が確認されると乱数が表示されるように

  • 解決済

    ステッピングモータ 28BYJを距離センサHC-SR04を用いて制御したい

    ステッピングモータ 28BYJを距離センサHC-SR04を用いて制御するために、以下のコードを書いています。ものが検出されたら、ステッピングモータが回るという感じです。各センサは単

  • 解決済

    pythonで方位センサを使いたい

    Raspberry Pi 3 ModelB Ver1.2を使っております。 言語はpythonです。 友達から無理だと方位センサを託されました。 秋月で購入したものですでにペー

  • 解決済

    GPSセンサを利用する

    下記のURLを参考にGPSデータを取得しようとしております。 ①~④を実施しましたが、エラーが出てコンパイルできません。 ご指導いただけると幸いです。 http://arms2

  • 解決済

    複数センサを統計的に統合

     前提・実現したいこと ○、×の2値の出力をする複数のセンサーを統合したいと考えています。 統合するセンサーは4個(4種類)で、それぞれのセンサーは、統計的に正規分布で以下の性能を

同じタグがついた質問を見る

  • C

    3657questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • Arduino

    536questions

    Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。