From 621127a40d0fcd87f250535b3652b0639b84e233 Mon Sep 17 00:00:00 2001
From: paleziart <paleziart@laas.fr>
Date: Tue, 8 Jun 2021 10:52:07 +0200
Subject: [PATCH] Adapt logging and plots to new architecture

---
 scripts/LoggerControl.py | 68 +++++++++++++++++++++++++++++++---------
 1 file changed, 53 insertions(+), 15 deletions(-)

diff --git a/scripts/LoggerControl.py b/scripts/LoggerControl.py
index 6f542863..e0c11018 100644
--- a/scripts/LoggerControl.py
+++ b/scripts/LoggerControl.py
@@ -29,6 +29,7 @@ class LoggerControl():
         self.esti_FK_lin_vel = np.zeros([logSize, 3])  # estimated velocity of the base with FK
         self.esti_FK_xyz = np.zeros([logSize, 3])  # estimated position of the base with FK
         self.esti_xyz_mean_feet = np.zeros([logSize, 3])  # average of feet goals
+        self.esti_filt_lin_vel = np.zeros([logSize, 3])  # estimated velocity of the base before low pass filter
 
         self.esti_HP_x = np.zeros([logSize, 3])  # x input of the velocity complementary filter
         self.esti_HP_dx = np.zeros([logSize, 3])  # dx input of the velocity complementary filter
@@ -46,6 +47,8 @@ class LoggerControl():
         # Loop
         self.loop_o_q_int = np.zeros([logSize, 19])  # position in world frame (esti_q_filt + dt * loop_o_v)
         self.loop_o_v = np.zeros([logSize, 18])  # estimated velocity in world frame
+        self.loop_h_v = np.zeros([logSize, 18])  # estimated velocity in horizontal frame
+        self.loop_pos_virtual_world = np.zeros([logSize, 3])  # x, y, yaw perfect position in world
 
         # Gait
         self.planner_gait = np.zeros([logSize, N0_gait, 4])  # Gait sequence
@@ -81,8 +84,11 @@ class LoggerControl():
         self.wbc_tau_ff = np.zeros([logSize, 12])  # feedforward torques computed by the WBC
         self.wbc_f_ctc = np.zeros([logSize, 12])  # contact forces computed by the WBC
         self.wbc_feet_pos = np.zeros([logSize, 3, 4])  # current feet positions according to WBC
+        self.wbc_feet_pos_target = np.zeros([logSize, 3, 4])  # current feet positions targets for WBC
         self.wbc_feet_err = np.zeros([logSize, 3, 4])  # error between feet positions and their reference
         self.wbc_feet_vel = np.zeros([logSize, 3, 4])  # current feet velocities according to WBC
+        self.wbc_feet_vel_target = np.zeros([logSize, 3, 4])  # current feet velocities targets for WBC
+        self.wbc_feet_acc_target = np.zeros([logSize, 3, 4])  # current feet accelerations targets for WBC
         self.wbc_feet_pos_invkin = np.zeros([logSize, 3, 4])  # current feet positions according to InvKin
         self.wbc_feet_vel_invkin = np.zeros([logSize, 3, 4])  # current feet velocities according to InvKin
 
@@ -109,6 +115,7 @@ class LoggerControl():
         self.esti_FK_lin_vel[self.i] = estimator.FK_lin_vel[:]
         self.esti_FK_xyz[self.i] = estimator.FK_xyz[:]
         self.esti_xyz_mean_feet[self.i] = estimator.xyz_mean_feet[:]
+        self.esti_filt_lin_vel[self.i] = estimator.filt_lin_vel[:]
         if not estimator.kf_enabled:
             self.esti_HP_x[self.i] = estimator.filter_xyz_vel.x
             self.esti_HP_dx[self.i] = estimator.filter_xyz_vel.dx
@@ -126,6 +133,8 @@ class LoggerControl():
         # Logging from the main loop
         self.loop_o_q_int[self.i] = loop.q[:, 0]
         self.loop_o_v[self.i] = loop.v[:, 0]
