1 package edu.ucla.iBeaconNav;
14 public Quat(double roll, double pitch, double yaw)
16 this.set(new Vect(roll, pitch, yaw));
19 public void set(Vect rpy)
21 // Calculate sin/cos of roll/pitch/yaw
22 double sr = Math.sin(rpy.x * 0.5f);
23 double cr = Math.cos(rpy.x * 0.5f);
25 double sp = Math.sin(rpy.y * 0.5f);
26 double cp = Math.cos(rpy.y * 0.5f);
28 double sy = Math.sin(rpy.z * 0.5f);
29 double cy = Math.cos(rpy.z * 0.5f);
31 // Calculate quaternion
32 double tx = (cr * cp * sy) + (sr * sp * cy);
33 double ty = (sr * cp * cy) + (cr * sp * sy);
34 double tz = (cr * sp * cy) - (sr * cp * sy);
35 double tw = (cr * cp * cy) - (sr * sp * sy);
38 double dist = Math.sqrt(tx*tx + ty*ty + tz*tz + tw*tw);
46 public void get(Vect rpy)
48 double test = x*y + z*w;
52 rpy.x = 2 * Math.atan2(x, w);
55 } else if (test < -0.499) {
57 rpy.x = -2 * Math.atan2(x, w);
62 rpy.x = Math.atan2(2*y*w - 2*x*z, 1 - 2*(y*y) - 2*(z*z));
63 rpy.y = Math.asin(2*x*y + 2*z*w);
64 rpy.z = Math.atan2(2*x*w - 2*y*z, 1 - 2*(x*x) - 2*(z*z));
68 public void mul(Quat q)
70 double tw = (w * q.w) - (x * q.x) - (y * q.y) - (z * q.z);
71 double tx = (w * q.x) + (x * q.w) + (y * q.z) - (z * q.y);
72 double ty = (w * q.y) - (x * q.z) + (y * q.w) + (z * q.x);
73 double tz = (w * q.z) + (x * q.y) - (y * q.x) + (z * q.w);
81 public String toString()
83 Vect rpy = new Vect();
85 return String.format("%7.2f %7.2f %7.2f\n",
91 public void print(String label)
93 System.out.format("%-8s rpy - %s", label+":", this);
96 public void debug(String label)
98 Util.debug(String.format("%-8s rpy - %s", label+":", this));
101 public static void test() {
102 Quat id = new Quat(0, 0, 0);
103 Quat r90 = new Quat(Math.PI/2, 0, 0);
104 Quat p90 = new Quat(0, Math.PI/2, 0);
105 Quat y90 = new Quat(0, 0, Math.PI/2);
107 Quat sum = new Quat();
109 System.out.println("Init");
114 System.out.println("Roll:");
115 sum.mul(r90); sum.print("sum");
116 sum.mul(r90); sum.print("sum");
117 sum.mul(r90); sum.print("sum");
118 sum.mul(r90); sum.print("sum");
120 System.out.println("Pitch:");
121 sum.mul(p90); sum.print("sum");
122 sum.mul(p90); sum.print("sum");
123 sum.mul(p90); sum.print("sum");
124 sum.mul(p90); sum.print("sum");
126 System.out.println("Yaw:");
127 sum.mul(y90); sum.print("sum");
128 sum.mul(y90); sum.print("sum");
129 sum.mul(y90); sum.print("sum");
130 sum.mul(y90); sum.print("sum");
132 System.out.println("Test:");
133 sum.mul(r90); sum.print("sum");
134 sum.mul(p90); sum.print("sum");
135 sum.mul(y90); sum.print("sum");
136 sum.mul(p90); sum.print("sum");
137 sum.mul(y90); sum.print("sum");
138 sum.mul(y90); sum.print("sum");