From 03576088a58933a32495ccfccb838063480aa713 Mon Sep 17 00:00:00 2001
From: odri <odri@furano.laas.fr>
Date: Fri, 5 Nov 2021 17:39:50 +0100
Subject: [PATCH] Fix LoggerControl class

---
 scripts/LoggerControl.py | 224 +++++++++++++++++++++------------------
 1 file changed, 119 insertions(+), 105 deletions(-)

diff --git a/scripts/LoggerControl.py b/scripts/LoggerControl.py
index b9b09582..0d9362b1 100644
--- a/scripts/LoggerControl.py
+++ b/scripts/LoggerControl.py
@@ -8,7 +8,7 @@ import pinocchio as pin
 
 class LoggerControl():
     def __init__(self, dt, N0_gait, type_MPC=None, joystick=None, estimator=None, loop=None, gait=None, statePlanner=None,
-                 footstepPlanner=None, footTrajectoryGenerator=None, logSize=60e3, ringBuffer=False):
+                 footstepPlanner=None, footTrajectoryGenerator=None, logSize=60e3, ringBuffer=False, loading=False, fileName=None):
         self.ringBuffer = ringBuffer
         logSize = np.int(logSize)
         self.logSize = logSize
@@ -20,6 +20,16 @@ class LoggerControl():
         else:
             self.type_MPC = 0
 
+        if loading:
+            if fileName is None:
+                import glob
+                fileName = np.sort(glob.glob('data_2021_*.npz'))[-1]  # Most recent file
+
+            self.data = np.load(fileName, allow_pickle = True)
+            N0_gait = self.data["planner_gait"].shape[1]
+            logSize = self.data["planner_gait"].shape[0]
+            self.logSize = logSize
+
         # Allocate the data:
         # Joystick
         self.joy_v_ref = np.zeros([logSize, 6])  # reference velocity of the joystick
@@ -72,10 +82,10 @@ class LoggerControl():
         self.planner_is_static = np.zeros([logSize])  # if the planner is in static mode or not
 
         # State planner
-        self.planner_xref = np.zeros([logSize, 12, 1+statePlanner.getNSteps()])  # Reference trajectory
+        self.planner_xref = np.zeros([logSize, 12, 1+N0_gait])  # Reference trajectory
 
         # Footstep planner
-        self.planner_fsteps = np.zeros([logSize, gait.getCurrentGait().shape[0], 12])  # Reference footsteps position
+        self.planner_fsteps = np.zeros([logSize, N0_gait, 12])  # Reference footsteps position
         self.planner_target_fsteps = np.zeros([logSize, 3, 4])  # For each foot, next target on the ground
         # o_target_foosteps can be reconstructed using yaw_ideal and x y ideal (top of q_up)
         self.planner_h_ref = np.zeros([logSize])  # reference height of the planner
@@ -90,10 +100,16 @@ class LoggerControl():
 
         # Model Predictive Control
         # output vector of the MPC (next state + reference contact force)
-        if loop.type_MPC == 3:
-            self.mpc_x_f = np.zeros([logSize, 32, statePlanner.getNSteps()])
+        if loading:
+            if int(fileName[-5]) == 3:
+                self.mpc_x_f = np.zeros([logSize, 32, N0_gait])
+            else:
+                self.mpc_x_f = np.zeros([logSize, 24, N0_gait])
         else:
-            self.mpc_x_f = np.zeros([logSize, 24, statePlanner.getNSteps()])
+            if loop.type_MPC == 3:
+                self.mpc_x_f = np.zeros([logSize, 32, N0_gait])
+            else:
+                self.mpc_x_f = np.zeros([logSize, 24, N0_gait])
         self.mpc_solving_duration = np.zeros([logSize])
 
         # Whole body control
@@ -836,110 +852,108 @@ class LoggerControl():
 
     def loadAll(self, loggerSensors, fileName=None):
 
