From 0981fc1b0dad8c303ab143b8aca2e61e9a450edb Mon Sep 17 00:00:00 2001
From: Justin Carpentier <justin.carpentier@inria.fr>
Date: Tue, 4 Aug 2020 18:43:08 +0200
Subject: [PATCH] test/casadi: add test of RNEA and ABA derivatives

---
 unittest/casadi-algo-derivatives.cpp | 91 +++++++++++++++++++++++++---
 1 file changed, 83 insertions(+), 8 deletions(-)

diff --git a/unittest/casadi-algo-derivatives.cpp b/unittest/casadi-algo-derivatives.cpp
index fcffabc3d..d3d98e358 100644
--- a/unittest/casadi-algo-derivatives.cpp
+++ b/unittest/casadi-algo-derivatives.cpp
@@ -1,5 +1,5 @@
 //
-// Copyright (c) 2019 INRIA
+// Copyright (c) 2019-2020 INRIA
 //
 
 #include "pinocchio/autodiff/casadi.hpp"
@@ -194,6 +194,43 @@ BOOST_AUTO_TEST_CASE(test_rnea_derivatives)
   casadi::DM dtau_da_res = eval_dtau_da(casadi::DMVector {q_vec,v_int_vec,v_vec,a_vec})[0];
   std::vector<double> dtau_da_vec(static_cast< std::vector<double> >(dtau_da_res));
   BOOST_CHECK(Eigen::Map<Data::MatrixXs>(dtau_da_vec.data(),model.nv,model.nv).isApprox(dtau_da_ref));
+  
+  // call RNEA derivatives in Casadi
+  casadi::SX cs_dtau_dq(model.nv,model.nv);
+  casadi::SX cs_dtau_dv(model.nv,model.nv);
+  casadi::SX cs_dtau_da(model.nv,model.nv);
+  
+  computeRNEADerivatives(ad_model,ad_data,q_ad,v_ad,a_ad);
+  ad_data.M.triangularView<Eigen::StrictlyLower>()
+  = ad_data.M.transpose().triangularView<Eigen::StrictlyLower>();
+  
+  pinocchio::casadi::copy(ad_data.dtau_dq,cs_dtau_dq);
+  pinocchio::casadi::copy(ad_data.dtau_dv,cs_dtau_dv);
+  pinocchio::casadi::copy(ad_data.M,cs_dtau_da);
+  
+  casadi::Function eval_rnea_derivatives_dq("eval_rnea_derivatives_dq",
+                                            casadi::SXVector {cs_q, cs_v, cs_a},
+                                            casadi::SXVector {cs_dtau_dq});
+  
+  casadi::DM dtau_dq_res_direct = eval_rnea_derivatives_dq(casadi::DMVector {q_vec,v_vec,a_vec})[0];
+  Data::MatrixXs dtau_dq_res_direct_map = Eigen::Map<Data::MatrixXs>(static_cast< std::vector<double> >(dtau_dq_res_direct).data(),model.nv,model.nv);
+  BOOST_CHECK(dtau_dq_ref.isApprox(dtau_dq_res_direct_map));
+  
+  casadi::Function eval_rnea_derivatives_dv("eval_rnea_derivatives_dv",
+                                            casadi::SXVector {cs_q, cs_v, cs_a},
+                                            casadi::SXVector {cs_dtau_dv});
+  
+  casadi::DM dtau_dv_res_direct = eval_rnea_derivatives_dv(casadi::DMVector {q_vec,v_vec,a_vec})[0];
+  Data::MatrixXs dtau_dv_res_direct_map = Eigen::Map<Data::MatrixXs>(static_cast< std::vector<double> >(dtau_dv_res_direct).data(),model.nv,model.nv);
+  BOOST_CHECK(dtau_dv_ref.isApprox(dtau_dv_res_direct_map));
+  
+  casadi::Function eval_rnea_derivatives_da("eval_rnea_derivatives_da",
+                                            casadi::SXVector {cs_q, cs_v, cs_a},
+                                            casadi::SXVector {cs_dtau_da});
+  
+  casadi::DM dtau_da_res_direct = eval_rnea_derivatives_da(casadi::DMVector {q_vec,v_vec,a_vec})[0];
+  Data::MatrixXs dtau_da_res_direct_map = Eigen::Map<Data::MatrixXs>(static_cast< std::vector<double> >(dtau_da_res_direct).data(),model.nv,model.nv);
+  BOOST_CHECK(dtau_da_ref.isApprox(dtau_da_res_direct_map));
 }
   
   BOOST_AUTO_TEST_CASE(test_aba)
@@ -272,11 +309,12 @@ BOOST_AUTO_TEST_CASE(test_rnea_derivatives)
     BOOST_CHECK(ddq_mat.isApprox(data.ddq));
     
     // compute references
-    Data::MatrixXs ddq_dq_ref(model.nv,model.nv), ddq_dv_ref(model.nv,model.nv), ddq_da_ref(model.nv,model.nv);
-    ddq_dq_ref.setZero(); ddq_dv_ref.setZero(); ddq_da_ref.setZero();
+    Data::MatrixXs ddq_dq_ref(model.nv,model.nv), ddq_dv_ref(model.nv,model.nv), ddq_dtau_ref(model.nv,model.nv);
+    ddq_dq_ref.setZero(); ddq_dv_ref.setZero(); ddq_dtau_ref.setZero();
     
