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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C

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

Arduino

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

Q&A

4回答

11864閲覧

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

ponnponnkotu

総合スコア13

C

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

Arduino

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

0グッド

2クリップ

投稿2017/02/14 21:12

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2017/02/14 23:43

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

2017/02/15 00:22

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

回答4

0

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


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

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

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


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

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

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

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

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

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


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

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

投稿2017/02/15 09:26

ikedas

総合スコア4227

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

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

投稿2017/02/15 08:55

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは。

500:500:700の値が取れています。傾けると

500:500:300のように値が変わります

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

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

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

投稿2017/02/15 03:31

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

投稿2017/02/14 23:49

ozwk

総合スコア13512

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問