
加速度センサADXL345、mbedを用いた速度計測を行いたいのですが、うまくいきません。
下記サイトを参考に加速度センサから値を抽出しました。加速度センサ静止時、Z軸は256を出力していた為、プログラミングより9.8を出力するようにしました。
https://developer.mbed.org/users/suupen/notebook …
その後、加速度センサをY軸上に動かした時の速度を計測する為、加速度を積分するプログラムを作成しました。
プログラミング一部
while(true){
double as =0;
double a =0;
double v =0;
accelerometer.getOutput(readings);
as = (int16_t)readings[1]*(9.8/256); //加速度センサY軸からの値256を9.8にする
v += as*0.1*1000; //加速度センサY軸からの値を時間で積分
printf("%0.1f[ms]\r\n",v);
wait(0.1);
}
このようにしてミニ四駆に加速度センサを取り付けましたが、速度は誤差が多くうまくとれませんでした。
どのようにすれば移動中の物体速度を抽出できるのでしょうか。
A 回答 (11件中1~10件)
- 最新から表示
- 回答順に表示
No.11
- 回答日時:
センサーには誤差が必ずあります。
更に、誤差にもさまざまの誤差があります。(1)オフセット
現在貴方が経験していますように、設置条件により何もないのにあるかのように0ではない値が検出される。
(2)線形誤差
加速度が10の時に、センサー出力値が100だとして、加速度が2倍の20になった場合、センサー出力値が200にはならず、199の場合もあれば、201かもしれない
(3)シンメトリー
加速度が10の時に、、センサー出力値が100だとして、加速度が-10(減速)になった場合、センサー出力値がー200にはならず、ー199の場合もあれば、ー201かもしれない
(4)環境によるブレ
その時の温度により同じ加速度でも検出される値が異なる。あるいは振動によっても値が異なることがある。
(5)量子化誤差
定期的にセンサー値を取得していますが、取得していない時のセンサー値は無視されています。その影響が反映されていません。
このように様々な誤差を含んだセンサー値を積算するということは、誤差をどんどんと増やしているということです。
つまり、加速度センサーから速度を求めるのはとても難しいということです。これを経験させるために、課題を与えられたのかと思っていました。
No.10
- 回答日時:
Vを求めてから
if(fabs(v) < 0.2){
v = 0.0;
}
で、いかがでしょうか。
fabs()が使えなければ
if((v > -0.2) && (v < 0.2)){
v = 0.0;
}
ところで、貴方のやられていることは、学校か何かの課題でやられていると思い、指導者の方の意思を尊重して決定的な事は申し上げないでいたのですが、その私の認識であっていますでしょうか。
趣味でとか、仕事でとかですと、申し上げなければならないことがあるのですが。
いえ趣味でやっております。
なお、教えていただいたようにプログラム変更しました。
水平時値はでなくなりましたが、速度はうまく測定できませんでした。
同じ速度のはずですが、速度波形はその都度違いました。
やはり加速度センサで速度計測は難しいのでしょうか。
No.9
- 回答日時:
別IDからです。
足しあわされる原因はセンサが水平でも出力0以外が出力される為でした。
不感帯で-0.2~+0.2までの不感帯にしたいのですがどういうプログラムにすれば良いのでしょうか。
No.7
- 回答日時:
加速度センサーを完璧に水平に設置することは不可能です。
従って、停止中も0出ない値を出力します。readings[1]を10サンプルくらい取得し、平均値を求め、仮にavとします。
as = readings[1]-av;
としてみて下さい。
as *= 9.8/256;
は
as = as * 9.8/256;
と同じです。
No.6
- 回答日時:
回答が小出しで申し訳ありません。
(int16_t)のキャストを行っていますが、これでは、ほどんど0になってしまいます。
readings[]をintで宣言し、
as=readings[1];
と浮動小数変数に格納後,下記のように単位変換を行ってください。
as *= 9.8/256;
No.5
- 回答日時:
お使いの加速度センサーは2の補数で出力されるようですので、最初にアドバイスさせていただいた通り、変数Vの初期化はループに入る前に一度だけ行えば、速度が求められるはずです。
センサーを常に水平にしておくことが前提ですが。
No.4
- 回答日時:
加速度は、プラスとマイナスがあります。
加速時はプラス、減速時はマイナスです。ADXL345の仕様をインターネットで確認したところ、2の補数表示をしているようなので、減速時はマイナスになります。
従って、accelerometer.getOutput(readings); のreadingsを符号付き変数として宣言すれば、減速時にはマイナスになると思われます。
>加速度センサを動かさなくても値が足しあわされてしまいます。
当然です。加速度とは加重です。動いているかどうかではなく、力が加わっているかどうかです。重力も認知されます。
どのような使用方法を考えているのか分かりませんが、自動車のようなものなら水平に置くことを仮定してプログラミングするか、飛行機のようなものでしたら姿勢状態の把握もしなければなりません。差し支えなければ応用内容を提示された方が、回答しやすいと思います。
制御プログラム作成に翻弄されているようですが、是非解決して回答を見つけて下さい。我が国の資源は貴方がたの物づくり能力そのものです。頑張ってください。私があなたの力になれるのでしたら光栄です。
No.3
- 回答日時:
すみません、よくプログラムを見ずに投稿しました。
accelerometer.getOutput(readings); でreadingsに入る値はAD値のようですが、加速度0の時の値は128ではないですか?
もしそうなら
as = ((int16_t)readings[1]-128)*(9.8/256);
とする必要があります。
No.2
- 回答日時:
>double v =0; をwhileの外に出してしまうと、速度値が常に足しあわされてしまいます。
"常に足しあわされ"ることによって積分が成立します。積分するためには、wtileのたびに0クリアしてはいけません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 物理学 一般相対論の時空は何処から来ましたか? 1 2022/10/20 20:29
- 物理学 アインシュタインのアッカンベー相対論信者の洗脳を解くにはどうしたら? 5 2022/10/17 07:16
- 工学 都市ガスの燃焼速度 3 2022/08/03 12:59
- 飛行機・空港 電動のネッククーラーは空港の検査に通せますか? 3 2023/06/25 19:31
- その他(ネットショッピング・通販・ECサイト) 骨伝導ヘッドセットで この二つは値段が違うだけでは同じですか? 1 2023/02/13 19:13
- 物理学 ニュートン力学を光に適用することはできません? 1 2022/11/21 22:34
- FTTH・光回線 皆さんのインターネット回線速度はどれくらいですか? 6 2022/10/29 23:13
- 物理学 超音速旅客機の燃費について質問です 1 2022/12/27 17:31
- 船舶・クルーズ Windows10のエクスプローラにて。 1 2022/10/10 20:11
- 経済 国債をどんどん発行して、国家予算に充てれば良いという考え方が提唱されてますが…… 5 2022/10/09 19:34
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PS4コントローラーをPCでゲーム...
-
4Kの外部モニターに出力すると...
-
プログラムについての質問です...
-
Accessのテーブルからcsv出力す...
-
標準出力の上書き
-
4種類(A4縦、A4横、A3縦、A3横)のヘ...
-
1ヶ月前の日時を取得
-
C#でアクセス権限の取得方法が...
-
COBOLで可変長ファイルの出力に...
-
ログ出力でミリ秒まで出したい...
-
makeで文字化けする。migwのmak...
-
VBAでテキスト出力時のスペース...
-
NSString文字列をprintfで出力...
-
ACCESS クエリ→フォーム...
-
KEYENCEのシーケンスプログラム...
-
アクセスでエクセルに出力する...
-
Windows Formアプリからコンソ...
-
【VBA】PDFを2in1で出力したいです
-
VBAでIEを操作、ポップアップさ...
-
スマホのバッテリー消費につい...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PS4コントローラーをPCでゲーム...
-
4Kの外部モニターに出力すると...
-
プログラムについての質問です...
-
PD充電器について
-
cout と cerrの違い
-
スマホ充電器購入にあたり
-
Accessのテーブルからcsv出力す...
-
MMDでavi出力が出来ない
-
printfとputcharの違いは
-
VBAのExecメソッドで画面を非表...
-
TV出力ポートをOFFにすれば良い...
-
COBOLのMOVEで桁数が異なる場合
-
VBAでテキスト出力時のスペース...
-
ACCESS クエリ→フォーム...
-
coutで出力した文字を消去する...
-
4種類(A4縦、A4横、A3縦、A3横)のヘ...
-
Windows Formアプリからコンソ...
-
コンセントの電力は入力と出力...
-
C#でアクセス権限の取得方法が...
-
【VBA】PDFを2in1で出力したいです
おすすめ情報
回答ありがとうございます。
double v =0; をwhileの外に出してしまうと、速度値が常に足しあわされてしまいます。どのようにすればよいのでしょうか。
Y軸の加速度0の時は0と表示されます。(平らの床に加速度センサを置いた場合)
Y軸上に90度傾けると256と表示されます。
128とはどういうことでしょうか。
また、Whileの外に出してしまうと常に足しあわされるため、加速度センサを動かさなくても値が足しあわされてしまいます。
アドバイスしていただき有難うございます。
加速度センサは水平である物体に設置します。
物体はX軸上を動きますので、この時の速度を加速度センサで抽出したいと考えています。
どのようにすれば速度が抽出出来るのでしょうか。加速度が取れているので時間で積分すれば出るはずなのですが、うまくいかず。
よろしくお願い致します。
以下のようなプログラム修正にしました。
int main()
{
~省略~
int readings[3] = {0, 0, 0};
double v =0;
while(true){
double as =0;
double a =0;
accelerometer.getOutput(readings);
as = readings[1]
as *= 9.8/256;
a += (0.11111)*(as-a);
v += a*0.01*1000;
printf("%0.1f[ms]\r\n",v);
wait(0.01);
}
}
こちらで宜しいでしょうか。
なお、readingsはintで宣言しています。
実は加速度センサの値が安定しない為、 a += (0.11111)*(as-a);でLPFを掛けているのですが物体を動かさずに値が足されてしまうのはLPFが原因なのでしょうか。
なお、*=とはどういうプログラムなのでしょうか。