質問編集履歴

4

コード修正、測定値追加

2021/03/22 11:55

投稿

Masa_teratail
Masa_teratail

スコア9

test CHANGED
File without changes
test CHANGED
@@ -140,7 +140,7 @@
140
140
 
141
141
 
142
142
 
143
- ######[追記]正しく変換できたコードを以下に記載します。
143
+ ######[追記]正したコードを以下に記載します。
144
144
 
145
145
  ```Swift5
146
146
 
@@ -193,3 +193,79 @@
193
193
  self.currentZAngle = Int(yaw2 * 180 / Double.pi)
194
194
 
195
195
  ```
196
+
197
+ 近くはなりましたが、一致しない値も多いです。
198
+
199
+ 得られた値:
200
+
201
+ 測定1
202
+
203
+ rad:
204
+
205
+ roll 1,2= 0.04704940478649479 0.047029632217478634
206
+
207
+ pitch 1,2= 0.028981734561906995 0.029013823832668956
208
+
209
+ yaw 1,2= -0.7736049074468174 -0.7722405186353041
210
+
211
+ degree:
212
+
213
+ roll 1,2= 1 1
214
+
215
+ pitch 1,2= 2 2
216
+
217
+ yaw 1,2= -44 -44
218
+
219
+ 測定2
220
+
221
+ rad:
222
+
223
+ roll 1,2= 1.0113515659438153 0.5706119049349081
224
+
225
+ pitch 1,2= 0.8798014278180685 1.1572053442575996
226
+
227
+ yaw 1,2= -0.12041428202827054 0.7680234373632876
228
+
229
+ degree:
230
+
231
+ roll 1,2= 50 66
232
+
233
+ pitch 1,2= 57 32
234
+
235
+ yaw 1,2= -6 44
236
+
237
+ 測定3
238
+
239
+ rad:
240
+
241
+ roll 1,2= -2.735484920517521 -0.08937369139539292
242
+
243
+ pitch 1,2= 1.3428872701500676 1.780730424715864
244
+
245
+ yaw 1,2= 2.8914778638136567 0.14657073038362464
246
+
247
+ degree:
248
+
249
+ roll 1,2= 76 102
250
+
251
+ pitch 1,2= -156 -5
252
+
253
+ yaw 1,2= 165 8
254
+
255
+ 測定4
256
+
257
+ rad:
258
+
259
+ roll 1,2= -0.3030519733024809 -0.08215438603880901
260
+
261
+ pitch 1,2= 1.2922329531814778 1.3043213207876034
262
+
263
+ yaw 1,2= 1.5531307326353834 1.26109598325311
264
+
265
+ degree:
266
+
267
+ roll 1,2= 74 74
268
+
269
+ pitch 1,2= -17 -4
270
+
271
+ yaw 1,2= 88 72

3

正しく変換できたコードを記載しました。

2021/03/22 11:55

投稿

Masa_teratail
Masa_teratail

スコア9

test CHANGED
@@ -1 +1 @@
1
- [Swift]クォータニオン(または回転行列)からオイラー角を計算したい。
1
+ [Swift]クォータニオンからオイラー角を計算したい。
test CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
 
6
6
 
7
- そこで、**クォータニオン(または回転行列)からオイラー角を計算したい**と考えています。
7
+ そこで、**クォータニオンからオイラー角を計算したい**と考えています。
8
8
 
9
9
  PythonやC++のコードを参考に、以下のコードを作成してみたのですが、**直接取得したオイラー角と、クォータニオンを元に計算したオイラー角の数値が一致しません**でした。
10
10
 
@@ -14,11 +14,7 @@
14
14
 
15
15
  ここ数週間、自分なりに色々と試行錯誤してみたのですが、門外漢なこともあり、全く見通しがつかず困り果てています。
16
16
 
17
- **swiftでのクォータニオン(または回転行列)からオイラー角への変換コード**について、ご助言願えれば幸いです。
17
+ **swiftでのクォータニオンからオイラー角への変換コード**について、ご助言願えれば幸いです。
18
-
19
- なお、もし可能でしたら、**差分の算出方法**についてもご助言願えればありがたく存じます。
20
-
21
-
22
18
 
23
19
  ```swift5
24
20
 
@@ -139,3 +135,61 @@
139
135
  pitch2: -0.10552734591014738
140
136
 
141
137
  yaw2: -0.0028793097335274853
138
+
139
+
140
+
141
+
142
+
143
+ ######[追記]正しく変換できたコードを以下に記載します。
144
+
145
+ ```Swift5
146
+
147
+ // クォータニオン取得までは上述の通り
148
+
149
+ // クォータニオンからオイラー角への変換
150
+
151
+ //pitch
152
+
153
+ let sinr_cosp = 2 * (qw * qx + qy * qz)
154
+
155
+ let cosr_cosp = 1 - 2 * (qx * qx + qy * qy)
156
+
157
+ pitch2 = atan2(sinr_cosp, cosr_cosp)
158
+
159
+
160
+
161
+ //roll
162
+
163
+ let sinp = 2 * (qw * qy - qz * qx)
164
+
165
+ if fabs(sinp) >= 1{
166
+
167
+ roll2 = copysign(Double.pi / 2, sinp)
168
+
169
+ }else{
170
+
171
+ roll2 = asin(sinp)
172
+
173
+ }
174
+
175
+
176
+
177
+ //yaw
178
+
179
+ let siny_cosp = 2 * (qw * qz + qx * qy)
180
+
181
+ let cosy_cosp = 1 - 2 * (qy * qy + qz * qz)
182
+
183
+ yaw2 = atan2(siny_cosp, cosy_cosp)
184
+
185
+
186
+
187
+ //ラジアンから度(degree)への変換
188
+
189
+ self.currentXAngle = Int(pitch2 * 180 / Double.pi)
190
+
191
+ self.currentYAngle = Int(roll2 * 180 / Double.pi)
192
+
193
+ self.currentZAngle = Int(yaw2 * 180 / Double.pi)
194
+
195
+ ```

2

タグを追加しました。

2021/03/22 10:40

投稿

Masa_teratail
Masa_teratail

スコア9

test CHANGED
File without changes
test CHANGED
File without changes

1

タグを追加し、タイトルにSwiftを追記しました。また、質問文を一部修正しました。

2021/03/22 00:26

投稿

Masa_teratail
Masa_teratail

スコア9

test CHANGED
@@ -1 +1 @@
1
- クォータニオン(または回転行列)からオイラー角を計算したい。
1
+ [Swift]クォータニオン(または回転行列)からオイラー角を計算したい。
test CHANGED
@@ -1,6 +1,6 @@
1
- **iphoneで端末を始点から終点まで動かした際のオイラー角を取得したい**と考えています。
1
+ **iphoneで端末を始点から終点まで動かした際の角度をオイラー角を取得したい**と考えています。
2
2
 
3
- 当初は直接オイラー角を取得していましたが、ジンバルロックのため正確な値が得られませんでした。
3
+ 当初は直接オイラー角を取得していましたが、ジンバルロックのため、特定の動きで正確な値が得られませんでした。
4
4
 
5
5
 
6
6
 
@@ -15,6 +15,8 @@
15
15
  ここ数週間、自分なりに色々と試行錯誤してみたのですが、門外漢なこともあり、全く見通しがつかず困り果てています。
16
16
 
17
17
  **swiftでのクォータニオン(または回転行列)からオイラー角への変換コード**について、ご助言願えれば幸いです。
18
+
19
+ なお、もし可能でしたら、**差分の算出方法**についてもご助言願えればありがたく存じます。
18
20
 
19
21
 
20
22