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

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

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

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

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Arduino

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

Q&A

0回答

1655閲覧

madgwick filter の実装したい

rck79851871

総合スコア2

C

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

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Arduino

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

0グッド

0クリップ

投稿2020/12/18 22:15

編集2020/12/19 04:21

前提・実現したいこと

スマートフォンから取得した加速度センサーとジャイロセンサーの値(別々のcsvファイル)を使って,madgwick filter を実装して出てきた値をcsvファイルとして保存し,スマートフォンの姿勢推定をしたいと思っています.
またmainでそれぞれのcsvファイルから読みだして用意した配列に格納しファイルを閉じ,filterUpdate関数を通して出てきた値をcsvファイルに書き込んで,推定された姿勢をpythonのほうでアニメ―ションにしたいと思っています.

質問

・用意した配列(例えばa[2][1000],w[2][1000])をどのようにしてfilterUpdate関数に通せばうまくいくのか ・filterUpdate関数から出てくる値はどのような値なのか(例えば関数のどこの値が出てくるのか).  出てくる値の数はいくつなのか. ・関数から出てきた値をどのようにcsvファイルに書き込めばよいのか

該当のソースコード

c

1#include <stdio.h> 2#pragma warning(disable : 4996) 3// Math library required for ‘sqrt’ 4#include <math.h> 5// System constants 6#define deltat 0.001f // sampling period in seconds (shown as 1 ms) 7#define gyroMeasError 3.14159265358979f * (5.0f / 180.0f) // gyroscope measurement error in rad/s (shown as 5 deg/s) 8#define beta sqrt(3.0f / 4.0f) * gyroMeasError // compute beta 9// Global system variables 10float a_x, a_y, a_z; // accelerometer measurements 11float w_x, w_y, w_z; // gyroscope measurements in rad/s 12float SEq_1 = 1.0f, SEq_2 = 0.0f, SEq_3 = 0.0f, SEq_4 = 0.0f; // estimated orientation quaternion elements with initial conditions 13void filterUpdate(float w_x, float w_y, float w_z, float a_x, float a_y, float a_z) 14{ 15// Local system variables 16float norm; // vector norm 17float SEqDot_omega_1, SEqDot_omega_2, SEqDot_omega_3, SEqDot_omega_4; // quaternion derrivative from gyroscopes elements 18float f_1, f_2, f_3; // objective function elements 19float J_11or24, J_12or23, J_13or22, J_14or21, J_32, J_33; // objective function Jacobian elements 20float SEqHatDot_1, SEqHatDot_2, SEqHatDot_3, SEqHatDot_4; // estimated direction of the gyroscope error 21// Axulirary variables to avoid reapeated calcualtions 22float halfSEq_1 = 0.5f * SEq_1; 23float halfSEq_2 = 0.5f * SEq_2; 24float halfSEq_3 = 0.5f * SEq_3; 25float halfSEq_4 = 0.5f * SEq_4; 26float twoSEq_1 = 2.0f * SEq_1; 27float twoSEq_2 = 2.0f * SEq_2; 28float twoSEq_3 = 2.0f * SEq_3; 29// Normalise the accelerometer measurement 30norm = sqrt(a_x * a_x + a_y * a_y + a_z * a_z); 31a_x /= norm; 32a_y /= norm; 33a_z /= norm; 34// Compute the objective function and Jacobian 35f_1 = twoSEq_2 * SEq_4 - twoSEq_1 * SEq_3 - a_x; 36f_2 = twoSEq_1 * SEq_2 + twoSEq_3 * SEq_4 - a_y; 37f_3 = 1.0f - twoSEq_2 * SEq_2 - twoSEq_3 * SEq_3 - a_z; 38J_11or24 = twoSEq_3; // J_11 negated in matrix multiplication 39J_12or23 = 2.0f * SEq_4; 40J_13or22 = twoSEq_1; // J_12 negated in matrix multiplication 41J_14or21 = twoSEq_2; 42J_32 = 2.0f * J_14or21; // negated in matrix multiplication 43J_33 = 2.0f * J_11or24; // negated in matrix multiplication 44// Compute the gradient (matrix multiplication) 45SEqHatDot_1 = J_14or21 * f_2 - J_11or24 * f_1; 46SEqHatDot_2 = J_12or23 * f_1 + J_13or22 * f_2 - J_32 * f_3; 47SEqHatDot_3 = J_12or23 * f_2 - J_33 * f_3 - J_13or22 * f_1; 48SEqHatDot_4 = J_14or21 * f_1 + J_11or24 * f_2; 49// Normalise the gradient 50norm = sqrt(SEqHatDot_1 * SEqHatDot_1 + SEqHatDot_2 * SEqHatDot_2 + SEqHatDot_3 * SEqHatDot_3 + SEqHatDot_4 * SEqHatDot_4); 51SEqHatDot_1 /= norm; 52SEqHatDot_2 /= norm; 53SEqHatDot_3 /= norm; 54SEqHatDot_4 /= norm; 55// Compute the quaternion derrivative measured by gyroscopes 56SEqDot_omega_1 = -halfSEq_2 * w_x - halfSEq_3 * w_y - halfSEq_4 * w_z; 57SEqDot_omega_2 = halfSEq_1 * w_x + halfSEq_3 * w_z - halfSEq_4 * w_y; 58SEqDot_omega_3 = halfSEq_1 * w_y - halfSEq_2 * w_z + halfSEq_4 * w_x; 59SEqDot_omega_4 = halfSEq_1 * w_z + halfSEq_2 * w_y - halfSEq_3 * w_x; 60// Compute then integrate the estimated quaternion derrivative 61SEq_1 += (SEqDot_omega_1 - (beta * SEqHatDot_1)) * deltat; 62SEq_2 += (SEqDot_omega_2 - (beta * SEqHatDot_2)) * deltat; 63SEq_3 += (SEqDot_omega_3 - (beta * SEqHatDot_3)) * deltat; 64SEq_4 += (SEqDot_omega_4 - (beta * SEqHatDot_4)) * deltat; 65// Normalise quaternion 66norm = sqrt(SEq_1 * SEq_1 + SEq_2 * SEq_2 + SEq_3 * SEq_3 + SEq_4 * SEq_4); 67SEq_1 /= norm; 68SEq_2 /= norm; 69SEq_3 /= norm; 70SEq_4 /= norm; 71} 72 73int main() { 74 75 float a[2][1000],w[2][1000]; 76 77 78 FILE *fp1,*fp2; 79 80 fp1 = fopen("加速度.csv", "r"); 81 if (fp1 == NULL) { 82 printf("ファイルを開くことが出来ませんでした.¥n"); 83 return; 84 } 85 printf("\n"); 86 fscanf(fp1, "%lf,%lf,%lf", a[0], a[1], a[2]); 87 fclose(fp1); 88 89 90 fp2 = fopen("角速度.csv", "r"); 91 if (fp2 == NULL) { 92 printf("ファイルを開くことが出来ませんでした.¥n"); 93 return; 94 } 95 printf("\n"); 96 fscanf(fp2, "%lf,%lf,%lf", w[0], w[1], w[2]); 97 fclose(fp2); 98 99 100 //////////////////////////////// 101 /*ここからの実装がわかりません*/ 102 //////////////////////////////// 103 104 105 106 return 0; 107 108 }

