Skip to content

Commit 3093491

Browse files
authored
Merge pull request #2637 from jcarpent/topic/examples
Add CRBA CasADi example
2 parents 7d123d3 + 90c9800 commit 3093491

File tree

4 files changed

+78
-4
lines changed

4 files changed

+78
-4
lines changed

examples/casadi/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#
2-
# Copyright (c) 2024 INRIA
2+
# Copyright (c) 2025 INRIA
33
#
44

55
function(ADD_PINOCCHIO_CPP_CASADI_EXAMPLE EXAMPLE)
@@ -9,6 +9,7 @@ endfunction()
99
if(BUILD_WITH_CASADI_SUPPORT)
1010

1111
add_pinocchio_cpp_casadi_example(casadi-aba)
12+
add_pinocchio_cpp_casadi_example(casadi-crba)
1213
add_pinocchio_cpp_casadi_example(casadi-rnea)
1314

1415
if(BUILD_PYTHON_INTERFACE)

examples/casadi/casadi-crba.cpp

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
#include "pinocchio/autodiff/casadi.hpp"
2+
3+
#include "pinocchio/multibody/sample-models.hpp"
4+
5+
#include "pinocchio/algorithm/crba.hpp"
6+
#include "pinocchio/algorithm/joint-configuration.hpp"
7+
8+
int main(int /*argc*/, char ** /*argv*/)
9+
{
10+
using namespace pinocchio;
11+
12+
typedef double Scalar;
13+
typedef ::casadi::SX ADScalar;
14+
15+
typedef ModelTpl<Scalar> Model;
16+
typedef Model::Data Data;
17+
18+
typedef ModelTpl<ADScalar> ADModel;
19+
typedef ADModel::Data ADData;
20+
21+
// Create a random humanoid model
22+
Model model;
23+
buildModels::humanoidRandom(model);
24+
model.lowerPositionLimit.head<3>().fill(-1.);
25+
model.upperPositionLimit.head<3>().fill(1.);
26+
Data data(model);
27+
28+
// Pick up random configuration, velocity and acceleration vectors.
29+
Eigen::VectorXd q(model.nq);
30+
q = randomConfiguration(model);
31+
32+
// Create CasADi model and data from model
33+
typedef ADModel::ConfigVectorType ConfigVectorAD;
34+
ADModel ad_model = model.cast<ADScalar>();
35+
ADData ad_data(ad_model);
36+
37+
// Create symbolic CasADi vectors
38+
::casadi::SX cs_q = ::casadi::SX::sym("q", model.nq);
39+
ConfigVectorAD q_ad(model.nq);
40+
q_ad = Eigen::Map<ConfigVectorAD>(static_cast<std::vector<ADScalar>>(cs_q).data(), model.nq, 1);
41+
42+
// Build CasADi function
43+
crba(ad_model, ad_data, q_ad, pinocchio::Convention::WORLD);
44+
ad_data.M.triangularView<Eigen::StrictlyLower>() =
45+
ad_data.M.transpose().triangularView<Eigen::StrictlyLower>();
46+
::casadi::SX M_ad(model.nv, model.nv);
47+
for (Eigen::DenseIndex j = 0; j < model.nv; ++j)
48+
{
49+
for (Eigen::DenseIndex i = 0; i < model.nv; ++i)
50+
{
51+
M_ad(i, j) = ad_data.M(i, j);
52+
}
53+
}
54+
55+
::casadi::Function eval_crba("eval_crba", ::casadi::SXVector{cs_q}, ::casadi::SXVector{M_ad});
56+
57+
// Evaluate CasADi expression with real value
58+
std::vector<double> q_vec((size_t)model.nq);
59+
Eigen::Map<Eigen::VectorXd>(q_vec.data(), model.nq, 1) = q;
60+
61+
::casadi::DM M_res = eval_crba(::casadi::DMVector{q_vec})[0];
62+
Data::MatrixXs M_mat =
63+
Eigen::Map<Data::MatrixXs>(static_cast<std::vector<double>>(M_res).data(), model.nv, model.nv);
64+
65+
// Eval CRBA using classic Pinocchio model
66+
pinocchio::crba(model, data, q);
67+
data.M.triangularView<Eigen::StrictlyLower>() =
68+
data.M.transpose().triangularView<Eigen::StrictlyLower>();
69+
70+
// Print both results
71+
std::cout << "pinocchio double:\n" << "\tM =\n" << data.M << std::endl;
72+
std::cout << "pinocchio CasADi:\n" << "\tM =\n" << M_mat.transpose() << std::endl;
73+
}

include/pinocchio/spatial/inertia.hpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
//
2-
// Copyright (c) 2015-2021 CNRS INRIA
2+
// Copyright (c) 2015-2018 CNRS
3+
// Copyright (c) 2018-2025 INRIA
34
// Copyright (c) 2016 Wandercraft, 86 rue de Paris 91400 Orsay, France.
45
//
56

@@ -1210,7 +1211,7 @@ namespace pinocchio
12101211
const Scalar exp_2d1 = exp(2 * d1);
12111212
const Scalar exp_2d2 = exp(2 * d2);
12121213
const Scalar exp_2d3 = exp(2 * d3);
1213-
const Scalar exp_d1 = exp(d1);
1214+
// const Scalar exp_d1 = exp(d1);
12141215
const Scalar exp_d2 = exp(d2);
12151216
const Scalar exp_d3 = exp(d3);
12161217

unittest/casadi/spatial.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,6 @@ BOOST_AUTO_TEST_CASE(test_log3_firstorder_derivatives)
9999

100100
typedef pinocchio::SE3Tpl<ADScalar> SE3AD;
101101
typedef SE3AD::Vector3 Vector3AD;
102-
typedef SE3AD::Matrix3 Matrix3AD;
103102

104103
SE3::Matrix3 RTarget;
105104
pinocchio::toRotationMatrix(Vector3(SE3::Vector3::UnitX()), pinocchio::PI<Scalar>() / 4, RTarget);

0 commit comments

Comments
 (0)