質問するログイン新規登録

質問編集履歴

4

コード修正、測定値追加

2021/03/22 11:55

投稿

Masa_teratail
Masa_teratail

スコア9

title CHANGED
File without changes
body CHANGED
@@ -69,7 +69,7 @@
69
69
  yaw2: -0.0028793097335274853
70
70
 
71
71
 
72
- ######[追記]正しく変換できたコードを以下に記載します。
72
+ ######[追記]正したコードを以下に記載します。
73
73
  ```Swift5
74
74
  // クォータニオン取得までは上述の通り
75
75
  // クォータニオンからオイラー角への変換
@@ -95,4 +95,42 @@
95
95
  self.currentXAngle = Int(pitch2 * 180 / Double.pi)
96
96
  self.currentYAngle = Int(roll2 * 180 / Double.pi)
97
97
  self.currentZAngle = Int(yaw2 * 180 / Double.pi)
98
- ```
98
+ ```
99
+ 近くはなりましたが、一致しない値も多いです。
100
+ 得られた値:
101
+ 測定1
102
+ rad:
103
+ roll 1,2= 0.04704940478649479 0.047029632217478634
104
+ pitch 1,2= 0.028981734561906995 0.029013823832668956
105
+ yaw 1,2= -0.7736049074468174 -0.7722405186353041
106
+ degree:
107
+ roll 1,2= 1 1
108
+ pitch 1,2= 2 2
109
+ yaw 1,2= -44 -44
110
+ 測定2
111
+ rad:
112
+ roll 1,2= 1.0113515659438153 0.5706119049349081
113
+ pitch 1,2= 0.8798014278180685 1.1572053442575996
114
+ yaw 1,2= -0.12041428202827054 0.7680234373632876
115
+ degree:
116
+ roll 1,2= 50 66
117
+ pitch 1,2= 57 32
118
+ yaw 1,2= -6 44
119
+ 測定3
120
+ rad:
121
+ roll 1,2= -2.735484920517521 -0.08937369139539292
122
+ pitch 1,2= 1.3428872701500676 1.780730424715864
123
+ yaw 1,2= 2.8914778638136567 0.14657073038362464
124
+ degree:
125
+ roll 1,2= 76 102
126
+ pitch 1,2= -156 -5
127
+ yaw 1,2= 165 8
128
+ 測定4
129
+ rad:
130
+ roll 1,2= -0.3030519733024809 -0.08215438603880901
131
+ pitch 1,2= 1.2922329531814778 1.3043213207876034
132
+ yaw 1,2= 1.5531307326353834 1.26109598325311
133
+ degree:
134
+ roll 1,2= 74 74
135
+ pitch 1,2= -17 -4
136
+ yaw 1,2= 88 72

3

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

2021/03/22 11:55

投稿

Masa_teratail
Masa_teratail

スコア9

title CHANGED
@@ -1,1 +1,1 @@
1
- [Swift]クォータニオン(または回転行列)からオイラー角を計算したい。
1
+ [Swift]クォータニオンからオイラー角を計算したい。
body CHANGED
@@ -1,14 +1,12 @@
1
1
  **iphoneで端末を始点から終点まで動かした際の角度をオイラー角を取得したい**と考えています。
2
2
  当初は直接オイラー角を取得していましたが、ジンバルロックのため、特定の動きで正確な値が得られませんでした。
3
3
 
4
- そこで、**クォータニオン(または回転行列)からオイラー角を計算したい**と考えています。
4
+ そこで、**クォータニオンからオイラー角を計算したい**と考えています。
5
5
  PythonやC++のコードを参考に、以下のコードを作成してみたのですが、**直接取得したオイラー角と、クォータニオンを元に計算したオイラー角の数値が一致しません**でした。
6
6
  (参考にしたコード:[Pythonでクォータニオンをz-y-x系オイラー角に変換するコード書いてみた](https://qiita.com/segur/items/1772f0b842bfabab3c6e)、[Quaternion to Euler angles conversion](https://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles#Quaternion_to_Euler_angles_conversion))
7
7
 
8
8
  ここ数週間、自分なりに色々と試行錯誤してみたのですが、門外漢なこともあり、全く見通しがつかず困り果てています。
9
- **swiftでのクォータニオン(または回転行列)からオイラー角への変換コード**について、ご助言願えれば幸いです。
9
+ **swiftでのクォータニオンからオイラー角への変換コード**について、ご助言願えれば幸いです。
10
- なお、もし可能でしたら、**差分の算出方法**についてもご助言願えればありがたく存じます。
11
-
12
10
  ```swift5
