From 3b5ee152034fb4d9d968a6302ae4ad9a21843d0b Mon Sep 17 00:00:00 2001
From: ym13n22 <ym13n22@soton.ac.uk>
Date: Tue, 27 Aug 2024 16:04:07 +0100
Subject: [PATCH] window1 add acceleration

---
 integration/Window.py | 89 ++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 87 insertions(+), 2 deletions(-)

diff --git a/integration/Window.py b/integration/Window.py
index d6c1bc6..131033d 100644
--- a/integration/Window.py
+++ b/integration/Window.py
@@ -120,6 +120,9 @@ class Window:
         sleep(1)
 
         # Conversions
+
+        self.quaternionsList=[]
+        self.accelerations=[]
         self.transmitting = False
         self.toRad = 2 * np.pi / 360
         self.toDeg = 1 / self.toRad
@@ -361,6 +364,31 @@ class Window:
                         q1 = float(splitPacket[2])  # qx
                         q2 = float(splitPacket[3])  # qy
                         q3 = float(splitPacket[4])  # qz
+                        qs = [q0, q1, q2, q3]
+                        #print(f"qs :{qs}")
+                        self.quaternionsList.append(qs)
+                        if(len(self.quaternionsList)>3):
+                            self.quaternionsList.pop(0)
+
+
+                        quaternionsArray = np.array(self.quaternionsList)
+                        dt = 0.1  # 时间间隔
+                        position_vector = [1, 0, 0]  # 位置矢量
+
+                        motion = QuaternionMotion(quaternionsArray, dt, position_vector)
+                        linear_acceleration = motion.linear_acceleration()
+                        print("线性加速度: ", linear_acceleration)
+                        self.accelerations.append(linear_acceleration)
+                        if(len(self.accelerations)>3):
+                            self.accelerations.pop(0)
+                        accelerationsArray = np.array(self.accelerations)
+                        displacement=self.calculate_displacement(accelerationsArray,dt)
+
+                        displacement_array = np.array(displacement)
+                        combined_displacement = np.sum(displacement_array, axis=0)
+                        print(f"combined_displacement :{combined_displacement}")
+
+
 
                         # Calculate Angles
                         roll = math.atan2(2 * (q0 * q1 + q2 * q3), 1 - 2 * (q1 * q1 + q2 * q2))
@@ -380,8 +408,8 @@ class Window:
                             left = -yaw * 90 / 2
 
 
-                        self.left_label.config(text="left : "+str(left))
-                        self.up_label.config(text="up is : "+str(up))
+                        self.left_label.config(text="left : "+str(combined_displacement))
+                        #self.up_label.config(text="up is : "+str(displacement))
 
 
 
@@ -581,6 +609,63 @@ class Window:
         else:
             return 0  # 点在垂直线上(可选)
 
+    def calculate_displacement(self,acceleration, dt):
+        velocity = np.zeros_like(acceleration)
+        velocity[1:] = np.cumsum(acceleration[:-1] * dt, axis=0)
+
+        # 计算位移(通过对速度进行积分)
+        displacement = np.zeros_like(velocity)
+        displacement[1:] = np.cumsum(velocity[:-1] * dt, axis=0)
+
+        return displacement[1:]  # 返回位移结果,去掉初始化的零位移
+
+class QuaternionMotion:
+    def __init__(self, quaternions, dt, position_vector):
+        self.quaternions = quaternions
+        self.dt = dt
+        self.position_vector = np.array(position_vector)
+
+    def quaternion_derivative(self):
+        q_next = self.quaternions[1:]
+        q_prev = self.quaternions[:-1]
+        dq_dt = (q_next - q_prev) / self.dt
+        return dq_dt
+
+    def angular_velocity(self):
+        dq_dt = self.quaternion_derivative()
+        angular_velocities = []
+        for i in range(len(dq_dt)):
+            q = self.quaternions[i]
+            q_conj = np.array([q[0], -q[1], -q[2], -q[3]])  # 四元数的共轭
+
+            # 四元数微分公式来计算角速度
+            omega_quat = 2 * self.quaternion_multiply(q_conj, dq_dt[i])
+            omega = omega_quat[1:]  # 提取角速度的向量部分
+            angular_velocities.append(omega)
+        return np.array(angular_velocities)
+
+    def quaternion_multiply(self, q1, q2):
+        w1, x1, y1, z1 = q1
+        w2, x2, y2, z2 = q2
+        return np.array([
+            w1 * w2 - x1 * x2 - y1 * y2 - z1 * z2,
+            w1 * x2 + x1 * w2 + y1 * z2 - z1 * y2,
+            w1 * y2 - x1 * z2 + y1 * w2 + z1 * x2,
+            w1 * z2 + x1 * y2 - y1 * x2 + z1 * w2
+        ])
+
+    def angular_acceleration(self):
+        omega = self.angular_velocity()
+        omega_next = omega[1:]
+        omega_prev = omega[:-1]
+        alpha = (omega_next - omega_prev) / self.dt
+        return alpha
+
+    def linear_acceleration(self):
+        alpha = self.angular_acceleration()
+        linear_accelerations = np.cross(alpha, self.position_vector)
+        return linear_accelerations
+
 class WelcomeWindow:
     def __init__(self, root):
         self.root = root
-- 
GitLab