From 537bb04f5fea714e34627e037cc4fc88dc9ea098 Mon Sep 17 00:00:00 2001
From: Randy Mackay <rmackay9@yahoo.com>
Date: Sat, 20 Jul 2013 17:59:06 +0900
Subject: [PATCH] AP_Math: add rotateXY

---
 libraries/AP_Math/matrix3.cpp | 19 +++++++++++++++++++
 libraries/AP_Math/matrix3.h   |  6 +++++-
 2 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/libraries/AP_Math/matrix3.cpp b/libraries/AP_Math/matrix3.cpp
index 346561701..807873241 100644
--- a/libraries/AP_Math/matrix3.cpp
+++ b/libraries/AP_Math/matrix3.cpp
@@ -193,6 +193,24 @@ void Matrix3<T>::rotate(const Vector3<T> &g)
     (*this) += temp_matrix;
 }
 
+// apply an additional rotation from a body frame gyro vector
+// to a rotation matrix.
+template <typename T>
+void Matrix3<T>::rotateXY(const Vector3<T> &g)
+{
+    Matrix3f temp_matrix;
+    temp_matrix.a.x = -a.z * g.y;
+    temp_matrix.a.y = a.z * g.x;
+    temp_matrix.a.z = a.x * g.y - a.y * g.x;
+    temp_matrix.b.x = -b.z * g.y;
+    temp_matrix.b.y = b.z * g.x;
+    temp_matrix.b.z = b.x * g.y - b.y * g.x;
+    temp_matrix.c.x = -c.z * g.y;
+    temp_matrix.c.y = c.z * g.x;
+    temp_matrix.c.z = c.x * g.y - c.y * g.x;
+
+    (*this) += temp_matrix;
+}
 
 // multiplication by a vector
 template <typename T>
@@ -257,6 +275,7 @@ void Matrix3<T>::zero(void)
 template void Matrix3<float>::rotation(enum Rotation);
 template void Matrix3<float>::zero(void);
 template void Matrix3<float>::rotate(const Vector3<float> &g);
+template void Matrix3<float>::rotateXY(const Vector3<float> &g);
 template void Matrix3<float>::from_euler(float roll, float pitch, float yaw);
 template void Matrix3<float>::to_euler(float *roll, float *pitch, float *yaw);
 template Vector3<float> Matrix3<float>::operator *(const Vector3<float> &v) const;
diff --git a/libraries/AP_Math/matrix3.h b/libraries/AP_Math/matrix3.h
index 146f634cb..4343f2ce3 100644
--- a/libraries/AP_Math/matrix3.h
+++ b/libraries/AP_Math/matrix3.h
@@ -187,7 +187,11 @@ public:
 
     // apply an additional rotation from a body frame gyro vector
     // to a rotation matrix.
-    void        rotate(const Vector3<T> &g);
+    void        rotate(const Vector3<T> &g);
+
+    // apply an additional rotation from a body frame gyro vector
+    // to a rotation matrix but only use X, Y elements from gyro vector
+    void        rotateXY(const Vector3<T> &g);
 };
 
 typedef Matrix3<int16_t>                Matrix3i;
-- 
GitLab