-        if fileName is None:
-            import glob
-            fileName = np.sort(glob.glob('data_2021_*.npz'))[-1]  # Most recent file
-
-        data = np.load(fileName, allow_pickle = True)
+        if self.data is None:
+            print("No data file loaded. Need one in the constructor.")
+            return
 
         # Load LoggerControl arrays
-        self.joy_v_ref = data["joy_v_ref"]
+        self.joy_v_ref = self.data["joy_v_ref"]
 
         self.logSize = self.joy_v_ref.shape[0]
 
-        self.esti_feet_status = data["esti_feet_status"]
-        self.esti_feet_goals = data["esti_feet_goals"]
-        self.esti_q_filt = data["esti_q_filt"]
-        self.esti_q_up = data["esti_q_up"]
-        self.esti_v_filt = data["esti_v_filt"]
-        self.esti_v_filt_bis = data["esti_v_filt_bis"]
-        self.esti_v_up = data["esti_v_up"]
-        self.esti_v_ref = data["esti_v_ref"]
-        self.esti_v_secu = data["esti_v_secu"]
-        self.esti_a_ref = data["esti_a_ref"]
-
-        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"]
-        self.esti_HP_alpha = data["esti_HP_alpha"]
-        self.esti_HP_filt_x = data["esti_HP_filt_x"]
-
-        self.esti_LP_x = data["esti_LP_x"]
-        self.esti_LP_dx = data["esti_LP_dx"]
-        self.esti_LP_alpha = data["esti_LP_alpha"]
-        self.esti_LP_filt_x = data["esti_LP_filt_x"]
-
-        self.loop_o_q = data["loop_o_q"]
-        self.loop_o_v = data["loop_o_v"]
-        self.loop_h_v = data["loop_h_v"]
-        self.loop_h_v_windowed = data["loop_h_v_windowed"]
-        self.loop_t_filter = data["loop_t_filter"]
-        self.loop_t_planner = data["loop_t_planner"]
-        self.loop_t_mpc = data["loop_t_mpc"]
-        self.loop_t_wbc = data["loop_t_wbc"]
-        self.loop_t_loop = data["loop_t_loop"]
-        self.loop_t_loop_if = data["loop_t_loop_if"]
-        self.loop_q_filt_mpc = data["loop_q_filt_mpc"]
-        self.loop_h_v_filt_mpc = data["loop_h_v_filt_mpc"]
-        self.loop_vref_filt_mpc = data["loop_vref_filt_mpc"]
-
-        self.planner_xref = data["planner_xref"]
-        self.planner_fsteps = data["planner_fsteps"]
-        self.planner_target_fsteps = data["planner_target_fsteps"]
-        self.planner_gait = data["planner_gait"]
-        self.planner_goals = data["planner_goals"]
-        self.planner_vgoals = data["planner_vgoals"]
-        self.planner_agoals = data["planner_agoals"]
-        self.planner_jgoals = data["planner_jgoals"]
-        self.planner_is_static = data["planner_is_static"]
-        self.planner_h_ref = data["planner_h_ref"]
-
-        self.mpc_x_f = data["mpc_x_f"]
-        self.mpc_solving_duration = data["mpc_solving_duration"]
-
-        self.wbc_P = data["wbc_P"]
-        self.wbc_D = data["wbc_D"]
-        self.wbc_q_des = data["wbc_q_des"]
-        self.wbc_v_des = data["wbc_v_des"]
-        self.wbc_FF = data["wbc_FF"]
-        self.wbc_tau_ff = data["wbc_tau_ff"]
-        self.wbc_ddq_IK = data["wbc_ddq_IK"]
-        self.wbc_f_ctc = data["wbc_f_ctc"]
-        self.wbc_ddq_QP = data["wbc_ddq_QP"]
-        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.wbc_tasks_acc = data["wbc_tasks_acc"]
-        self.wbc_tasks_vel = data["wbc_tasks_vel"]
-        self.wbc_tasks_err = data["wbc_tasks_err"]
-
-        self.tstamps = data["tstamps"]
+        self.esti_feet_status = self.data["esti_feet_status"]
+        self.esti_feet_goals = self.data["esti_feet_goals"]
+        self.esti_q_filt = self.data["esti_q_filt"]
+        self.esti_q_up = self.data["esti_q_up"]
+        self.esti_v_filt = self.data["esti_v_filt"]
+        self.esti_v_filt_bis = self.data["esti_v_filt_bis"]
+        self.esti_v_up = self.data["esti_v_up"]
+        self.esti_v_ref = self.data["esti_v_ref"]
+        self.esti_v_secu = self.data["esti_v_secu"]
+        self.esti_a_ref = self.data["esti_a_ref"]
+
+        self.esti_FK_lin_vel = self.data["esti_FK_lin_vel"]
+        self.esti_FK_xyz = self.data["esti_FK_xyz"]
+        self.esti_xyz_mean_feet = self.data["esti_xyz_mean_feet"]
+        self.esti_filt_lin_vel = self.data["esti_filt_lin_vel"]
+
+        self.esti_HP_x = self.data["esti_HP_x"]
+        self.esti_HP_dx = self.data["esti_HP_dx"]
+        self.esti_HP_alpha = self.data["esti_HP_alpha"]
+        self.esti_HP_filt_x = self.data["esti_HP_filt_x"]
+
+        self.esti_LP_x = self.data["esti_LP_x"]
+        self.esti_LP_dx = self.data["esti_LP_dx"]
+        self.esti_LP_alpha = self.data["esti_LP_alpha"]
+        self.esti_LP_filt_x = self.data["esti_LP_filt_x"]
+
+        self.loop_o_q = self.data["loop_o_q"]
+        self.loop_o_v = self.data["loop_o_v"]
+        self.loop_h_v = self.data["loop_h_v"]
+        self.loop_h_v_windowed = self.data["loop_h_v_windowed"]
+        self.loop_t_filter = self.data["loop_t_filter"]
+        self.loop_t_planner = self.data["loop_t_planner"]
+        self.loop_t_mpc = self.data["loop_t_mpc"]
+        self.loop_t_wbc = self.data["loop_t_wbc"]
+        self.loop_t_loop = self.data["loop_t_loop"]
+        self.loop_t_loop_if = self.data["loop_t_loop_if"]
+        self.loop_q_filt_mpc = self.data["loop_q_filt_mpc"]
+        self.loop_h_v_filt_mpc = self.data["loop_h_v_filt_mpc"]
+        self.loop_vref_filt_mpc = self.data["loop_vref_filt_mpc"]
+
+        self.planner_xref = self.data["planner_xref"]
+        self.planner_fsteps = self.data["planner_fsteps"]
+        self.planner_target_fsteps = self.data["planner_target_fsteps"]
+        self.planner_gait = self.data["planner_gait"]
+        self.planner_goals = self.data["planner_goals"]
+        self.planner_vgoals = self.data["planner_vgoals"]
+        self.planner_agoals = self.data["planner_agoals"]
+        self.planner_jgoals = self.data["planner_jgoals"]
+        self.planner_is_static = self.data["planner_is_static"]
+        self.planner_h_ref = self.data["planner_h_ref"]
+
+        self.mpc_x_f = self.data["mpc_x_f"]
+        self.mpc_solving_duration = self.data["mpc_solving_duration"]
+
+        self.wbc_P = self.data["wbc_P"]
+        self.wbc_D = self.data["wbc_D"]
+        self.wbc_q_des = self.data["wbc_q_des"]
+        self.wbc_v_des = self.data["wbc_v_des"]
+        self.wbc_FF = self.data["wbc_FF"]
+        self.wbc_tau_ff = self.data["wbc_tau_ff"]
+        self.wbc_ddq_IK = self.data["wbc_ddq_IK"]
+        self.wbc_f_ctc = self.data["wbc_f_ctc"]
+        self.wbc_ddq_QP = self.data["wbc_ddq_QP"]
+        self.wbc_feet_pos = self.data["wbc_feet_pos"]
+        self.wbc_feet_pos_target = self.data["wbc_feet_pos_target"]
+        self.wbc_feet_err = self.data["wbc_feet_err"]
+        self.wbc_feet_vel = self.data["wbc_feet_vel"]
+        self.wbc_feet_vel_target = self.data["wbc_feet_vel_target"]
+        self.wbc_feet_acc_target = self.data["wbc_feet_acc_target"]
+        self.wbc_tasks_acc = self.data["wbc_tasks_acc"]
+        self.wbc_tasks_vel = self.data["wbc_tasks_vel"]
+        self.wbc_tasks_err = self.data["wbc_tasks_err"]
+
+        self.tstamps = self.data["tstamps"]
 
         # Load LoggerSensors arrays
