質問編集履歴

1

計算式のみの質問に変更しました。

2019/11/19 09:14

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- Madgwickフィルタを用いての方位角(yaw角)の傾斜補正が上手くかな(Arduinon nano)
1
+ オイラー角を用いて傾斜補正が
test CHANGED
@@ -1,186 +1,16 @@
1
1
  ### 前提・実現したいこと
2
2
 
3
- Madgwickフィルタから算出したrollとpitch角を用いて地磁気センサ(MAG3110)の傾斜補正行いたいと考えています。
3
+ オイラー角を用いて傾斜補正を行い、地磁気センサから方位角算出したいと考えています。
4
4
 
5
5
 
6
6
 
7
7
  ### 発生している問題
8
8
 
9
- 水平の状態では傾斜補正前も傾斜補正後も同じ値が出ると思うのですが、一致しません。
10
-
11
- また、傾斜補正後の方の値が安定しません。
12
-
13
- また、傾斜補正後ですが、傾けると値が変わってしまいます。
14
-
15
- ### 該当のソースコード
16
-
17
- 見にくいプログラムですみません。。。
9
+ 算出が上手くいません。
18
-
19
- houiが傾斜補正前の方位角で、houi2が傾斜補正後の値です。
20
-
21
- ```
22
-
23
- #include <MadgwickAHRS.h>
24
-
25
- #include<Wire.h>
26
-
27
- #include<math.h>
28
10
 
29
11
 
30
12
 
31
- Madgwick MadgwickFilter;
32
-
33
-
34
-
35
- #define MPU_addr 0x68
36
-
37
- #define Addr 0x0E
38
-
39
-
40
-
41
- int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;
42
-
43
- void setup(){
13
+ ### 計算式(コード)
44
-
45
- Wire.beginTransmission(Addr);
46
-
47
- Wire.write(0x11);
48
-
49
- Wire.write(0x80);
50
-
51
- Wire.endTransmission();
52
-
53
-
54
-
55
- delay(15);
56
-
57
-
58
-
59
- Wire.beginTransmission(Addr);
60
-
61
- Wire.write(0x10);
62
-
63
- Wire.write(0x01);
64
-
65
- Wire.endTransmission();
66
-
67
-
68
-
69
- Wire.begin();
70
-
71
- Wire.beginTransmission(MPU_addr);
72
-
73
- Wire.write(0x6B);
74
-
75
- Wire.write(0);
76
-
77
- Wire.endTransmission();
78
-
79
-
80
-
81
- Serial.begin(9600);
82
-
83
-
84
-
85
- MadgwickFilter.begin(100);
86
-
87
- }
88
-
89
-
90
-
91
- void loop(){
92
-
93
- //加速度、角速度をセンサから取得~表示
94
-
95
- Wire.beginTransmission(MPU_addr);
96
-
97
- Wire.write(0x3B);
98
-
99
- Wire.endTransmission();
100
-
101
- Wire.requestFrom(MPU_addr,14);
102
-
103
- AcX=Wire.read()<<8|Wire.read();
104
-
105
- AcY=Wire.read()<<8|Wire.read();
106
-
107
- AcZ=Wire.read()<<8|Wire.read();
108
-
109
- Tmp=Wire.read()<<8|Wire.read();
110
-
111
- GyX=Wire.read()<<8|Wire.read();
112
-
113
- GyY=Wire.read()<<8|Wire.read();
114
-
115
- GyZ=Wire.read()<<8|Wire.read();
116
-
117
-
118
-
119
- float acc_x = AcX / 16384.0; //FS_SEL_0 16,384 LSB / g
120
-
121
- float acc_y = AcY / 16384.0;
122
-
123
- float acc_z = AcZ / 16384.0;
124
-
125
-
126
-
127
- acc_x -= 0.045;
128
-
129
- acc_y -= -0.010;
130
-
131
- acc_z -= -0.175;
132
-
133
-
134
-
135
- float gyro_x=GyX/131.0;
136
-
137
- float gyro_y=GyY/131.0;
138
-
139
- float gyro_z=GyZ/131.0;
140
-
141
-
142
-
143
- gyro_x -= -1.56466;
144
-
145
- gyro_y -= 1.258743;
146
-
147
- gyro_z -= -0.4928;
148
-
149
-
150
-
151
- MadgwickFilter.updateIMU(gyro_x, gyro_y, gyro_z, acc_x, acc_y, acc_z);
152
-
153
-
154
-
155
- float roll = MadgwickFilter.getRoll()-4.0;
156
-
157
- float pitch = MadgwickFilter.getPitch();
158
-
159
- float yaw = MadgwickFilter.getYaw();
160
-
161
-
162
-
163
- //Serial.print(roll); Serial.print(",");
164
-
165
- //Serial.print(pitch); Serial.println("");
166
-
167
-
168
-
169
- float magx,magy,magz;
170
-
171
-
172
-
173
- magx=read_x()+1497;
174
-
175
- magy=read_y()-2145.5;
176
-
177
- magz=read_z()-607;
178
-
179
-
180
-
181
- double houi,houi2,X,Y;
182
-
183
-
184
14
 
185
15
  X=(cos(pitch)*magx)+(sin(pitch)*sin(roll)*magy)+(sin(pitch)*cos(roll)*magz);
186
16
 
@@ -188,130 +18,28 @@
188
18
 
189
19
 
190
20
 
191
- houi=-atan2(magy,magx)*(180/PI);
21
+ houi=-atan2(magy,magx)*(180/PI);//傾斜補正前
192
22
 
193
23
 
194
24
 
195
- houi2=-atan2(Y,X)*(180/PI);
25
+ houi2=-atan2(Y,X)*(180/PI);//傾斜補正後
196
26
 
197
27
 
198
28
 
199
- Serial.print(houi);Serial.print(",");
29
+ roll:ロール角
200
30
 
31
+ pitch:ピッチ角
32
+
201
- Serial.print(houi2);Serial.println("");
33
+ magx:地磁気センサのx軸のセンサー値
34
+
35
+ magy:地磁気センサのy軸のセンサー値
36
+
37
+ magz:地磁気センサのz軸のセンサー値
202
38
 
203
39
 
204
40
 
205
- delay(10);
41
+ ###補足
206
42
 
207
- }
43
+ 傾斜補正前の方位角の算出はうまくいっています。
208
44
 
209
-
210
-
211
- int mag_read_register(int reg)
212
-
213
- {
214
-
215
- int reg_val;
216
-
217
-
218
-
219
- Wire.beginTransmission(Addr); // transmit to device 0x0E
220
-
221
- Wire.write(reg); // x MSB reg
222
-
223
- Wire.endTransmission(); // stop transmitting
224
-
225
- delayMicroseconds(2); //needs at least 1.3us free time between start and stop
226
-
227
-
228
-
229
- Wire.requestFrom(Addr, 1); // request 1 byte
230
-
231
- while(Wire.available()) // slave may write less than requested
232
-
233
- {
234
-
235
- reg_val = Wire.read(); // read the byte
236
-
237
- }
238
-
239
-
240
-
241
- return reg_val;
242
-
243
- }
244
-
245
-
246
-
247
- int mag_read_value(int msb_reg, int lsb_reg)
248
-
249
- {
250
-
251
- int val_low, val_high; //define the MSB and LSB
252
-
253
- val_high = mag_read_register(msb_reg);
254
-
255
- delayMicroseconds(2); //needs at least 1.3us free time between start and stop
256
-
257
- val_low = mag_read_register(lsb_reg);
258
-
259
- int out = (val_low|(val_high << 8)); //concatenate the MSB and LSB
260
-
261
- return out;
262
-
263
- }
264
-
265
-
266
-
267
- int read_x(void)
268
-
269
- {
270
-
271
- return mag_read_value(0x01, 0x02);
272
-
273
- }
274
-
275
-
276
-
277
- int read_y(void)
278
-
279
- {
280
-
281
- return mag_read_value(0x03, 0x04);
282
-
283
- }
284
-
285
-
286
-
287
- int read_z(void)
288
-
289
- {
290
-
291
- return mag_read_value(0x05, 0x06);
292
-
293
- }
294
-
295
- ```
296
-
297
- ```ここに言語名を入力
298
-
299
- arduino言語
300
-
301
- ```
302
-
303
-
304
-
305
- ### 補足情報(FW/ツールのバージョンなど)
306
-
307
-
308
-
309
- センサは以下のものを使用しています。
310
-
311
- 6軸センサ:https://www.switch-science.com/catalog/1208/
312
-
313
- 地磁気センサ:https://www.switch-science.com/catalog/1964/
314
-
315
-
316
-
317
- ・6軸センサ(MPU6050)と地磁気センサのオフセットは完了しています。
45
+ 地磁気センサのオフセットは完了しています。