diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt deleted file mode 100644 index 94594a3fc2262a4977922c7ff90292dfcf2ece62..0000000000000000000000000000000000000000 --- a/test/CMakeLists.txt +++ /dev/null @@ -1,38 +0,0 @@ -cmake_minimum_required(VERSION 3.10) -project(ImpedanceController) - -# Set C++ standard -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED True) - -# Find required packages -find_package(catkin REQUIRED COMPONENTS roscpp) -find_package(pinocchio REQUIRED) -find_package(casadi REQUIRED) - -# Include directories -include_directories( - include - ${catkin_INCLUDE_DIRS} -) - -# Add source files -# add_executable(pin_test interpolation-SE3.cpp) -add_executable(autodiff_test - # casadi-crnea.cpp - dynamics-autodiff-test.cpp - # inverse_kinematics_test.cpp -) - -# Link libraries -# target_link_libraries(pin_test -# ${catkin_LIBRARIES} -# pinocchio::pinocchio -# casadi -# ) - -target_link_libraries(autodiff_test - ${catkin_LIBRARIES} - pinocchio::pinocchio - casadi -) diff --git a/test/dynamics-autodiff-test.cpp b/test/dynamics-autodiff-test.cpp deleted file mode 100644 index 6b018e45eff73afdba21ed64051967ace59b337b..0000000000000000000000000000000000000000 --- a/test/dynamics-autodiff-test.cpp +++ /dev/null @@ -1,243 +0,0 @@ -#include "pinocchio/autodiff/casadi.hpp" - -#include "pinocchio/algorithm/aba.hpp" // joint acceleration, Minverse -#include "pinocchio/algorithm/crba.hpp" // joint-space inertia (upper-triangle) -#include "pinocchio/algorithm/jacobian.hpp" // Jacobian -#include "pinocchio/algorithm/joint-configuration.hpp" -#include "pinocchio/algorithm/kinematics.hpp" -#include "pinocchio/algorithm/rnea.hpp" // Coriolis, gravity, joint torque - -#include "pinocchio/parsers/urdf.hpp" - -#include <iostream> - -int main(int argc, char ** argv) -{ - using namespace pinocchio; - - //* typedef for CasADi Auto-Diff *// - typedef double Scalar; - typedef ::casadi::SX ADScalar; - - typedef ModelTpl<Scalar> Model; - typedef Model::Data Data; - - typedef ModelTpl<ADScalar> ADModel; - typedef ADModel::Data ADData; - - typedef ADModel::ConfigVectorType ConfigVectorAD; - typedef ADModel::TangentVectorType TangentVectorAD; - - //* load Franka Research 3 URDF file *// - const std::string urdf_filename = std::string("../model/fr3.urdf"); - - Model model; - pinocchio::urdf::buildModel(urdf_filename, model); - // std::cout << "model name: " << model.name << std::endl; - Data data(model); - - // set end-effector's ID (joint 8) - const std::string ee_name = "fr_joint8"; - JointIndex ee_joint_id = model.getJointId(ee_name); - if (ee_joint_id == 0) - { - std::cerr << "Invalid joint ID for end-effector: " << ee_name << std::endl; - return -1; - } - else - { - std::cout << "End-effector ID: " << ee_joint_id << std::endl; // 8 - } - - //* Pick up random configuration, velocity and acceleration vectors. *// - Eigen::VectorXd q = randomConfiguration(model); - Eigen::VectorXd v(Eigen::VectorXd::Random(model.nv)); - Eigen::VectorXd a(Eigen::VectorXd::Random(model.nv)); - - std::cout << "q: " << q.transpose() << std::endl; - std::cout << "v: " << v.transpose() << std::endl; - std::cout << "a: " << a.transpose() << std::endl << std::endl; - - //* Create CasADi model and data from Pinocchio model *// - ADModel ad_model = model.cast<ADScalar>(); - ADData ad_data(ad_model); - - //* Create symbolic CasADi vectors & Matices *// - // joint configuration - ::casadi::SX cs_q = ::casadi::SX::sym("q", model.nq); - ConfigVectorAD q_ad(model.nq); - q_ad = Eigen::Map<ConfigVectorAD>(static_cast<std::vector<ADScalar>>(cs_q).data(), model.nq, 1); - - // joint velocity - ::casadi::SX cs_v = ::casadi::SX::sym("v", model.nv); - TangentVectorAD v_ad(model.nv); - v_ad = Eigen::Map<TangentVectorAD>(static_cast<std::vector<ADScalar>>(cs_v).data(), model.nv, 1); - - // joint acceleration - ::casadi::SX cs_a = ::casadi::SX::sym("a", model.nv); - TangentVectorAD a_ad(model.nv); - a_ad = Eigen::Map<TangentVectorAD>(static_cast<std::vector<ADScalar>>(cs_a).data(), model.nv, 1); - - // Upper-triangular Mass Matrix - ::casadi::SX cs_M = ::casadi::SX::zeros(model.nv, model.nv); - // ::casadi::SX cs_M_dot = ::casadi::SX::zeros(model.nv, model.nv); - ::casadi::SX cs_Minv = ::casadi::SX::zeros(model.nv, model.nv); - ::casadi::SX cs_Minv_dot = ::casadi::SX::zeros(model.nv, model.nv); - - // end-effector Jacobian Matrix - ::casadi::SX cs_J = ::casadi::SX::zeros(6, model.nv); - ::casadi::SX cs_J_dot = ::casadi::SX::zeros(6, model.nv); - - //* Create CasADi "symbolic" function *// - /* forward kinematics */ - // "Numerical" forward kinematics - // ! joint : universe, joint1, joint2, ... joint7 => selecting joint8 would cause segmentation - // error pinocchio::forwardKinematics(model, data, q); for (JointIndex joint_id = 0; joint_id < - // (JointIndex) model.njoints; ++joint_id) - // { - // std::cout << std::setw(24) << std::left - // << model.names[joint_id] << ": " - // << std::fixed << std::setprecision(2) - // << data.oMi[joint_id].translation().transpose() - // << std::endl; - // } - - // "Symbolic" forward kinematics - // pinocchio::forwardKinematics(ad_model, ad_data, q_ad); - // for (JointIndex joint_id = 0; joint_id < (JointIndex) ad_model.njoints; ++joint_id) - // { - // std::cout << std::setw(24) << std::left - // << ad_model.names[joint_id] << ": " - // << std::fixed << std::setprecision(2) - // << ad_data.oMi[joint_id].translation().transpose() - // << std::endl; - // } - - /* CRBA algorithm : compute Mass Matrix */ - pinocchio::crba(ad_model, ad_data, q_ad); - for (int i = 0; i < model.nv; ++i) - { - for (int j = 0; j < model.nv; ++j) - { - cs_M(i, j) = ad_data.M(i, j); // copy symbolic M(q) into CasADi matrix - } - } - // std::cout << "Symbolic mass matrix:\n" << cs_M << std::endl; - - // derivative of M w.r.t time - // for (int i = 0; i < model.nv; ++i) - // { - // for (int j = 0; j < model.nv; ++j) - // { - // ::casadi::SX dMij_dq = jacobian(cs_M(i,j), cs_q); // extract derivative of M[i, j] w.r.t - // all q cs_M_dot(i, j) = mtimes(dMij_dq, cs_v); // multiply by v and sum over nq - // } - // } - - /* compute derivative of Inverse Mass Matrix */ - pinocchio::computeMinverse(ad_model, ad_data, q_ad); - for (int i = 0; i < model.nv; ++i) - { - for (int j = 0; j < model.nv; ++j) - { - cs_Minv(i, j) = ad_data.Minv(i, j); // copy symbolic M(q) into CasADi matrix - } - } - - for (int i = 0; i < model.nv; ++i) - { - for (int j = 0; j < model.nv; ++j) - { - ::casadi::SX dMinv_dq = jacobian(cs_Minv(i, j), cs_q); - cs_Minv_dot(i, j) = mtimes(dMinv_dq, cs_v); - } - } - - /* compute derivative of (end-effector) Jacobian matrix */ - // !!!!! Segmentation fault - // Eigen::Matrix<ADScalar, 6, Eigen::Dynamic> J(6, model.nv); - // Data::Matrix6x J(6, model.nv); - // J.setZero(); - // pinocchio::computeJointJacobian(model, data, q, ee_joint_id, J); - // pinocchio::computeJointJacobian(ad_model, ad_data, q_ad, ee_joint_id, J); - // pinocchio::computeJointJacobian(ad_model, ad_data, q_ad, ee_joint_id, ad_data.J); - // std::cout << "Jacobian J:\n" << J << std::endl; - - // compute "Numerical" Jacobian - // pinocchio::computeJointJacobians(model, data, q); - // std::cout << "Jacobian J:\n" << data.J << std::endl; - - // compute "Symbolic" Jacobian - pinocchio::computeJointJacobians(ad_model, ad_data, q_ad); - for (int i = 0; i < 6; ++i) - { - for (int j = 0; j < model.nv; ++j) - { - cs_J(i, j) = ad_data.J(i, j); // copy symbolic J(q) into CasADi matrix - } - } - // std::cout << "Symbolic mass matrix:\n" << cs_J << std::endl; - - // Jacobian derivative - for (int i = 0; i < 6; ++i) - { - for (int j = 0; j < model.nv; ++j) - { - ::casadi::SX dJij_dq = - jacobian(cs_J(i, j), cs_q); // extract derivative of J[i, j] w.r.t all q - cs_J_dot(i, j) = mtimes(dJij_dq, cs_v); // multiply by v and sum over nq - } - } - - /* Inverse Dynamics -> joint torque */ - pinocchio::rnea(ad_model, ad_data, q_ad, v_ad, a_ad); - ::casadi::SX tau_ad(model.nv, 1); - for (Eigen::DenseIndex k = 0; k < model.nv; ++k) - { - tau_ad(k) = ad_data.tau[k]; - } - - //* Build (symbolic) CasADi function for evaluation *// - ::casadi::Function eval_rnea("eval_rnea", ::casadi::SXVector{ cs_q, cs_v, cs_a }, - ::casadi::SXVector{ tau_ad }); - - ::casadi::Function eval_Minv_dot("eval_Minv_dot", ::casadi::SXVector{ cs_q, cs_v }, - ::casadi::SXVector{ cs_Minv_dot }); - // std::cout << cs_Minv_dot << std::endl; - - ::casadi::Function eval_Jdot("eval_Jdot", ::casadi::SXVector{ cs_q, cs_v }, - ::casadi::SXVector{ cs_J_dot }); - // std::cout << cs_J_dot << std::endl; - - //* Evaluate CasADi expression with real value *// - std::vector<double> q_vec((size_t)model.nq); - Eigen::Map<Eigen::VectorXd>(q_vec.data(), model.nq, 1) = q; - - std::vector<double> v_vec((size_t)model.nv); - Eigen::Map<Eigen::VectorXd>(v_vec.data(), model.nv, 1) = v; - - std::vector<double> a_vec((size_t)model.nv); - Eigen::Map<Eigen::VectorXd>(a_vec.data(), model.nv, 1) = a; - - // Inverse dynamics - ::casadi::DM tau_casadi_res = eval_rnea(::casadi::DMVector{ q_vec, v_vec, a_vec })[0]; - Data::TangentVectorType tau_casadi_vec = Eigen::Map<Data::TangentVectorType>( - static_cast<std::vector<double>>(tau_casadi_res).data(), model.nv, 1); - - pinocchio::rnea(model, data, q, v, a); - std::cout << "pinocchio double:\n" - << "\ttau = " << data.tau.transpose() << std::endl; - std::cout << "pinocchio CasADi:\n" - << "\ttau = " << tau_casadi_vec.transpose() << std::endl; - - // Minv_dot - ::casadi::DM Minv_dot_res = eval_Minv_dot(::casadi::DMVector{ q_vec, v_vec })[0]; - std::cout << "(CasADi) Minv_dot:" << Minv_dot_res << std::endl << std::endl; - - // J_dot - ::casadi::DM Jdot_res = eval_Jdot(::casadi::DMVector{ q_vec, v_vec })[0]; - std::cout << "(CasADi) Jdot:" << Jdot_res << std::endl << std::endl; - - pinocchio::computeJointJacobiansTimeVariation(model, data, q, v); - std::cout << "(pinocchio) Jdot:\n" << data.dJ << std::endl << std::endl; -} \ No newline at end of file