@@ -60,6 +60,45 @@ BOOST_AUTO_TEST_CASE(interpolate)
6060 interpolator.interpolateConfiguration (delay, timestep, qs2, q_interp);
6161 BOOST_CHECK (qs2[0 ].isApprox (q_interp));
6262
63+ // Test state interpolation method
64+ std::vector<Eigen::VectorXd> xs;
65+ for (std::size_t i = 0 ; i < 4 ; i++)
66+ {
67+ Eigen::VectorXd x0 (model.nq + model.nv );
68+ x0.head (model.nq ) = pinocchio::neutral (model);
69+ Eigen::VectorXd dq (model.nv );
70+ dq.setRandom ();
71+ pinocchio::integrate (model, x0.head (model.nq ), dq, x0.head (model.nq ));
72+ x0.tail (model.nv ).setRandom ();
73+
74+ xs.push_back (x0);
75+ }
76+ delay = 0.02 ;
77+
78+ Eigen::VectorXd x_interp (model.nq + model.nv );
79+ interpolator.interpolateState (delay, timestep, xs, x_interp);
80+ BOOST_CHECK (xs[2 ].isApprox (x_interp));
81+
82+ delay = 0.5 ;
83+ interpolator.interpolateState (delay, timestep, xs, x_interp);
84+ BOOST_CHECK (xs.back ().isApprox (x_interp));
85+
86+ delay = 0.005 ;
87+ interpolator.interpolateState (delay, timestep, xs, x_interp);
88+ Eigen::VectorXd x_interp2 (model.nq + model.nv );
89+ pinocchio::difference (model, xs[0 ].head (model.nq ), xs[1 ].head (model.nq ), dq);
90+ pinocchio::integrate (model, xs[0 ].head (model.nq ), dq * 0.5 , x_interp2.head (model.nq ));
91+ x_interp2.tail (model.nv ) = (xs[0 ].tail (model.nv ) + xs[1 ].tail (model.nv )) * 0.5 ;
92+ BOOST_CHECK (x_interp2.isApprox (x_interp));
93+
94+ std::vector<Eigen::VectorXd> xs2;
95+ for (std::size_t i = 0 ; i < 2 ; i++)
96+ {
97+ xs2.push_back (xs[0 ]);
98+ }
99+ interpolator.interpolateState (delay, timestep, xs2, x_interp);
100+ BOOST_CHECK (xs2[0 ].isApprox (x_interp));
101+
63102 // Test linear interpolation method
64103 std::vector<Eigen::VectorXd> vs;
65104 for (std::size_t i = 0 ; i < 4 ; i++)
0 commit comments