-    pinocchio::computeABADerivatives(model,data,q,v,tau,ddq_dq_ref,ddq_dv_ref,ddq_da_ref);
-    ddq_da_ref.triangularView<Eigen::StrictlyLower>() = ddq_da_ref.transpose().triangularView<Eigen::StrictlyLower>();
+    pinocchio::computeABADerivatives(model,data,q,v,tau,ddq_dq_ref,ddq_dv_ref,ddq_dtau_ref);
+    ddq_dtau_ref.triangularView<Eigen::StrictlyLower>()
+    = ddq_dtau_ref.transpose().triangularView<Eigen::StrictlyLower>();
     
     // check with respect to q+dq
     casadi::SX ddq_dq = jacobian(cs_ddq, cs_v_int);
@@ -304,9 +342,46 @@ BOOST_AUTO_TEST_CASE(test_rnea_derivatives)
                                   casadi::SXVector {cs_q,cs_v_int, cs_v, cs_tau},
                                   casadi::SXVector {ddq_dtau});
     
-    casadi::DM ddq_da_res = eval_ddq_da(casadi::DMVector {q_vec,v_int_vec,v_vec,tau_vec})[0];
-    std::vector<double> ddq_da_vec(static_cast< std::vector<double> >(ddq_da_res));
-    BOOST_CHECK(Eigen::Map<Data::MatrixXs>(ddq_da_vec.data(),model.nv,model.nv).isApprox(ddq_da_ref));
+    casadi::DM ddq_dtau_res = eval_ddq_da(casadi::DMVector {q_vec,v_int_vec,v_vec,tau_vec})[0];
+    std::vector<double> ddq_dtau_vec(static_cast< std::vector<double> >(ddq_dtau_res));
+    BOOST_CHECK(Eigen::Map<Data::MatrixXs>(ddq_dtau_vec.data(),model.nv,model.nv).isApprox(ddq_dtau_ref));
+    
+    // call ABA derivatives in Casadi
+    casadi::SX cs_ddq_dq(model.nv,model.nv);
+    casadi::SX cs_ddq_dv(model.nv,model.nv);
+    casadi::SX cs_ddq_dtau(model.nv,model.nv);
+    
+    computeABADerivatives(ad_model,ad_data,q_ad,v_ad,tau_ad);
+    ad_data.Minv.triangularView<Eigen::StrictlyLower>()
+    = ad_data.Minv.transpose().triangularView<Eigen::StrictlyLower>();
+    
+    pinocchio::casadi::copy(ad_data.ddq_dq,cs_ddq_dq);
+    pinocchio::casadi::copy(ad_data.ddq_dv,cs_ddq_dv);
+    pinocchio::casadi::copy(ad_data.Minv,cs_ddq_dtau);
+    
+    casadi::Function eval_aba_derivatives_dq("eval_aba_derivatives_dq",
+                                              casadi::SXVector {cs_q, cs_v, cs_tau},
+                                              casadi::SXVector {cs_ddq_dq});
+    
+    casadi::DM ddq_dq_res_direct = eval_aba_derivatives_dq(casadi::DMVector {q_vec,v_vec,tau_vec})[0];
+    Data::MatrixXs ddq_dq_res_direct_map = Eigen::Map<Data::MatrixXs>(static_cast< std::vector<double> >(ddq_dq_res_direct).data(),model.nv,model.nv);
+    BOOST_CHECK(ddq_dq_ref.isApprox(ddq_dq_res_direct_map));
+    
+    casadi::Function eval_aba_derivatives_dv("eval_aba_derivatives_dv",
+                                              casadi::SXVector {cs_q, cs_v, cs_tau},
+                                              casadi::SXVector {cs_ddq_dv});
+    
+    casadi::DM ddq_dv_res_direct = eval_aba_derivatives_dv(casadi::DMVector {q_vec,v_vec,tau_vec})[0];
+    Data::MatrixXs ddq_dv_res_direct_map = Eigen::Map<Data::MatrixXs>(static_cast< std::vector<double> >(ddq_dv_res_direct).data(),model.nv,model.nv);
+    BOOST_CHECK(ddq_dv_ref.isApprox(ddq_dv_res_direct_map));
+    
+    casadi::Function eval_aba_derivatives_dtau("eval_aba_derivatives_dtau",
+                                              casadi::SXVector {cs_q, cs_v, cs_tau},
+                                              casadi::SXVector {cs_ddq_dtau});
+    
+    casadi::DM ddq_dtau_res_direct = eval_aba_derivatives_dtau(casadi::DMVector {q_vec,v_vec,tau_vec})[0];
+    Data::MatrixXs ddq_dtau_res_direct_map = Eigen::Map<Data::MatrixXs>(static_cast< std::vector<double> >(ddq_dtau_res_direct).data(),model.nv,model.nv);
+    BOOST_CHECK(ddq_dtau_ref.isApprox(ddq_dtau_res_direct_map));
   }
 
 BOOST_AUTO_TEST_SUITE_END()
-- 
GitLab