@@ -135,6 +135,54 @@ BOOST_AUTO_TEST_CASE(KinodynamicsID_contact)
135135 }
136136}
137137
138+ BOOST_AUTO_TEST_CASE (KinodynamicsID_baseTask)
139+ {
140+ RobotModelHandler model_handler = getSoloHandler ();
141+ RobotDataHandler data_handler (model_handler);
142+
143+ KinodynamicsID solver (
144+ model_handler, KinodynamicsID::Settings ()
145+ .set_kp_base (7 .)
146+ .set_kp_contact (10.0 )
147+ .set_w_base (100.0 )
148+ .set_w_contact_force (1.0 )
149+ .set_w_contact_motion (1.0 ));
150+
151+ // No need to set target as KinodynamicsID sets it by default to reference state
152+ const Eigen::VectorXd q_target = model_handler.getReferenceState ().head (model_handler.getModel ().nq );
153+
154+ double t = 0 ;
155+ double dt = 1e-3 ;
156+ Eigen::VectorXd q = solo_q_start (model_handler);
157+ Eigen::VectorXd v = Eigen::VectorXd::Random (model_handler.getModel ().nv );
158+ Eigen::VectorXd a = Eigen::VectorXd::Random (model_handler.getModel ().nv );
159+ Eigen::VectorXd tau = Eigen::VectorXd::Zero (model_handler.getModel ().nv - 6 );
160+
161+ Eigen::VectorXd error = 1e12 * Eigen::VectorXd::Ones (6 );
162+ const int N_STEP = 10000 ;
163+ for (int i = 0 ; i < N_STEP; i++)
164+ {
165+ // Solve and get solution
166+ solver.solve (t, q, v, tau);
167+ a = solver.getAccelerations ();
168+
169+ // Integrate
170+ t += dt;
171+ q = pinocchio::integrate (model_handler.getModel (), q, (v + a / 2 . * dt) * dt);
172+ v += a * dt;
173+
174+ // Check error is decreasing
175+ Eigen::VectorXd new_error = pinocchio::difference (model_handler.getModel (), q, q_target).head (6 );
176+ if (i > N_STEP / 10 ) // Weird transitional phenomenon at first ...
177+ BOOST_CHECK (
178+ new_error.norm () < error.norm () || new_error.norm () < 2e-2 ); // Either strictly decreasing or close to target
179+ if (i > 9 * N_STEP / 10 )
180+ BOOST_CHECK (new_error.norm () < 2e-2 ); // Should have converged by now
181+
182+ error = new_error;
183+ }
184+ }
185+
138186BOOST_AUTO_TEST_CASE (KinodynamicsID_allTasks)
139187{
140188 RobotModelHandler model_handler = getSoloHandler ();
0 commit comments