-        loggerSensors.q_mes = data["q_mes"]
-        loggerSensors.v_mes = data["v_mes"]
-        loggerSensors.baseOrientation = data["baseOrientation"]
-        loggerSensors.baseOrientationQuat = data["baseOrientationQuat"]
-        loggerSensors.baseAngularVelocity = data["baseAngularVelocity"]
-        loggerSensors.baseLinearAcceleration = data["baseLinearAcceleration"]
-        loggerSensors.baseAccelerometer = data["baseAccelerometer"]
-        loggerSensors.torquesFromCurrentMeasurment = data["torquesFromCurrentMeasurment"]
-        loggerSensors.mocapPosition = data["mocapPosition"]
-        loggerSensors.mocapVelocity = data["mocapVelocity"]
-        loggerSensors.mocapAngularVelocity = data["mocapAngularVelocity"]
-        loggerSensors.mocapOrientationMat9 = data["mocapOrientationMat9"]
-        loggerSensors.mocapOrientationQuat = data["mocapOrientationQuat"]
+        loggerSensors.q_mes = self.data["q_mes"]
+        loggerSensors.v_mes = self.data["v_mes"]
+        loggerSensors.baseOrientation = self.data["baseOrientation"]
+        loggerSensors.baseOrientationQuat = self.data["baseOrientationQuat"]
+        loggerSensors.baseAngularVelocity = self.data["baseAngularVelocity"]
+        loggerSensors.baseLinearAcceleration = self.data["baseLinearAcceleration"]
+        loggerSensors.baseAccelerometer = self.data["baseAccelerometer"]
+        loggerSensors.torquesFromCurrentMeasurment = self.data["torquesFromCurrentMeasurment"]
+        loggerSensors.mocapPosition = self.data["mocapPosition"]
+        loggerSensors.mocapVelocity = self.data["mocapVelocity"]
+        loggerSensors.mocapAngularVelocity = self.data["mocapAngularVelocity"]
+        loggerSensors.mocapOrientationMat9 = self.data["mocapOrientationMat9"]
+        loggerSensors.mocapOrientationQuat = self.data["mocapOrientationQuat"]
         loggerSensors.logSize = loggerSensors.q_mes.shape[0]
-        loggerSensors.current = data["current"]
-        loggerSensors.voltage = data["voltage"]
-        loggerSensors.energy = data["energy"]
+        loggerSensors.current = self.data["current"]
+        loggerSensors.voltage = self.data["voltage"]
+        loggerSensors.energy = self.data["energy"]
         
 
     def slider_predicted_trajectory(self):
@@ -1140,11 +1154,11 @@ if __name__ == "__main__":
     file_name = "/home/odri/data_2021_10_07_17_40.npz"
 
     # Create loggers
-    loggerSensors = LoggerSensors.LoggerSensors(logSize=20000-3)
-    logger = LoggerControl(0.001, 30, logSize=20000-3)
+    logger = LoggerControl(0.001, 30, loading=True)
+    loggerSensors = LoggerSensors.LoggerSensors(logSize=logger.logSize)
 
     # Load data from .npz file
-    logger.loadAll(loggerSensors, fileName= file_name)
+    logger.loadAll(LoggerSensors)
 
     # Call all ploting functions
     logger.plotAll(loggerSensors)
-- 
GitLab