diff --git a/scripts/Controller.py b/scripts/Controller.py index 436b35f0cad7d1d699ae00905435b99f2c7646cc..b615d0cab4f66a9a45f8f2517959e927f3cf212f 100644 --- a/scripts/Controller.py +++ b/scripts/Controller.py @@ -264,7 +264,7 @@ class Controller: self.result.D = 0.2 * np.ones(12) self.result.q_des[:] = self.myController.qdes[7:] self.result.v_des[:] = self.myController.vdes[6:, 0] - self.result.tau_ff[:] = 0.0 * self.myController.tau_ff + self.result.tau_ff[:] = 0.5 * self.myController.tau_ff """if self.k % 5 == 0: self.solo.display(self.q) diff --git a/scripts/Estimator.py b/scripts/Estimator.py index 4470a35db53fcc19d36cd066d1c44ddc775b0e28..78087c33ac6848f5cd5b5014fff8745940d87d0e 100644 --- a/scripts/Estimator.py +++ b/scripts/Estimator.py @@ -250,7 +250,7 @@ class Estimator: fc = 50.0 # Cut frequency y = 1 - np.cos(2*np.pi*fc*dt) self.alpha_v = -y+np.sqrt(y*y+2*y) - self.alpha_v = 1.0 # TOREMOVE + # self.alpha_v = 1.0 # TOREMOVE # Filtering velocities used for security checks fc = 6.0 @@ -493,13 +493,15 @@ class Estimator: a = np.ceil(np.max(self.k_since_contact)/10) - 1 b = remaining_steps n = 1 # Nb of steps of margin around contact switch - v = 0.97 # Minimum alpha value + + v_max = 1.00 + v_min = 0.97 # Minimum alpha value c = ((a + b) - 2 * n) * 0.5 if (a <= (n-1)) or (b <= n): # If we are close from contact switch - self.alpha = 1.0 # Only trust IMU data + self.alpha = v_max # Only trust IMU data self.close_from_contact = True # Raise flag else: - self.alpha = v + (1 - v) * np.abs(c - (a - n)) / c + self.alpha = v_min + (v_max - v_min) * np.abs(c - (a - n)) / c #self.alpha = 0.997 self.close_from_contact = False # Lower flag @@ -534,7 +536,7 @@ class Estimator: # Position of the center of the base from FGeometry and filtered velocity (world frame) self.filt_lin_pos[:] = self.filter_xyz_pos.compute( - self.FK_xyz[:] + self.xyz_mean_feet[:], ob_filt_lin_vel, alpha=0.995) + self.FK_xyz[:] + self.xyz_mean_feet[:], ob_filt_lin_vel, alpha=np.array([0.995, 0.995, 0.9])) # Velocity of the center of the base (base frame) self.filt_lin_vel[:] = b_filt_lin_vel diff --git a/scripts/Joystick.py b/scripts/Joystick.py index 25a2e851ba98e89e91c9220b0640cca4ae694eef..07932ae7d344b60db473bd7a498fc4939595a2b9 100644 --- a/scripts/Joystick.py +++ b/scripts/Joystick.py @@ -39,7 +39,7 @@ class Joystick: self.vX = 0. self.vY = 0. self.vYaw = 0. - self.VxScale = 0.8 + self.VxScale = 0.6 self.VyScale = 1.2 self.vYawScale = 1.6 @@ -205,7 +205,7 @@ class Joystick: -0.3, 0.0]) elif velID == 2: self.k_switch = np.array([0, 10000, 20000, 30000]) - self.v_switch = np.array([[0.0, 1.5, 0.0, 0.0], + self.v_switch = np.array([[0.0, 0.5, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0], diff --git a/scripts/LoggerControl.py b/scripts/LoggerControl.py index a0cda5a0233f168b9b631c34ee2f5497ecf03976..79fd689d627f5169e9c5754aa645698cfc69e8a3 100644 --- a/scripts/LoggerControl.py +++ b/scripts/LoggerControl.py @@ -439,6 +439,48 @@ class LoggerControl(): plt.ylim([-1.0, 26.0]) plt.suptitle("Contact forces trajectories & Actual forces trajectories") + # Analysis of the complementary filter behaviour + clr = ["b", "darkred", "forestgreen"] + # Velocity complementary filter + lgd_Y = ["dx", "ddx", "alpha dx", "dx_out", "dy", "ddy", "alpha dy", "dy_out", "dz", "ddz", "alpha dz", "dz_out"] + plt.figure() + for i in range(12): + if i == 0: + ax0 = plt.subplot(3, 4, i+1) + else: + plt.subplot(3, 4, i+1, sharex=ax0) + if i % 4 == 0: + plt.plot(t_range, self.esti_HP_x[:, int(i/4)], color=clr[int(i/4)], linewidth=3, marker='') # x input of the velocity complementary filter + elif i % 4 == 1: + plt.plot(t_range, self.esti_HP_dx[:, int(i/4)], color=clr[int(i/4)], linewidth=3, marker='') # dx input of the velocity complementary filter + elif i % 4 == 2: + plt.plot(t_range, self.esti_HP_alpha[:, int(i/4)], color=clr[int(i/4)], linewidth=3, marker='') # alpha parameter of the velocity complementary filter + else: + plt.plot(t_range, self.esti_HP_filt_x[:, int(i/4)], color=clr[int(i/4)], linewidth=3, marker='') # filtered output of the velocity complementary filter + + plt.legend([lgd_Y[i]], prop={'size': 8}) + plt.suptitle("Evolution of the quantities of the velocity complementary filter") + + # Position complementary filter + lgd_Y = ["x", "dx", "alpha x", "x_out", "y", "dy", "alpha y", "y_out", "z", "dz", "alpha z", "z_out"] + plt.figure() + for i in range(12): + if i == 0: + ax0 = plt.subplot(3, 4, i+1) + else: + plt.subplot(3, 4, i+1, sharex=ax0) + if i % 4 == 0: + plt.plot(t_range, self.esti_LP_x[:, int(i/4)], color=clr[int(i/4)], linewidth=3, marker='') # x input of the position complementary filter + elif i % 4 == 1: + plt.plot(t_range, self.esti_LP_dx[:, int(i/4)], color=clr[int(i/4)], linewidth=3, marker='') # dx input of the position complementary filter + elif i % 4 == 2: + plt.plot(t_range, self.esti_LP_alpha[:, int(i/4)], color=clr[int(i/4)], linewidth=3, marker='') # alpha parameter of the position complementary filter + else: + plt.plot(t_range, self.esti_LP_filt_x[:, int(i/4)], color=clr[int(i/4)], linewidth=3, marker='') # filtered output of the position complementary filter + + plt.legend([lgd_Y[i]], prop={'size': 8}) + plt.suptitle("Evolution of the quantities of the position complementary filter") + plt.show(block=True) from IPython import embed diff --git a/scripts/main_solo12_control.py b/scripts/main_solo12_control.py index 9486929451fa6d999d046de0ad24b521c36eef67..6af4f5304bedaea9523503e7c09cee8aab45ceb0 100644 --- a/scripts/main_solo12_control.py +++ b/scripts/main_solo12_control.py @@ -15,7 +15,7 @@ from LoggerControl import LoggerControl SIMULATION = False -LOGGING = True +LOGGING = False PLOTTING = False if SIMULATION: @@ -106,7 +106,7 @@ def control_loop(name_interface, name_interface_clone=None): ################################ envID = 0 # Identifier of the environment to choose in which one the simulation will happen - velID = 2 # Identifier of the reference velocity profile to choose which one will be sent to the robot + velID = 0 # Identifier of the reference velocity profile to choose which one will be sent to the robot dt_wbc = DT # Time step of the whole body control dt_mpc = 0.02 # Time step of the model predictive control @@ -114,7 +114,7 @@ def control_loop(name_interface, name_interface_clone=None): t = 0.0 # Time T_gait = 0.32 # Duration of one gait period T_mpc = 0.32 # Duration of the prediction horizon - N_SIMULATION = 5000 # number of simulated wbc time steps + N_SIMULATION = 12000 # number of simulated wbc time steps # Which MPC solver you want to use # True to have PA's MPC, to False to have Thomas's MPC @@ -224,7 +224,7 @@ def control_loop(name_interface, name_interface_clone=None): # Send command to the robot for i in range(1): device.SendCommand(WaitEndOfCycle=True) - """if ((device.cpt % 1000) == 0): + """if ((device.cpt % 100) == 0): device.Print()""" """import os