diff --git a/python/quadruped_reactive_walking/Controller.py b/python/quadruped_reactive_walking/Controller.py index e07c02c02d3ba4ba9ae6a7618c9139e84a4e2c43..f24078183465e694224ac25c909edabcb2bdaf98 100644 --- a/python/quadruped_reactive_walking/Controller.py +++ b/python/quadruped_reactive_walking/Controller.py @@ -120,7 +120,7 @@ class Controller: self.mpc_result, self.mpc_cost = self.mpc.get_latest_result() # self.result.P = np.array(self.params.Kp_main.tolist() * 4) - self.result.P = np.array([5] * 3 + [1] * 3 + [5] * 6) + self.result.P = np.array([1] * 3 + [1] * 3 + [1] * 6) # self.result.D = np.array(self.params.Kd_main.tolist() * 4) self.result.D = np.array([0.3] * 3 + [0.01] * 3 + [0.3] * 6) tauFF = self.mpc_result.u[0] diff --git a/python/quadruped_reactive_walking/main_solo12_control.py b/python/quadruped_reactive_walking/main_solo12_control.py index 48750714cd5c07a509810bfd5094631b5dc956b3..51b8c0c5cbd08d46d82b28a9839b4028c388bb81 100644 --- a/python/quadruped_reactive_walking/main_solo12_control.py +++ b/python/quadruped_reactive_walking/main_solo12_control.py @@ -111,7 +111,7 @@ def damp_control(device, nb_motors): device.joints.set_velocity_gains(0.1 * np.ones(nb_motors)) device.joints.set_desired_positions(np.zeros(nb_motors)) device.joints.set_desired_velocities(np.zeros(nb_motors)) - # device.joints.set_torques(np.zeros(nb_motors)) + device.joints.set_torques(np.zeros(nb_motors)) # Send command to the robot device.send_command_and_wait_end_of_cycle(params.dt_wbc) diff --git a/python/quadruped_reactive_walking/tools/LoggerControl.py b/python/quadruped_reactive_walking/tools/LoggerControl.py index 9f4833db9630f5e17e8c4172621b533143be1ec0..d52de1590f9e1fca60ecc13442af4c1a554a9da3 100644 --- a/python/quadruped_reactive_walking/tools/LoggerControl.py +++ b/python/quadruped_reactive_walking/tools/LoggerControl.py @@ -63,6 +63,9 @@ class LoggerControl: "xs": np.zeros([size, pd.T + 1, pd.nx]), "us": np.zeros([size, pd.T, pd.nu]), } + self.MPC_equivalent_Kp = np.zeros([size, 3]) + self.MPC_equivalent_Kd = np.zeros([size, 3]) + self.K = np.zeros([size, 3, 6]) self.target = np.zeros([size, 3]) # Whole body control @@ -112,6 +115,10 @@ class LoggerControl: self.ocp_storage["xs"][self.i] = np.array(controller.mpc.ocp.results.x) self.ocp_storage["us"][self.i] = np.array(controller.mpc.ocp.results.u) + self.MPC_equivalent_Kp[self.i] = controller.mpc.ocp.results.K[0].diagonal() + self.MPC_equivalent_Kd[self.i] = controller.mpc.ocp.results.K[0].diagonal(3) + self.K[self.i] = controller.mpc.ocp.results.K[0] + self.t_measures[self.i] = controller.t_measures self.t_mpc[self.i] = controller.t_mpc self.t_send[self.i] = controller.t_send @@ -234,6 +241,7 @@ class LoggerControl: if save: plt.savefig(fileName + "/joint_torques") + # Target plot legend = ["x", "y", "z"] plt.figure(figsize=(12, 18), dpi = 90) for p in range(3): @@ -246,6 +254,29 @@ class LoggerControl: if save: plt.savefig(fileName + "/target") + # Equivalent Stiffness Damping plots + legend = ["Hip", "Shoulder", "Knee"] + plt.figure(figsize=(12, 18), dpi = 90) + for p in range(3): + plt.subplot(3,1, p+1) + plt.title('Joint: ' + legend[p]) + plt.plot(self.MPC_equivalent_Kp[:, p]) + plt.plot(self.MPC_equivalent_Kd[:, p]) + plt.legend(["Stiffness", "Damping"]) + plt.ylabel("Gains") + plt.xlabel("t") + if save: + plt.savefig(fileName + "/diagonal_Riccati_gains") + + # Riccati gains + plt.figure(figsize=(12, 18), dpi = 90) + i = 0 + plt.title("Riccati gains at step: " + str(i)) + plt.imshow(self.K[i]) + plt.colorbar() + if save: + plt.savefig(fileName + "/Riccati_gains") + self.plot_controller_times() # self.plot_OCP_times() # self.plot_OCP_update_times() @@ -312,6 +343,9 @@ class LoggerControl: np.savez_compressed( name, ocp_storage=self.ocp_storage, + MPC_equivalent_Kp = self.MPC_equivalent_Kp, + MPC_equivalent_Kd = self.MPC_equivalent_Kd, + K = self.K, t_measures=self.t_measures, t_mpc=self.t_mpc, t_send=self.t_send, @@ -382,6 +416,9 @@ class LoggerControl: self.t_measures = self.data["t_meausres"] self.ocp_storage = self.data["ocp_storage"].item() + self.MPC_equivalent_Kp = self.data["self.MPC_equivalent_Kp"] + self.MPC_equivalent_Kd = self.data["self.MPC_equivalent_Kd"] + self.K = self.data["K"] self.t_measures = self.data["t_measures"] self.t_mpc = self.data["t_mpc"]