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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

2回答

3394閲覧

Android端末のセンサについて

John_syado

総合スコア21

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2015/11/05 06:33

現在、Xperia Z SO-02のジャイロセンサと加速度センサから物体の傾きを測定して、それに合わせてモータ(サーボかブラシレス)を動かして物体の水平を保つというシステムの開発を2人でしています。私はそのうちの物体の傾きを送るプログラム担当です。
そこで、まずは初歩的な問題なのですが、モータを制御するには角度を計算したほうが良いのでしょうか。それとも変化した角速度と真逆の角速度を発生させるだけでいいのでしょうか。誤差の処理などもあると思いますが、角度まで求める必要があるのか教えていただけると助かります。

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

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

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

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

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

guest

回答2

0

センサーの角速度を打ち消す方向にモーターを回すということですか?

それだとまず誤差が蓄積しますし、
1.左に傾く
2.左に回る向きの角速度を検出したのでモーターで右に回す
3.戻す際にセンサーが右に回る向きの角速度を検出
4.右に回る向きの角速度を検出したのでモーターで左に回す
...
と全然安定しないと思いますよ。


加速度センサとジャイロセンサで角度を算出するのは
「センサフュージョン」の例としてよくあるので
調べるといろいろ出てきます。

手軽にやるならば、低周波成分として加速度センサ、高周波成分として角速度センサを用いて計算します。

真面目にやるならば状態空間モデルを設定し、
カルマンフィルタやパーティクルフィルタなどで最尤推定します。

投稿2015/11/05 07:01

編集2015/11/10 06:35
ozwk

総合スコア13512

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

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

John_syado

2015/11/10 05:24 編集

返信遅くなりました。確かにそうですね…。回答ありがとうございます。
ozwk

2015/11/10 04:54

あと、やってみればわかりますが、 基本、センサの値を積分しても望む量は得られません ジャイロセンサから得た角速度を積分して、1分後に誤差1度にするためには オフセットがいくつ以下である必要があるか一度計算してみるといいです。 ただ、補正には使えます。
John_syado

2015/11/10 05:22 編集

回答ありがとうございます。ジャイロセンサのオフセットから角度を求めるのは難しいかと考えていたので、方法がしっかりと定まっているわけではないのですが、Androidに同じく積まれている加速度センサを用いて静止時の角度を求めてオフセットの代わりに使うことで誤差を小さくできるのではないかと考えていたのですが難しいでしょうか…?
swordone

2015/11/10 05:32

>加速度センサを用いて静止時の角度を求めて 申し訳ないですが意味がわかりません。加速がなければ加速度センサは当然0なので、どこの角度で静止していても加速度センサから角度はわかりません。 どうも重力による加速だけ考えているような文面なのですが、そもそも制御によって水平に保とうとしているのですから、それ以外にモータによる加速も加わるはずです。 その状態で加速度から角度を求めると言うのは無茶です。
John_syado

2015/11/10 05:40

静止時は重力加速度しかかからないと思っていたので加速度センサから重力加速度をもとに角度を計算して、他の加速度がかかっているときは加速度センサでは角度が求められないのでジャイロセンサからの角速度から角度を求めようと思っていたのですが不可能なのでしょうか?
swordone

2015/11/10 05:49 編集

極端な話、端末を画面を上にして置いた状態を目標とする「水平」だとすると、 画面が上に向いた状態と下に向いた状態をどう区別しますか? どちらも重力しかかかりませんが? 仮に真下を向かない条件だとしたら、どこかでストッパーがかかるはずです。 ストッパーに完全に委ねた状態ならこれも重力しかかからない静止状態です。
John_syado

2015/11/10 05:52

水平な静止状態をz軸に対して-方向に重力加速度のみがかかった状態とすれば、画面が上か下かについては重力加速度の値が+か-かで判断して、どこかで静止している場合は、x軸やy軸にも加速度が生じるのでそれで判断することはできませんか?
swordone

2015/11/10 05:59

加速度センサはあくまで「加速度」を取得するためのセンサです。 動いていなければ当然加速度はゼロです。 なので、加速度をもとに角度を求めようにも、画面が上向き静止でも下向き静止でも区別が付かず、この2状態すら判別できません。
John_syado

2015/11/10 06:11

一応加速度と角速度を求めるだけのプログラムは完成しているのですが、それを用いるとテーブルなどにスマホを置くと画面が上の場合はz方向におよそ重力加速度と同じ9.8m/s^2かかり、画面を下にすると-9.8m/s^2と表示されるのですが、私の認識では動いていなくても重力加速度だけは影響があると思うのですが0でなくてはおかしいのでしょうか?
ozwk