+        self.loop_h_v[self.i] = loop.h_v[:, 0]
+        self.loop_pos_virtual_world[self.i] = np.array([loop.q[0, 0], loop.q[1, 0], loop.yaw_estim])
 
         # Logging from the planner
         # self.planner_q_static[self.i] = planner.q_static[:]
@@ -151,8 +160,11 @@ class LoggerControl():
         self.wbc_tau_ff[self.i] = loop.result.tau_ff
         self.wbc_f_ctc[self.i] = wbc.f_with_delta[:, 0]
         self.wbc_feet_pos[self.i] = wbc.feet_pos
+        self.wbc_feet_pos_target[self.i] = wbc.log_feet_pos_target[:, :, self.i+1]
         self.wbc_feet_err[self.i] = wbc.feet_err
         self.wbc_feet_vel[self.i] = wbc.feet_vel
+        self.wbc_feet_vel_target[self.i] = wbc.log_feet_vel_target[:, :, self.i+1]
+        self.wbc_feet_acc_target[self.i] = wbc.log_feet_acc_target[:, :, self.i+1]
         self.wbc_feet_pos_invkin[self.i] = wbc.invKin.cpp_posf.transpose()
         self.wbc_feet_vel_invkin[self.i] = wbc.invKin.cpp_vf.transpose()
 
@@ -212,16 +224,18 @@ class LoggerControl():
                 plt.subplot(3, 4, index12[i], sharex=ax0)
 
             plt.plot(t_range, self.wbc_feet_pos[:, i % 3, np.int(i/3)], color='b', linewidth=3, marker='')
-            plt.plot(t_range, self.wbc_feet_err[:, i % 3, np.int(i/3)], color='g', linewidth=3, marker='')
-            plt.plot(t_range, self.planner_goals[:, i % 3, np.int(i/3)], color='r', linewidth=3, marker='')
-            plt.plot(t_range, self.wbc_feet_pos_invkin[:, i % 3, np.int(i/3)],
-                     color='darkviolet', linewidth=3, linestyle="--", marker='')
+            plt.plot(t_range, self.wbc_feet_err[:, i % 3, np.int(i/3)] + self.wbc_feet_pos[0, i % 3, np.int(i/3)], color='g', linewidth=3, marker='')
+            plt.plot(t_range, self.wbc_feet_pos_target[:, i % 3, np.int(i/3)], color='r', linewidth=3, marker='')
+            """plt.plot(t_range, self.wbc_feet_pos_invkin[:, i % 3, np.int(i/3)],
+                     color='darkviolet', linewidth=3, linestyle="--", marker='')"""
             if (i % 3) == 2:
+                mini = np.min(self.wbc_feet_pos[:, i % 3, np.int(i/3)])
+                maxi = np.max(self.wbc_feet_pos[:, i % 3, np.int(i/3)])
                 plt.plot(t_range, self.planner_gait[:, 0, np.int(
-                    i/3)] * np.max(self.wbc_feet_pos[:, i % 3, np.int(i/3)]), color='k', linewidth=3, marker='')
+                    i/3)] * (maxi - mini) + mini, color='k', linewidth=3, marker='')
             plt.legend([lgd_Y[i % 3] + " " + lgd_X[np.int(i/3)]+"", "error",
                         lgd_Y[i % 3] + " " + lgd_X[np.int(i/3)]+" Ref", "Contact state"], prop={'size': 8})
-        plt.suptitle("Measured & Reference feet positions (world frame)")
+        plt.suptitle("Measured & Reference feet positions (base frame)")
 
         lgd_X = ["FL", "FR", "HL", "HR"]
         lgd_Y = ["Vel X", "Vel Y", "Vel Z"]
@@ -232,12 +246,12 @@ class LoggerControl():
             else:
                 plt.subplot(3, 4, index12[i], sharex=ax0)
             plt.plot(t_range, self.wbc_feet_vel[:, i % 3, np.int(i/3)], color='b', linewidth=3, marker='')