13
11
  func startMotionManager(){
14
12
 
@@ -68,4 +66,33 @@
68
66
 
69
67
  roll2: 0.025934772364812272
70
68
  pitch2: -0.10552734591014738
71
- yaw2: -0.0028793097335274853
69
+ yaw2: -0.0028793097335274853
70
+
71
+
72
+ ######[追記]正しく変換できたコードを以下に記載します。
73
+ ```Swift5
74
+ // クォータニオン取得までは上述の通り
75
+ // クォータニオンからオイラー角への変換
76
+ //pitch
77
+ let sinr_cosp = 2 * (qw * qx + qy * qz)
78
+ let cosr_cosp = 1 - 2 * (qx * qx + qy * qy)
79
+ pitch2 = atan2(sinr_cosp, cosr_cosp)
80
+
81
+ //roll
82
+ let sinp = 2 * (qw * qy - qz * qx)
83
+ if fabs(sinp) >= 1{
84
+ roll2 = copysign(Double.pi / 2, sinp)
85
+ }else{
86
+ roll2 = asin(sinp)
87
+ }
88
+
89
+ //yaw
90
+ let siny_cosp = 2 * (qw * qz + qx * qy)
91
+ let cosy_cosp = 1 - 2 * (qy * qy + qz * qz)
92
+ yaw2 = atan2(siny_cosp, cosy_cosp)
93
+
94
+ //ラジアンから度(degree)への変換
95
+ self.currentXAngle = Int(pitch2 * 180 / Double.pi)
96
+ self.currentYAngle = Int(roll2 * 180 / Double.pi)
97
+ self.currentZAngle = Int(yaw2 * 180 / Double.pi)
98
+ ```

2

タグを追加しました。

2021/03/22 10:40

投稿

Masa_teratail
Masa_teratail

スコア9

title CHANGED
File without changes
body CHANGED
File without changes

1

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

2021/03/22 00:26

投稿

Masa_teratail
Masa_teratail

スコア9

title CHANGED
@@ -1,1 +1,1 @@
1
- クォータニオン(または回転行列)からオイラー角を計算したい。
1
+ [Swift]クォータニオン(または回転行列)からオイラー角を計算したい。
body CHANGED
@@ -1,5 +1,5 @@
1
- **iphoneで端末を始点から終点まで動かした際のオイラー角を取得したい**と考えています。
1
+ **iphoneで端末を始点から終点まで動かした際の角度をオイラー角を取得したい**と考えています。
2
- 当初は直接オイラー角を取得していましたが、ジンバルロックのため正確な値が得られませんでした。
2
+ 当初は直接オイラー角を取得していましたが、ジンバルロックのため、特定の動きで正確な値が得られませんでした。
3
3
 
4
4
  そこで、**クォータニオン(または回転行列)からオイラー角を計算したい**と考えています。
5
5
  PythonやC++のコードを参考に、以下のコードを作成してみたのですが、**直接取得したオイラー角と、クォータニオンを元に計算したオイラー角の数値が一致しません**でした。
@@ -7,6 +7,7 @@
7
7
 
8
8
  ここ数週間、自分なりに色々と試行錯誤してみたのですが、門外漢なこともあり、全く見通しがつかず困り果てています。
9
9
  **swiftでのクォータニオン(または回転行列)からオイラー角への変換コード**について、ご助言願えれば幸いです。
10
+ なお、もし可能でしたら、**差分の算出方法**についてもご助言願えればありがたく存じます。
10
11
 
11
12
  ```swift5
12
13
  func startMotionManager(){