2015/11/10 06:17

加速度センサは二種類あって、 swordoneさんの言う静止時に0になるものと John_syadoさんの言う静止時に重力加速度を出力するものがあります。 スマホに載っているものは普通、端末の向きを取得するためのものなので、 静止時に重力加速度を出力するタイプですね
swordone

2015/11/10 06:23

失礼しました、こちらの知識不足だったようで、勘違いをしておりました。 大変申し訳ありません。
John_syado

2015/11/10 06:27

こちらこそ静止時に全て0を出すタイプがあるとは知りませんでした。勉強になりました。
John_syado

2015/11/10 06:50

回答ありがとうございます。私も低周波成分として加速度センサ、高周波成分として角速度センサというのは調べてみて知っていたのですが、なぜ低周波成分に加速度センサを使い高周波センサに角速度センサを使うのかの詳しい原理がわからなかったため、使うのを迷っていたのです。
ozwk

2015/11/10 07:29

加速度センサーは静止していれば信用できますが、動いていると回転の影響で重力加速度以外を感じてしまい、信用できなくなります。 一方ジャイロセンサは短時間なら動いていても信用できますが、 長時間となると誤差が蓄積して信用できなくなります。 したがって、 加速度センサを低周波、 ジャイロを高周波的に信頼するとちょうどいいということです。
John_syado

2015/11/12 04:36

回答ありがとうございます。返事が遅くて申し訳ないです。動きがあると周波数が大きくなり高周波になるのでジャイロセンサは高周波成分として使い、動きがないと周波数が小さくなり低周波になるので加速度センサを低周波成分として使い、さらに誤差の修正もできるという感じの認識で大丈夫でしょうか?
ozwk

2015/11/12 04:44

多分あっていると思います(頭のなかを覗けないので断言できませんが。) 要するに相補フィルタなのでいろいろ調べてください。
John_syado

2015/11/12 04:50

何度も回答ありがとうございます。すいません。つい甘えて質問ばかり返してしまいました。センサフュージョンや相補フィルタなど教えてもらったことを参考にいろいろ調べてみます。
guest

0

ベストアンサー

基本的には必要です。水平からのずれが大きいほど、水平に補正するために大きな力を必要とします。
つまり、角度に比例した力が必要と考えられます。
制御系にもよりますが、PID制御を使う場合、角度と、その角度の積分要素(実用上は定期的に計測した角度を累積していく)、角度の微分要素(定期的に計測した角度の差分=角速度)が基本的に必要となります。

投稿2015/11/05 06:46

swordone

総合スコア20649

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

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

John_syado

2015/11/09 05:55

返信遅くなりました。PID制御とはモータの制御でしょうか?一応共同で開発してる友人はPWM制御でモータを制御すると言っていたのですが…。どちらにせよ一度角度を求めたほうがいいのでしょうか…。
swordone

2015/11/09 06:14

PID制御はフィードバック制御の一種です。目標との差から入力を決定する仕組みです。 PWMについて調べましたが、これはただ単に入力信号の変換方式を言っているのでは無いですか? 元となる信号をどうやって決めますか? いずれにせよ、水平に保ちたいのに現在の角度がわからないなんてことは本来ありえないことだと思うのですが。
John_syado

2015/11/10 04:38

回答ありがとうございます。センサから角速度を取得して、角度を求めます。その角度をもとにPID制御を用いてどのくらいの強さの力が必要か求めます。そしてそれをもとにPWM制御でモータに適した信号に変換してモータを制御するという認識で大丈夫でしょうか?
swordone

2015/11/10 04:53

傾きを直接取得する方法は無いのでしょうか?→http://seesaawiki.jp/w/moonlight_aska/d/%B7%B9%A4%AD%A5%BB%A5%F3%A5%B5%A1%BC%A4%CE%C3%CD%A4%F2%BC%E8%C6%C0%A4%B9%A4%EB あと、PWMは本当に軽く調べただけなので、その共同開発しているという友人に確認されたほうがいいかと思います。
John_syado

2015/11/10 05:00

傾きセンサの存在は知っていたのですが最近のAndroidでは非推奨となっているみたいなので、使わないほうがいいのかな?と思ってジャイロセンサを使おうと思っていました。PWM制御についてはHighとLowの値を変えることで単純なOnOffではなく強さに変化を与える制御方法のようです。何度も回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問