Skip to content

Commit 2d8dfd3

Browse files
author
earlaud
committed
Add contacts and base costs
1 parent 71c6cbf commit 2d8dfd3

File tree

2 files changed

+54
-8
lines changed

2 files changed

+54
-8
lines changed

include/simple-mpc/inverse-dynamics.hpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,15 @@ namespace simple_mpc
3838
0.01) // Min force for one foot contact (express as a multiple of the robot weight)
3939

4040
// Tasks gains
41-
DEFINE_FIELD(double, kp_posture, 1.0)
42-
DEFINE_FIELD(double, kp_base, 0.0)
43-
DEFINE_FIELD(double, kp_contact, 0.0)
41+
DEFINE_FIELD(double, kp_posture, 10.0)
42+
DEFINE_FIELD(double, kp_base, 10.0)
43+
DEFINE_FIELD(double, kp_contact, 10.0)
4444

4545
// Tasks weights
46-
DEFINE_FIELD(double, w_posture, 1e2)
47-
DEFINE_FIELD(double, w_base, 0.)
48-
DEFINE_FIELD(double, w_contact_force, 0.)
49-
DEFINE_FIELD(double, w_contact_motion, 0.)
46+
DEFINE_FIELD(double, w_posture, 10)
47+
DEFINE_FIELD(double, w_base, 10)
48+
DEFINE_FIELD(double, w_contact_force, 10)
49+
DEFINE_FIELD(double, w_contact_motion, 10)
5050

5151
static Settings Default()
5252
{

tests/inverse_dynamics.cpp

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ BOOST_AUTO_TEST_CASE(KinodynamicsID_postureTask)
2222

2323
solver.setTarget(
2424
q_target, Eigen::VectorXd::Zero(model_handler.getModel().nv), Eigen::VectorXd::Zero(model_handler.getModel().nv),
25-
{true, true, true, true}, Eigen::VectorXd::Zero(4 * 3));
25+
{false, false, false, false}, Eigen::VectorXd::Zero(4 * 3));
2626

2727
double t = 0;
2828
double dt = 1e-3;
@@ -56,4 +56,50 @@ BOOST_AUTO_TEST_CASE(KinodynamicsID_postureTask)
5656
}
5757
}
5858

59+
BOOST_AUTO_TEST_CASE(KinodynamicsID_allTasks)
60+
{
61+
RobotModelHandler model_handler = getSoloHandler();
62+
RobotDataHandler data_handler(model_handler);
63+
64+
KinodynamicsID solver(model_handler, KinodynamicsID::Settings::Default());
65+
66+
const Eigen::VectorXd q_target = model_handler.getReferenceState().head(model_handler.getModel().nq);
67+
Eigen::VectorXd f_target = Eigen::VectorXd::Zero(4 * 3);
68+
f_target[2] = model_handler.getMass() * 9.81 / 4;
69+
f_target[5] = model_handler.getMass() * 9.81 / 4;
70+
f_target[8] = model_handler.getMass() * 9.81 / 4;
71+
f_target[11] = model_handler.getMass() * 9.81 / 4;
72+
73+
solver.setTarget(
74+
q_target, Eigen::VectorXd::Zero(model_handler.getModel().nv), Eigen::VectorXd::Zero(model_handler.getModel().nv),
75+
{true, true, true, true}, f_target);
76+
77+
double t = 0;
78+
double dt = 1e-3;
79+
Eigen::VectorXd q = pinocchio::randomConfiguration(model_handler.getModel());
80+
q.head(7) = q_target.head(7);
81+
Eigen::VectorXd v = Eigen::VectorXd::Random(model_handler.getModel().nv);
82+
Eigen::VectorXd a = Eigen::VectorXd::Random(model_handler.getModel().nv);
83+
Eigen::VectorXd tau = Eigen::VectorXd::Zero(model_handler.getModel().nv - 6);
84+
85+
Eigen::VectorXd error = 1e12 * Eigen::VectorXd::Ones(model_handler.getModel().nv);
86+
87+
for (int i = 0; i < 1000; i++)
88+
{
89+
// Solve and get solution
90+
solver.solve(t, q, v, tau);
91+
a = solver.getAccelerations();
92+
93+
// Integrate
94+
t += dt;
95+
q = pinocchio::integrate(model_handler.getModel(), q, (v + a / 2. * dt) * dt);
96+
v += a * dt;
97+
98+
// Check error is decreasing
99+
Eigen::VectorXd new_error = pinocchio::difference(model_handler.getModel(), q, q_target);
100+
BOOST_CHECK_LE(new_error.norm(), error.norm());
101+
error = new_error;
102+
}
103+
}
104+
59105
BOOST_AUTO_TEST_SUITE_END()

0 commit comments

Comments
 (0)