-            plt.plot(t_range, self.planner_vgoals[:, i % 3, np.int(i/3)], color='r', linewidth=3, marker='')
-            plt.plot(t_range, self.wbc_feet_vel_invkin[:, i % 3, np.int(i/3)],
-                     color='darkviolet', linewidth=3, linestyle="--", marker='')
+            plt.plot(t_range, self.wbc_feet_vel_target[:, i % 3, np.int(i/3)], color='r', linewidth=3, marker='')
+            """plt.plot(t_range, self.wbc_feet_vel_invkin[:, i % 3, np.int(i/3)],
+                     color='darkviolet', linewidth=3, linestyle="--", marker='')"""
             plt.legend([lgd_Y[i % 3] + " " + lgd_X[np.int(i/3)], lgd_Y[i %
                                                                        3] + " " + lgd_X[np.int(i/3)]+" Ref"], prop={'size': 8})
-        plt.suptitle("Measured and Reference feet velocities (world frame)")
+        plt.suptitle("Measured and Reference feet velocities (base frame)")
 
         lgd_X = ["FL", "FR", "HL", "HR"]
         lgd_Y = ["Acc X", "Acc Y", "Acc Z"]
@@ -247,9 +261,9 @@ class LoggerControl():
                 ax0 = plt.subplot(3, 4, index12[i])
             else:
                 plt.subplot(3, 4, index12[i], sharex=ax0)
-            plt.plot(t_range, self.planner_agoals[:, i % 3, np.int(i/3)], color='r', linewidth=3, marker='')
+            plt.plot(t_range, self.wbc_feet_acc_target[:, i % 3, np.int(i/3)], color='r', linewidth=3, marker='')
             plt.legend([lgd_Y[i % 3] + " " + lgd_X[np.int(i/3)]+" Ref"], prop={'size': 8})
-        plt.suptitle("Reference feet accelerations (world frame)")
+        plt.suptitle("Reference feet accelerations (base frame)")
 
         # LOG_Q
         lgd = ["Position X", "Position Y", "Position Z", "Position Roll", "Position Pitch", "Position Yaw"]
@@ -259,8 +273,15 @@ class LoggerControl():
                 ax0 = plt.subplot(3, 2, index6[i])
             else:
                 plt.subplot(3, 2, index6[i], sharex=ax0)
-            plt.plot(t_range, self.planner_xref[:, i, 0], "b", linewidth=2)
-            plt.plot(t_range, self.planner_xref[:, i, 1], "r", linewidth=3)
+            if i in [0, 1]:
+                plt.plot(t_range, self.loop_pos_virtual_world[:, i], "b", linewidth=3)
+                plt.plot(t_range, self.loop_pos_virtual_world[:, i], "r", linewidth=3)
+            elif i == 5:
+                plt.plot(t_range, self.loop_pos_virtual_world[:, 2], "b", linewidth=3)
+                plt.plot(t_range, self.loop_pos_virtual_world[:, 2], "r", linewidth=3)
+            else:
+                plt.plot(t_range, self.planner_xref[:, i, 0], "b", linewidth=2)
+                plt.plot(t_range, self.planner_xref[:, i, 1], "r", linewidth=3)
             if i < 3:
                 plt.plot(t_range, loggerSensors.mocapPosition[:, i], "k", linewidth=3)
             else:
@@ -281,14 +302,19 @@ class LoggerControl():
                 ax0 = plt.subplot(3, 2, index6[i])
             else:
                 plt.subplot(3, 2, index6[i], sharex=ax0)
-            plt.plot(t_range, self.esti_v_filt[:, i], "b", linewidth=2)
+            plt.plot(t_range, self.loop_h_v[:, i], "b", linewidth=2)
             plt.plot(t_range, self.joy_v_ref[:, i], "r", linewidth=3)
             if i < 3:
                 plt.plot(t_range, self.mocap_b_v[:, i], "k", linewidth=3)
                 # plt.plot(t_range, self.esti_FK_lin_vel[:, i], "violet", linewidth=3, linestyle="--")
+                plt.plot(t_range, self.esti_filt_lin_vel[:, i], "violet", linewidth=3, linestyle="--")
             else:
                 plt.plot(t_range, self.mocap_b_w[:, i-3], "k", linewidth=3)
 
+                N = 2000
+                y = np.convolve(self.mocap_b_w[:, i-3], np.ones(N)/N, mode='valid')
+                plt.plot(t_range[int(N/2)-1:-int(N/2)], y, linewidth=3, linestyle="--")
+
             # plt.plot(t_range, self.log_dq[i, :], "g", linewidth=2)
             # plt.plot(t_range[:-2], self.log_dx_invkin[i, :-2], "g", linewidth=2)
             # plt.plot(t_range[:-2], self.log_dx_ref_invkin[i, :-2], "violet", linewidth=2, linestyle="--")
@@ -538,6 +564,7 @@ class LoggerControl():
                  esti_FK_lin_vel=self.esti_FK_lin_vel,
                  esti_FK_xyz=self.esti_FK_xyz,
                  esti_xyz_mean_feet=self.esti_xyz_mean_feet,
+                 esti_filt_lin_vel=self.esti_filt_lin_vel,
 
                  esti_HP_x=self.esti_HP_x,
                  esti_HP_dx=self.esti_HP_dx,
@@ -554,6 +581,8 @@ class LoggerControl():
 
                  loop_o_q_int=self.loop_o_q_int,
                  loop_o_v=self.loop_o_v,
+                 loop_h_v=self.loop_h_v,
+                 loop_pos_virtual_world=self.loop_pos_virtual_world,
 
                  planner_q_static=self.planner_q_static,
                  planner_RPY_static=self.planner_RPY_static,
@@ -576,8 +605,11 @@ class LoggerControl():
                  wbc_tau_ff=self.wbc_tau_ff,
                  wbc_f_ctc=self.wbc_f_ctc,
                  wbc_feet_pos=self.wbc_feet_pos,
+                 wbc_feet_pos_target=self.wbc_feet_pos_target,
                  wbc_feet_err=self.wbc_feet_err,
                  wbc_feet_vel=self.wbc_feet_vel,
+                 wbc_feet_vel_target=self.wbc_feet_vel_target,
+                 wbc_feet_acc_target=self.wbc_feet_acc_target,
 
                  tstamps=self.tstamps,
 
@@ -617,6 +649,7 @@ class LoggerControl():
         self.esti_FK_lin_vel = data["esti_FK_lin_vel"]
         self.esti_FK_xyz = data["esti_FK_xyz"]
         self.esti_xyz_mean_feet = data["esti_xyz_mean_feet"]
+        self.esti_filt_lin_vel = data["esti_filt_lin_vel"]
 
         self.esti_HP_x = data["esti_HP_x"]
         self.esti_HP_dx = data["esti_HP_dx"]
@@ -633,6 +666,8 @@ class LoggerControl():
 
         self.loop_o_q_int = data["loop_o_q_int"]
         self.loop_o_v = data["loop_o_v"]
+        self.loop_h_v = data["loop_h_v"]
+        self.loop_pos_virtual_world = data["loop_pos_virtual_world"]
 
         self.planner_q_static = data["planner_q_static"]
         self.planner_RPY_static = data["planner_RPY_static"]
@@ -655,8 +690,11 @@ class LoggerControl():
         self.wbc_tau_ff = data["wbc_tau_ff"]
         self.wbc_f_ctc = data["wbc_f_ctc"]
         self.wbc_feet_pos = data["wbc_feet_pos"]
+        self.wbc_feet_pos_target = data["wbc_feet_pos_target"]
         self.wbc_feet_err = data["wbc_feet_err"]
         self.wbc_feet_vel = data["wbc_feet_vel"]
+        self.wbc_feet_vel_target = data["wbc_feet_vel_target"]
+        self.wbc_feet_acc_target = data["wbc_feet_acc_target"]
 
         self.tstamps = data["tstamps"]
 
-- 
GitLab