@@ -56,6 +56,17 @@ class TestKinoID
5656 check_joint_limits ();
5757 }
5858
59+ void check_decreasing_error (std::string name, double error)
60+ {
61+ if (errors.count (name) == 0 )
62+ {
63+ errors.insert ({name, error});
64+ return ; // no further check
65+ }
66+ BOOST_CHECK_LE (error, errors.at (name)); // Perform check
67+ errors.at (name) = error; // Update value
68+ }
69+
5970protected:
6071 void check_joint_limits ()
6172 {
@@ -84,33 +95,39 @@ class TestKinoID
8495 Eigen::VectorXd dq;
8596 Eigen::VectorXd ddq;
8697 Eigen::VectorXd tau;
98+
99+ std::map<std::string, double > errors;
87100};
88101
89102BOOST_AUTO_TEST_CASE (KinodynamicsID_postureTask)
90103{
91104 TestKinoID test (getSoloHandler (), KinodynamicsID::Settings ().set_kp_posture (20 .).set_w_posture (1 .));
92- const RobotModelHandler & model_handler = test.model_handler ;
93105
94- Eigen::VectorXd error = 1e12 * Eigen::VectorXd::Ones (model_handler.getModel ().nv );
106+ // Easy access
107+ const RobotModelHandler & model_handler = test.model_handler ;
108+ const size_t nq = model_handler.getModel ().nq ;
109+ const size_t nv = model_handler.getModel ().nv ;
95110
96- const Eigen::VectorXd q_target = model_handler.getReferenceState ().head (model_handler.getModel ().nq );
111+ // Target state
112+ const Eigen::VectorXd q_target = model_handler.getReferenceState ().head (nq);
97113 test.solver .setTarget (
98- q_target, Eigen::VectorXd::Zero (model_handler.getModel ().nv ), Eigen::VectorXd::Zero (model_handler.getModel ().nv ),
99- {false , false , false , false }, {});
114+ q_target, Eigen::VectorXd::Zero (nv), Eigen::VectorXd::Zero (nv), {false , false , false , false }, {});
100115
116+ // Change initial state
117+ test.q = solo_q_start (model_handler);
101118 for (int i = 0 ; i < 10000 ; i++)
102119 {
103- // Solve and get solution
120+ // Solve
104121 test.step ();
105122
106- // compensate for free fall as we only care about joint posture
123+ // compensate for free fall as we did not set any contact (we only care about joint posture)
107124 test.q .head (7 ) = q_target.head (7 );
108125 test.dq .head (6 ).setZero ();
109126
110127 // Check error is decreasing
111- Eigen::VectorXd new_error = pinocchio::difference (model_handler.getModel (), test.q , q_target);
112- BOOST_CHECK_LE (new_error. norm (), error .norm ());
113- error = new_error ;
128+ Eigen::VectorXd delta_q = pinocchio::difference (model_handler.getModel (), test.q , q_target);
129+ const double error = delta_q. tail (nv - 6 ) .norm (); // Consider only the posture not the free flyer
130+ test. check_decreasing_error ( " posture " , error) ;
114131 }
115132}
116133
0 commit comments