forked from stack-of-tasks/pinocchio
-
Notifications
You must be signed in to change notification settings - Fork 0
/
casadi-basic.cpp
146 lines (111 loc) · 3.97 KB
/
casadi-basic.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
//
// Copyright (c) 2019 INRIA
//
#include <pinocchio/autodiff/casadi.hpp>
#include <boost/variant.hpp> // to avoid C99 warnings
#include <boost/test/unit_test.hpp>
#include <boost/utility/binary.hpp>
BOOST_AUTO_TEST_SUITE(BOOST_TEST_MODULE)
BOOST_AUTO_TEST_CASE(test_eigen)
{
Eigen::Matrix<casadi::SX, 3, 3> A, B;
Eigen::Matrix<casadi::SX, 3, 1> a, b;
Eigen::Matrix<casadi::SX, 3, 1> c = A * a - B.transpose() * b;
}
// A function working with Eigen::Matrix'es parameterized by the Scalar type
template <typename Scalar, typename T1, typename T2, typename T3, typename T4>
Eigen::Matrix<Scalar, Eigen::Dynamic, 1>
eigenFun(Eigen::MatrixBase<T1> const& A,
Eigen::MatrixBase<T2> const& a,
Eigen::MatrixBase<T3> const& B,
Eigen::MatrixBase<T4> const& b)
{
Eigen::Matrix<Scalar, Eigen::Dynamic, 1> c(4);
c.segment(1, 3) = A * a.segment(1, 3) - B.transpose() * b;
c[0] = 0.;
return c;
}
BOOST_AUTO_TEST_CASE(test_example)
{
// Declare casadi symbolic matrix arguments
casadi::SX cs_a = casadi::SX::sym("a", 4);
casadi::SX cs_b = casadi::SX::sym("b", 3);
// Declare Eigen matrices
Eigen::Matrix<casadi::SX, 3, 3> A, B;
Eigen::Matrix<casadi::SX, -1, 1> a (4), c (4);
Eigen::Matrix<casadi::SX, 3, 1> b;
// Let A, B be some numeric matrices
for (Eigen::Index i = 0; i < A.rows(); ++i)
{
for (Eigen::Index j = 0; j < A.cols(); ++j)
{
A(i, j) = 10. * static_cast<double>(i) + static_cast<double>(j);
B(i, j) = -10. * static_cast<double>(i) - static_cast<double>(j);
}
}
// Let a, b be symbolic arguments of a function
pinocchio::casadi::copy(cs_b, b);
pinocchio::casadi::copy(cs_a, a);
// Call the function taking Eigen matrices
c = eigenFun<casadi::SX>(A, a, B, b);
// Copy the result from Eigen matrices to casadi matrix
casadi::SX cs_c = casadi::SX(casadi::Sparsity::dense(c.rows(), 1));
pinocchio::casadi::copy(c, cs_c);
// Display the resulting casadi matrix
std::cout << "c = " << cs_c << std::endl;
// Do some AD
casadi::SX dc_da = jacobian(cs_c, cs_a);
// Display the resulting jacobian
std::cout << "dc/da = " << dc_da << std::endl;
// Create a function which takes a, b and returns c and dc_da
casadi::Function fun("fun", casadi::SXVector {cs_a, cs_b}, casadi::SXVector {cs_c, dc_da});
std::cout << "fun = " << fun << std::endl;
// Evaluate the function
casadi::DMVector res = fun(casadi::DMVector {std::vector<double> {1., 2., 3., 4.}, std::vector<double> {-1., -2., -3.}});
std::cout << "fun(a, b)=" << res << std::endl;
}
BOOST_AUTO_TEST_CASE(test_jacobian)
{
casadi::SX cs_x = casadi::SX::sym("x", 3);
casadi::SX cs_y = casadi::SX::sym("y", 1);
cs_y(0) = cs_x(0) + cs_x(1) + cs_x(2);
// Display the resulting expression
std::cout << "y = " << cs_y << std::endl;
// Do some AD
casadi::SX dy_dx = jacobian(cs_x, cs_x);
// Display the resulting jacobian
std::cout << "dy/dx = " << dy_dx << std::endl;
}
BOOST_AUTO_TEST_CASE(test_copy_casadi_to_eigen)
{
casadi::SX cs_mat = casadi::SX::sym("A", 3, 4);
Eigen::Matrix<casadi::SX, 3, 4> eig_mat;
pinocchio::casadi::copy(cs_mat, eig_mat);
std::cout << eig_mat << std::endl;
}
BOOST_AUTO_TEST_CASE(test_copy_eigen_to_casadi)
{
Eigen::Matrix<casadi::SX, 3, 4> eig_mat;
pinocchio::casadi::sym(eig_mat, "A");
casadi::SX cs_mat;
pinocchio::casadi::copy(eig_mat, cs_mat);
std::cout << cs_mat << std::endl;
}
BOOST_AUTO_TEST_CASE(test_casadi_codegen)
{
casadi::SX x = casadi::SX::sym("x");
casadi::SX y = casadi::SX::sym("y");
casadi::Function fun("fun", casadi::SXVector {x, y}, casadi::SXVector {x + y});
casadi::CodeGenerator gen("module");
gen.add(fun);
std::cout << gen.dump();
}
BOOST_AUTO_TEST_CASE(test_max)
{
casadi::SX x = casadi::SX::sym("x");
casadi::SX y = casadi::SX::sym("y");
casadi::SX max_x_y = pinocchio::math::max(x,y);
casadi::SX max_x_0 = pinocchio::math::max(x,0.);
casadi::SX max_0_y = pinocchio::math::max(0.,y);
}
BOOST_AUTO_TEST_SUITE_END()