補足情報(FW/ツールのバージョンなど)

visual studio2017を使っています
またmain()のファイル操作が間違っていたらご指摘お願いします.
用意した加速度のcsvファイルは下の画像の様になっています.
角速度のほうも同じように用意してます

イメージ説明

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

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

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

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

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

jbpb0

2020/12/19 03:03

Madgwickフィルター とかでググると解説してるWebページがたくさん見つかるので、そういうのを読みながらコードを分析したら、関数の使い方は分かるのではないですかね??
rck79851871

2020/12/19 04:12

申し訳ないですけどいろいろ検索した上でわからなかったので質問しています・・・
episteme

2020/12/20 03:00

> filterUpdate関数から出てくる値はどのような値なのか(例えば関数のどこの値が出てくるのか). > 出てくる値の数はいくつなのか. こんな質問するってことは、"どっかから拾ってきたコードをやみくもに貼り付けた"ってことか?
jbpb0

2020/12/20 11:39

> filterUpdate関数から出てくる値はどのような値なのか(例えば関数のどこの値が出てくるのか). > 出てくる値の数はいくつなのか. これに回答するには、関数中のどの変数に質問者さんが欲しい値が入っているのかが分からないといけないので、理論が書かれてる https://forums.parallax.com/uploads/attachments/41167/106661.pdf や、それの解説Webページとかを読みながら、関数中の処理を全部解読しなければいけません それを他人に求めるのですか? 質問者さんがコードを分析して、 「変数〇〇に欲しい値が入っていて、それをcsvファイルに保存したいのだけど、そのやり方が分からない」 みたいに質問すれば、それはプログラミングの質問だから、回答される可能性は高いと思いますけど たまたまこのアルゴリズムを知ってる人がたまたま見たら回答してくれるかもしれないけど、その可能性は低いと思います
jbpb0

2020/12/20 13:42

> 関数から出てきた値をどのようにcsvファイルに書き込めばよいのか csvファイルの読み書きは、filterUpdate関数の中身とは無関係なので、それだけの別の質問にした方が、回答が得られやすいと思います その場合は、この質問のような題名ではなく、csvファイルの読み書きのやり方について知りたい、と分かるような題名にして
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問