Skip to content
Snippets Groups Projects
Commit ce49685d authored by Pierre-Alexandre Leziart's avatar Pierre-Alexandre Leziart
Browse files

Fix feet logging that was disabled since we switched to c++

parent 1a3fb37c
No related branches found
No related tags found
No related merge requests found
Pipeline #15463 failed
...@@ -35,6 +35,7 @@ public: ...@@ -35,6 +35,7 @@ public:
Matrix12 get_Jf() { return Jf_; } Matrix12 get_Jf() { return Jf_; }
int get_foot_id(int i) { return foot_ids_[i];} int get_foot_id(int i) { return foot_ids_[i];}
Matrix43 get_posf() { return posf_; } Matrix43 get_posf() { return posf_; }
Matrix43 get_vf() { return vf_; }
private: private:
// Inputs of the constructor // Inputs of the constructor
......
...@@ -152,12 +152,12 @@ public: ...@@ -152,12 +152,12 @@ public:
VectorN get_vdes() { return vdes_; } VectorN get_vdes() { return vdes_; }
VectorN get_tau_ff() { return tau_ff_; } VectorN get_tau_ff() { return tau_ff_; }
VectorN get_f_with_delta() { return f_with_delta_; } VectorN get_f_with_delta() { return f_with_delta_; }
MatrixN get_feet_pos() { return MatrixN::Zero(3, 4); } MatrixN get_feet_pos() { return invkin_->get_posf().transpose(); }
MatrixN get_feet_err() { return MatrixN::Zero(3, 4); } MatrixN get_feet_err() { return log_feet_pos_target - invkin_->get_posf().transpose(); }
MatrixN get_feet_vel() { return MatrixN::Zero(3, 4); } MatrixN get_feet_vel() { return invkin_->get_vf().transpose(); }
MatrixN get_feet_pos_target() { return MatrixN::Zero(3, 4); } MatrixN get_feet_pos_target() { return log_feet_pos_target; }
MatrixN get_feet_vel_target() { return MatrixN::Zero(3, 4); } MatrixN get_feet_vel_target() { return log_feet_vel_target; }
MatrixN get_feet_acc_target() { return MatrixN::Zero(3, 4); } MatrixN get_feet_acc_target() { return log_feet_acc_target; }
private: private:
...@@ -182,6 +182,10 @@ private: ...@@ -182,6 +182,10 @@ private:
Matrix43 posf_tmp_; // Temporary matrix to store posf_ from invkin_ Matrix43 posf_tmp_; // Temporary matrix to store posf_ from invkin_
Matrix34 log_feet_pos_target; // Store the target feet positions
Matrix34 log_feet_vel_target; // Store the target feet velocities
Matrix34 log_feet_acc_target; // Store the target feet accelerations
int k_log_; // Counter for logging purpose int k_log_; // Counter for logging purpose
int indexes_[4] = {10, 18, 26, 34}; // Indexes of feet frames in this order: [FL, FR, HL, HR] int indexes_[4] = {10, 18, 26, 34}; // Indexes of feet frames in this order: [FL, FR, HL, HR]
}; };
......
...@@ -3,8 +3,8 @@ ...@@ -3,8 +3,8 @@
import numpy as np import numpy as np
import libquadruped_reactive_walking as MPC import libquadruped_reactive_walking as MPC
from multiprocessing import Process, Value, Array from multiprocessing import Process, Value, Array
# import crocoddyl_class.MPC_crocoddyl as MPC_crocoddyl import crocoddyl_class.MPC_crocoddyl as MPC_crocoddyl
# import crocoddyl_class.MPC_crocoddyl_planner as MPC_crocoddyl_planner import crocoddyl_class.MPC_crocoddyl_planner as MPC_crocoddyl_planner
import pinocchio as pin import pinocchio as pin
class Dummy: class Dummy:
...@@ -38,7 +38,6 @@ class MPC_Wrapper: ...@@ -38,7 +38,6 @@ class MPC_Wrapper:
self.not_first_iter = False self.not_first_iter = False
self.params = params self.params = params
self.testoui = True
# Number of WBC steps for 1 step of the MPC # Number of WBC steps for 1 step of the MPC
self.k_mpc = int(params.dt_mpc/params.dt_wbc) self.k_mpc = int(params.dt_mpc/params.dt_wbc)
...@@ -47,7 +46,9 @@ class MPC_Wrapper: ...@@ -47,7 +46,9 @@ class MPC_Wrapper:
self.n_steps = np.int(params.T_mpc/params.dt_mpc) self.n_steps = np.int(params.T_mpc/params.dt_mpc)
self.T_gait = params.T_gait self.T_gait = params.T_gait
self.N_gait = params.N_gait self.N_gait = params.N_gait
self.gait_memory = np.zeros(4) self.gait_past = np.zeros(4)
self.gait_next = np.zeros(4)
self.mass = params.mass
self.mpc_type = params.type_MPC self.mpc_type = params.type_MPC
self.multiprocessing = params.enable_multiprocessing self.multiprocessing = params.enable_multiprocessing
...@@ -100,21 +101,19 @@ class MPC_Wrapper: ...@@ -100,21 +101,19 @@ class MPC_Wrapper:
else: # Run in the same process than main loop else: # Run in the same process than main loop
self.run_MPC_synchronous(k, xref, fsteps, l_targetFootstep) self.run_MPC_synchronous(k, xref, fsteps, l_targetFootstep)
if k > 2: if not np.allclose(gait[0, :], self.gait_past): # If gait status has changed
self.last_available_result[12:(12+self.n_steps), :] = np.roll(self.last_available_result[12:(12+self.n_steps), :], -1, axis=1) if np.allclose(gait[0, :], self.gait_next): # If we're still doing what was planned the last time MPC was solved
self.testoui = False self.last_available_result[12:24, 0] = self.last_available_result[12:24, 1].copy()
else: # Otherwise use a default contact force command till we get the actual result of the MPC for this new sequence
pt = 0 F = 9.81 * self.mass / np.sum(gait[0, :])
while (np.any(gait[pt, :])): self.last_available_result[12:24:3, 0] = 0.0
pt += 1 self.last_available_result[13:24:3, 0] = 0.0
if k > 2 and not np.array_equal(gait[0, :], gait[pt-1, :]): self.last_available_result[14:24:3, 0] = F
mass = 2.5 # TODO: grab from URDF?
nb_ctc = np.sum(gait[pt-1, :]) self.last_available_result[12:24, 1:] = 0.0
F = 9.81 * mass / nb_ctc self.gait_past = gait[0, :].copy()
self.last_available_result[12:24, self.n_steps-1] = np.zeros(12)
for i in range(4): self.gait_next = gait[1, :].copy()
if (gait[pt-1, i] == 1):
self.last_available_result[12+3*i+2, self.n_steps-1] = F
return 0 return 0
......
...@@ -562,6 +562,9 @@ WbcWrapper::WbcWrapper() ...@@ -562,6 +562,9 @@ WbcWrapper::WbcWrapper()
, f_with_delta_(Vector12::Zero()) , f_with_delta_(Vector12::Zero())
, ddq_with_delta_(Vector18::Zero()) , ddq_with_delta_(Vector18::Zero())
, posf_tmp_(Matrix43::Zero()) , posf_tmp_(Matrix43::Zero())
, log_feet_pos_target(Matrix34::Zero())
, log_feet_vel_target(Matrix34::Zero())
, log_feet_acc_target(Matrix34::Zero())
, k_log_(0) , k_log_(0)
{} {}
...@@ -610,6 +613,11 @@ void WbcWrapper::compute(VectorN const& q, VectorN const& dq, MatrixN const& f_c ...@@ -610,6 +613,11 @@ void WbcWrapper::compute(VectorN const& q, VectorN const& dq, MatrixN const& f_c
k_since_contact_ += contacts; // Increment feet in stance phase k_since_contact_ += contacts; // Increment feet in stance phase
k_since_contact_ = k_since_contact_.cwiseProduct(contacts); // Reset feet in swing phase k_since_contact_ = k_since_contact_.cwiseProduct(contacts); // Reset feet in swing phase
// Store target positions, velocities and acceleration for logging purpose
log_feet_pos_target = pgoals;
log_feet_vel_target = vgoals;
log_feet_acc_target = agoals;
// Compute Inverse Kinematics // Compute Inverse Kinematics
invkin_->run_InvKin(q.tail(12), dq.tail(12), contacts, pgoals.transpose(), vgoals.transpose(), agoals.transpose()); invkin_->run_InvKin(q.tail(12), dq.tail(12), contacts, pgoals.transpose(), vgoals.transpose(), agoals.transpose());
ddq_cmd_.tail(12) = invkin_->get_ddq_cmd(); ddq_cmd_.tail(12) = invkin_->get_ddq_cmd();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment