Directory: | ./ |
---|---|
File: | include/crocoddyl/multibody/wrench-cone.hxx |
Date: | 2025-03-26 19:23:43 |
Exec | Total | Coverage | |
---|---|---|---|
Lines: | 130 | 220 | 59.1% |
Branches: | 195 | 466 | 41.8% |
Line | Branch | Exec | Source |
---|---|---|---|
1 | /////////////////////////////////////////////////////////////////////////////// | ||
2 | // BSD 3-Clause License | ||
3 | // | ||
4 | // Copyright (C) 2020-2025, University of Edinburgh, University of Oxford, | ||
5 | // Heriot-Watt University | ||
6 | // Copyright note valid unless otherwise stated in individual files. | ||
7 | // All rights reserved. | ||
8 | /////////////////////////////////////////////////////////////////////////////// | ||
9 | |||
10 | #include <iostream> | ||
11 | |||
12 | namespace crocoddyl { | ||
13 | |||
14 | template <typename Scalar> | ||
15 | 881 | WrenchConeTpl<Scalar>::WrenchConeTpl(const Matrix3s& R, const Scalar mu, | |
16 | const Vector2s& box, const std::size_t nf, | ||
17 | const bool inner_appr, | ||
18 | const Scalar min_nforce, | ||
19 | const Scalar max_nforce) | ||
20 | 881 | : nf_(nf), | |
21 |
1/2✓ Branch 1 taken 881 times.
✗ Branch 2 not taken.
|
881 | R_(R), |
22 |
1/2✓ Branch 1 taken 881 times.
✗ Branch 2 not taken.
|
881 | box_(box), |
23 | 881 | mu_(mu), | |
24 | 881 | inner_appr_(inner_appr), | |
25 | 881 | min_nforce_(min_nforce), | |
26 |
2/4✓ Branch 2 taken 881 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 881 times.
✗ Branch 6 not taken.
|
881 | max_nforce_(max_nforce) { |
27 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 881 times.
|
881 | if (nf_ % 2 != 0) { |
28 | ✗ | nf_ = 4; | |
29 | ✗ | std::cerr << "Warning: nf has to be an even number, set to 4" << std::endl; | |
30 | } | ||
31 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 881 times.
|
881 | if (mu < Scalar(0.)) { |
32 | ✗ | mu_ = Scalar(1.); | |
33 | ✗ | std::cerr << "Warning: mu has to be a positive value, set to 1." | |
34 | ✗ | << std::endl; | |
35 | } | ||
36 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 881 times.
|
881 | if (min_nforce < Scalar(0.)) { |
37 | ✗ | min_nforce_ = Scalar(0.); | |
38 | ✗ | std::cerr << "Warning: min_nforce has to be a positive value, set to 0" | |
39 | ✗ | << std::endl; | |
40 | } | ||
41 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 881 times.
|
881 | if (max_nforce < Scalar(0.)) { |
42 | ✗ | max_nforce_ = std::numeric_limits<Scalar>::infinity(); | |
43 | ✗ | std::cerr << "Warning: max_nforce has to be a positive value, set to " | |
44 | "infinity value" | ||
45 | ✗ | << std::endl; | |
46 | } | ||
47 |
2/4✓ Branch 1 taken 881 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 881 times.
✗ Branch 5 not taken.
|
881 | A_ = MatrixX6s::Zero(nf_ + 13, 6); |
48 |
2/4✓ Branch 1 taken 881 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 881 times.
✗ Branch 5 not taken.
|
881 | ub_ = VectorXs::Zero(nf_ + 13); |
49 |
2/4✓ Branch 1 taken 881 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 881 times.
✗ Branch 5 not taken.
|
881 | lb_ = VectorXs::Zero(nf_ + 13); |
50 | |||
51 | // Update the inequality matrix and bounds | ||
52 |
1/2✓ Branch 1 taken 881 times.
✗ Branch 2 not taken.
|
881 | update(); |
53 | 881 | } | |
54 | |||
55 | template <typename Scalar> | ||
56 | ✗ | WrenchConeTpl<Scalar>::WrenchConeTpl(const Matrix3s& R, const Scalar mu, | |
57 | const Vector2s& box, std::size_t nf, | ||
58 | const Scalar min_nforce, | ||
59 | const Scalar max_nforce) | ||
60 | ✗ | : nf_(nf), | |
61 | ✗ | R_(R), | |
62 | ✗ | box_(box), | |
63 | ✗ | mu_(mu), | |
64 | ✗ | inner_appr_(true), | |
65 | ✗ | min_nforce_(min_nforce), | |
66 | ✗ | max_nforce_(max_nforce) { | |
67 | ✗ | if (nf_ % 2 != 0) { | |
68 | ✗ | nf_ = 4; | |
69 | ✗ | std::cerr << "Warning: nf has to be an even number, set to 4" << std::endl; | |
70 | } | ||
71 | ✗ | if (mu < Scalar(0.)) { | |
72 | ✗ | mu_ = Scalar(1.); | |
73 | ✗ | std::cerr << "Warning: mu has to be a positive value, set to 1." | |
74 | ✗ | << std::endl; | |
75 | } | ||
76 | ✗ | if (min_nforce < Scalar(0.)) { | |
77 | ✗ | min_nforce_ = Scalar(0.); | |
78 | ✗ | std::cerr << "Warning: min_nforce has to be a positive value, set to 0" | |
79 | ✗ | << std::endl; | |
80 | } | ||
81 | ✗ | if (max_nforce < Scalar(0.)) { | |
82 | ✗ | max_nforce_ = std::numeric_limits<Scalar>::infinity(); | |
83 | ✗ | std::cerr << "Warning: max_nforce has to be a positive value, set to " | |
84 | "infinity value" | ||
85 | ✗ | << std::endl; | |
86 | } | ||
87 | ✗ | A_ = MatrixX6s::Zero(nf_ + 13, 6); | |
88 | ✗ | ub_ = VectorXs::Zero(nf_ + 13); | |
89 | ✗ | lb_ = VectorXs::Zero(nf_ + 13); | |
90 | |||
91 | // Update the inequality matrix and bounds | ||
92 | ✗ | update(); | |
93 | } | ||
94 | |||
95 | template <typename Scalar> | ||
96 | 182 | WrenchConeTpl<Scalar>::WrenchConeTpl(const WrenchConeTpl<Scalar>& cone) | |
97 | 182 | : nf_(cone.get_nf()), | |
98 | 182 | A_(cone.get_A()), | |
99 |
2/4✓ Branch 1 taken 182 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 182 times.
✗ Branch 5 not taken.
|
182 | ub_(cone.get_ub()), |
100 |
2/4✓ Branch 1 taken 182 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 182 times.
✗ Branch 5 not taken.
|
182 | lb_(cone.get_lb()), |
101 |
2/4✓ Branch 1 taken 182 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 182 times.
✗ Branch 5 not taken.
|
182 | R_(cone.get_R()), |
102 |
2/4✓ Branch 1 taken 182 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 182 times.
✗ Branch 5 not taken.
|
182 | box_(cone.get_box()), |
103 |
1/2✓ Branch 1 taken 182 times.
✗ Branch 2 not taken.
|
182 | mu_(cone.get_mu()), |
104 |
1/2✓ Branch 1 taken 182 times.
✗ Branch 2 not taken.
|
182 | inner_appr_(cone.get_inner_appr()), |
105 |
1/2✓ Branch 1 taken 182 times.
✗ Branch 2 not taken.
|
182 | min_nforce_(cone.get_min_nforce()), |
106 |
1/2✓ Branch 1 taken 182 times.
✗ Branch 2 not taken.
|
182 | max_nforce_(cone.get_max_nforce()) {} |
107 | |||
108 | template <typename Scalar> | ||
109 | 3 | WrenchConeTpl<Scalar>::WrenchConeTpl() | |
110 | 3 | : nf_(4), | |
111 |
1/2✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
3 | A_(nf_ + 13, 6), |
112 |
1/2✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
3 | ub_(nf_ + 13), |
113 |
1/2✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
3 | lb_(nf_ + 13), |
114 |
2/4✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
|
3 | R_(Matrix3s::Identity()), |
115 |
1/2✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
3 | box_(std::numeric_limits<Scalar>::infinity(), |
116 | 3 | std::numeric_limits<Scalar>::infinity()), | |
117 | 3 | mu_(Scalar(0.7)), | |
118 | 3 | inner_appr_(true), | |
119 | 3 | min_nforce_(Scalar(0.)), | |
120 | 3 | max_nforce_(std::numeric_limits<Scalar>::infinity()) { | |
121 |
1/2✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
3 | A_.setZero(); |
122 |
1/2✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
3 | ub_.setZero(); |
123 |
1/2✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
3 | lb_.setZero(); |
124 | |||
125 | // Update the inequality matrix and bounds | ||
126 |
1/2✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
3 | update(); |
127 | 3 | } | |
128 | |||
129 | template <typename Scalar> | ||
130 | 1066 | WrenchConeTpl<Scalar>::~WrenchConeTpl() {} | |
131 | |||
132 | template <typename Scalar> | ||
133 | 884 | void WrenchConeTpl<Scalar>::update() { | |
134 | // Initialize the matrix and bounds | ||
135 |
1/2✓ Branch 1 taken 884 times.
✗ Branch 2 not taken.
|
884 | A_.setZero(); |
136 |
1/2✓ Branch 1 taken 884 times.
✗ Branch 2 not taken.
|
884 | ub_.setZero(); |
137 |
1/2✓ Branch 1 taken 884 times.
✗ Branch 2 not taken.
|
884 | lb_.setOnes(); |
138 |
1/2✓ Branch 2 taken 884 times.
✗ Branch 3 not taken.
|
884 | lb_ *= -std::numeric_limits<Scalar>::infinity(); |
139 | |||
140 | // Compute the mu given the type of friction cone approximation | ||
141 | 884 | Scalar mu = mu_; | |
142 | 884 | Scalar theta = | |
143 | 884 | static_cast<Scalar>(2.0) * pi<Scalar>() / static_cast<Scalar>(nf_); | |
144 |
2/2✓ Branch 0 taken 62 times.
✓ Branch 1 taken 822 times.
|
884 | if (inner_appr_) { |
145 | 62 | mu *= cos(theta / Scalar(2.)); | |
146 | } | ||
147 | |||
148 | // Friction cone information | ||
149 | // This segment of matrix is defined as | ||
150 | // [ 1 0 -mu 0 0 0; | ||
151 | // -1 0 -mu 0 0 0; | ||
152 | // 0 1 -mu 0 0 0; | ||
153 | // 0 -1 -mu 0 0 0; | ||
154 | // 0 0 1 0 0 0] | ||
155 |
2/2✓ Branch 0 taken 1854 times.
✓ Branch 1 taken 884 times.
|
2738 | for (std::size_t i = 0; i < nf_ / 2; ++i) { |
156 | 1854 | Scalar theta_i = theta * static_cast<Scalar>(i); | |
157 |
1/2✓ Branch 1 taken 1854 times.
✗ Branch 2 not taken.
|
1854 | Vector3s tsurf_i = Vector3s(cos(theta_i), sin(theta_i), Scalar(0.)); |
158 |
3/6✓ Branch 1 taken 1854 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1854 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1854 times.
✗ Branch 8 not taken.
|
1854 | Vector3s mu_nsurf = -mu * Vector3s::UnitZ(); |
159 |
6/12✓ Branch 1 taken 1854 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1854 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1854 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1854 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1854 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1854 times.
✗ Branch 17 not taken.
|
1854 | A_.row(2 * i).template head<3>() = |
160 |
1/2✓ Branch 1 taken 1854 times.
✗ Branch 2 not taken.
|
1854 | (mu_nsurf + tsurf_i).transpose() * R_.transpose(); |
161 |
6/12✓ Branch 1 taken 1854 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1854 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1854 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1854 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1854 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1854 times.
✗ Branch 17 not taken.
|
1854 | A_.row(2 * i + 1).template head<3>() = |
162 |
1/2✓ Branch 1 taken 1854 times.
✗ Branch 2 not taken.
|
3708 | (mu_nsurf - tsurf_i).transpose() * R_.transpose(); |
163 | } | ||
164 |
5/10✓ Branch 1 taken 884 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 884 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 884 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 884 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 884 times.
✗ Branch 14 not taken.
|
884 | A_.row(nf_).template head<3>() = R_.col(2).transpose(); |
165 |
1/2✓ Branch 1 taken 884 times.
✗ Branch 2 not taken.
|
884 | lb_(nf_) = min_nforce_; |
166 |
1/2✓ Branch 1 taken 884 times.
✗ Branch 2 not taken.
|
884 | ub_(nf_) = max_nforce_; |
167 | |||
168 | // CoP information | ||
169 |
1/2✓ Branch 1 taken 884 times.
✗ Branch 2 not taken.
|
884 | const Scalar L = box_(0) / Scalar(2.); |
170 |
1/2✓ Branch 1 taken 884 times.
✗ Branch 2 not taken.
|
884 | const Scalar W = box_(1) / Scalar(2.); |
171 | // This segment of matrix is defined as | ||
172 | // [0 0 -W 1 0 0; | ||
173 | // 0 0 -W -1 0 0; | ||
174 | // 0 0 -L 0 1 0; | ||
175 | // 0 0 -L 0 -1 0] | ||
176 |
8/16✓ Branch 1 taken 884 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 884 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 884 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 884 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 884 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 884 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 884 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 884 times.
✗ Branch 23 not taken.
|
884 | A_.row(nf_ + 1) << -W * R_.col(2).transpose(), R_.col(0).transpose(); |
177 |
9/18✓ Branch 1 taken 884 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 884 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 884 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 884 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 884 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 884 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 884 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 884 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 884 times.
✗ Branch 26 not taken.
|
884 | A_.row(nf_ + 2) << -W * R_.col(2).transpose(), -R_.col(0).transpose(); |
178 |
8/16✓ Branch 1 taken 884 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 884 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 884 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 884 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 884 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 884 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 884 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 884 times.
✗ Branch 23 not taken.
|
884 | A_.row(nf_ + 3) << -L * R_.col(2).transpose(), R_.col(1).transpose(); |
179 |
9/18✓ Branch 1 taken 884 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 884 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 884 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 884 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 884 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 884 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 884 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 884 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 884 times.
✗ Branch 26 not taken.
|
884 | A_.row(nf_ + 4) << -L * R_.col(2).transpose(), -R_.col(1).transpose(); |
180 | |||
181 | // Yaw-tau information | ||
182 | 884 | const Scalar mu_LW = -mu * (L + W); | |
183 | // The segment of the matrix that encodes the minimum torque is defined as | ||
184 | // [ W L -mu*(L+W) -mu -mu -1; | ||
185 | // W -L -mu*(L+W) -mu mu -1; | ||
186 | // -W L -mu*(L+W) mu -mu -1; | ||
187 | // -W -L -mu*(L+W) mu mu -1] | ||
188 |
7/14✓ Branch 1 taken 884 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 884 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 884 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 884 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 884 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 884 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 884 times.
✗ Branch 20 not taken.
|
1768 | A_.row(nf_ + 5) << Vector3s(W, L, mu_LW).transpose() * R_.transpose(), |
189 |
4/8✓ Branch 1 taken 884 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 884 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 884 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 884 times.
✗ Branch 11 not taken.
|
1768 | Vector3s(-mu, -mu, Scalar(-1.)).transpose() * R_.transpose(); |
190 |
7/14✓ Branch 1 taken 884 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 884 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 884 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 884 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 884 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 884 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 884 times.
✗ Branch 20 not taken.
|
1768 | A_.row(nf_ + 6) << Vector3s(W, -L, mu_LW).transpose() * R_.transpose(), |
191 |
4/8✓ Branch 1 taken 884 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 884 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 884 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 884 times.
✗ Branch 11 not taken.
|
1768 | Vector3s(-mu, mu, Scalar(-1.)).transpose() * R_.transpose(); |
192 |
7/14✓ Branch 1 taken 884 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 884 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 884 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 884 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 884 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 884 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 884 times.
✗ Branch 20 not taken.
|
1768 | A_.row(nf_ + 7) << Vector3s(-W, L, mu_LW).transpose() * R_.transpose(), |
193 |
4/8✓ Branch 1 taken 884 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 884 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 884 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 884 times.
✗ Branch 11 not taken.
|
1768 | Vector3s(mu, -mu, Scalar(-1.)).transpose() * R_.transpose(); |
194 |
7/14✓ Branch 1 taken 884 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 884 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 884 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 884 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 884 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 884 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 884 times.
✗ Branch 20 not taken.
|
1768 | A_.row(nf_ + 8) << Vector3s(-W, -L, mu_LW).transpose() * R_.transpose(), |
195 |
4/8✓ Branch 1 taken 884 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 884 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 884 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 884 times.
✗ Branch 11 not taken.
|
1768 | Vector3s(mu, mu, Scalar(-1.)).transpose() * R_.transpose(); |
196 | // The segment of the matrix that encodes the infinity torque is defined as | ||
197 | // [ W L -mu*(L+W) mu mu 1; | ||
198 | // W -L -mu*(L+W) mu -mu 1; | ||
199 | // -W L -mu*(L+W) -mu mu 1; | ||
200 | // -W -L -mu*(L+W) -mu -mu 1] | ||
201 |
7/14✓ Branch 1 taken 884 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 884 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 884 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 884 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 884 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 884 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 884 times.
✗ Branch 20 not taken.
|
1768 | A_.row(nf_ + 9) << Vector3s(W, L, mu_LW).transpose() * R_.transpose(), |
202 |
4/8✓ Branch 1 taken 884 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 884 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 884 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 884 times.
✗ Branch 11 not taken.
|
1768 | Vector3s(mu, mu, Scalar(1.)).transpose() * R_.transpose(); |
203 |
7/14✓ Branch 1 taken 884 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 884 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 884 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 884 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 884 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 884 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 884 times.
✗ Branch 20 not taken.
|
1768 | A_.row(nf_ + 10) << Vector3s(W, -L, mu_LW).transpose() * R_.transpose(), |
204 |
4/8✓ Branch 1 taken 884 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 884 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 884 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 884 times.
✗ Branch 11 not taken.
|
1768 | Vector3s(mu, -mu, Scalar(1.)).transpose() * R_.transpose(); |
205 |
7/14✓ Branch 1 taken 884 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 884 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 884 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 884 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 884 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 884 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 884 times.
✗ Branch 20 not taken.
|
1768 | A_.row(nf_ + 11) << Vector3s(-W, L, mu_LW).transpose() * R_.transpose(), |
206 |
4/8✓ Branch 1 taken 884 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 884 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 884 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 884 times.
✗ Branch 11 not taken.
|
1768 | Vector3s(-mu, mu, Scalar(1.)).transpose() * R_.transpose(); |
207 |
7/14✓ Branch 1 taken 884 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 884 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 884 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 884 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 884 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 884 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 884 times.
✗ Branch 20 not taken.
|
1768 | A_.row(nf_ + 12) << Vector3s(-W, -L, mu_LW).transpose() * R_.transpose(), |
208 |
4/8✓ Branch 1 taken 884 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 884 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 884 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 884 times.
✗ Branch 11 not taken.
|
1768 | Vector3s(-mu, -mu, Scalar(1.)).transpose() * R_.transpose(); |
209 | 884 | } | |
210 | |||
211 | template <typename Scalar> | ||
212 | ✗ | void WrenchConeTpl<Scalar>::update(const Matrix3s& R, const Scalar mu, | |
213 | const Vector2s& box, const Scalar min_nforce, | ||
214 | const Scalar max_nforce) { | ||
215 | ✗ | set_R(R); | |
216 | ✗ | set_mu(mu); | |
217 | ✗ | set_inner_appr(inner_appr_); | |
218 | ✗ | set_box(box); | |
219 | ✗ | set_min_nforce(min_nforce); | |
220 | ✗ | set_max_nforce(max_nforce); | |
221 | |||
222 | // Update the inequality matrix and bounds | ||
223 | ✗ | update(); | |
224 | } | ||
225 | |||
226 | template <typename Scalar> | ||
227 | template <typename NewScalar> | ||
228 | 9 | WrenchConeTpl<NewScalar> WrenchConeTpl<Scalar>::cast() const { | |
229 | typedef WrenchConeTpl<NewScalar> ReturnType; | ||
230 |
0/8✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
|
9 | ReturnType ret(R_.template cast<NewScalar>(), scalar_cast<NewScalar>(mu_), |
231 | 9 | box_.template cast<NewScalar>(), nf_, inner_appr_, | |
232 | 9 | scalar_cast<NewScalar>(min_nforce_), | |
233 | 9 | scalar_cast<NewScalar>(max_nforce_)); | |
234 | 9 | return ret; | |
235 | } | ||
236 | |||
237 | template <typename Scalar> | ||
238 | 25814 | const typename MathBaseTpl<Scalar>::MatrixX6s& WrenchConeTpl<Scalar>::get_A() | |
239 | const { | ||
240 | 25814 | return A_; | |
241 | } | ||
242 | |||
243 | template <typename Scalar> | ||
244 | 1560 | const typename MathBaseTpl<Scalar>::VectorXs& WrenchConeTpl<Scalar>::get_ub() | |
245 | const { | ||
246 | 1560 | return ub_; | |
247 | } | ||
248 | |||
249 | template <typename Scalar> | ||
250 | 1384 | const typename MathBaseTpl<Scalar>::VectorXs& WrenchConeTpl<Scalar>::get_lb() | |
251 | const { | ||
252 | 1384 | return lb_; | |
253 | } | ||
254 | |||
255 | template <typename Scalar> | ||
256 | 387 | std::size_t WrenchConeTpl<Scalar>::get_nf() const { | |
257 | 387 | return nf_; | |
258 | } | ||
259 | |||
260 | template <typename Scalar> | ||
261 | 203 | const typename MathBaseTpl<Scalar>::Matrix3s& WrenchConeTpl<Scalar>::get_R() | |
262 | const { | ||
263 | 203 | return R_; | |
264 | } | ||
265 | |||
266 | template <typename Scalar> | ||
267 | 199 | const typename MathBaseTpl<Scalar>::Vector2s& WrenchConeTpl<Scalar>::get_box() | |
268 | const { | ||
269 | 199 | return box_; | |
270 | } | ||
271 | |||
272 | template <typename Scalar> | ||
273 | 201 | const Scalar WrenchConeTpl<Scalar>::get_mu() const { | |
274 | 201 | return mu_; | |
275 | } | ||
276 | |||
277 | template <typename Scalar> | ||
278 | 199 | bool WrenchConeTpl<Scalar>::get_inner_appr() const { | |
279 | 199 | return inner_appr_; | |
280 | } | ||
281 | |||
282 | template <typename Scalar> | ||
283 | 195 | const Scalar WrenchConeTpl<Scalar>::get_min_nforce() const { | |
284 | 195 | return min_nforce_; | |
285 | } | ||
286 | |||
287 | template <typename Scalar> | ||
288 | 195 | const Scalar WrenchConeTpl<Scalar>::get_max_nforce() const { | |
289 | 195 | return max_nforce_; | |
290 | } | ||
291 | |||
292 | template <typename Scalar> | ||
293 | ✗ | void WrenchConeTpl<Scalar>::set_R(const Matrix3s& R) { | |
294 | ✗ | R_ = R; | |
295 | } | ||
296 | |||
297 | template <typename Scalar> | ||
298 | ✗ | void WrenchConeTpl<Scalar>::set_box(const Vector2s& box) { | |
299 | ✗ | box_ = box; | |
300 | ✗ | if (box_(0) < Scalar(0.)) { | |
301 | ✗ | box_(0) = std::numeric_limits<Scalar>::infinity(); | |
302 | ✗ | std::cerr << "Warning: box(0) has to be a positive value, set to max. float" | |
303 | ✗ | << std::endl; | |
304 | } | ||
305 | ✗ | if (box_(1) < Scalar(0.)) { | |
306 | ✗ | box_(1) = std::numeric_limits<Scalar>::infinity(); | |
307 | ✗ | std::cerr << "Warning: box(0) has to be a positive value, set to max. float" | |
308 | ✗ | << std::endl; | |
309 | } | ||
310 | } | ||
311 | |||
312 | template <typename Scalar> | ||
313 | ✗ | void WrenchConeTpl<Scalar>::set_mu(const Scalar mu) { | |
314 | ✗ | mu_ = mu; | |
315 | ✗ | if (mu < Scalar(0.)) { | |
316 | ✗ | mu_ = Scalar(1.); | |
317 | ✗ | std::cerr << "Warning: mu has to be a positive value, set to 1." | |
318 | ✗ | << std::endl; | |
319 | } | ||
320 | } | ||
321 | |||
322 | template <typename Scalar> | ||
323 | ✗ | void WrenchConeTpl<Scalar>::set_inner_appr(const bool inner_appr) { | |
324 | ✗ | inner_appr_ = inner_appr; | |
325 | } | ||
326 | |||
327 | template <typename Scalar> | ||
328 | ✗ | void WrenchConeTpl<Scalar>::set_min_nforce(const Scalar min_nforce) { | |
329 | ✗ | min_nforce_ = min_nforce; | |
330 | ✗ | if (min_nforce < Scalar(0.)) { | |
331 | ✗ | min_nforce_ = Scalar(0.); | |
332 | ✗ | std::cerr << "Warning: min_nforce has to be a positive value, set to 0" | |
333 | ✗ | << std::endl; | |
334 | } | ||
335 | } | ||
336 | |||
337 | template <typename Scalar> | ||
338 | ✗ | void WrenchConeTpl<Scalar>::set_max_nforce(const Scalar max_nforce) { | |
339 | ✗ | max_nforce_ = max_nforce; | |
340 | ✗ | if (max_nforce < Scalar(0.)) { | |
341 | ✗ | max_nforce_ = std::numeric_limits<Scalar>::infinity(); | |
342 | ✗ | std::cerr << "Warning: max_nforce has to be a positive value, set to " | |
343 | "infinity value" | ||
344 | ✗ | << std::endl; | |
345 | } | ||
346 | } | ||
347 | |||
348 | template <typename Scalar> | ||
349 | 5 | WrenchConeTpl<Scalar>& WrenchConeTpl<Scalar>::operator=( | |
350 | const WrenchConeTpl<Scalar>& other) { | ||
351 |
1/2✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
|
5 | if (this != &other) { |
352 | 5 | nf_ = other.get_nf(); | |
353 | 5 | A_ = other.get_A(); | |
354 | 5 | ub_ = other.get_ub(); | |
355 | 5 | lb_ = other.get_lb(); | |
356 | 5 | R_ = other.get_R(); | |
357 | 5 | box_ = other.get_box(); | |
358 | 5 | mu_ = other.get_mu(); | |
359 | 5 | inner_appr_ = other.get_inner_appr(); | |
360 | 5 | min_nforce_ = other.get_min_nforce(); | |
361 | 5 | max_nforce_ = other.get_max_nforce(); | |
362 | } | ||
363 | 5 | return *this; | |
364 | } | ||
365 | |||
366 | template <typename Scalar> | ||
367 | ✗ | std::ostream& operator<<(std::ostream& os, const WrenchConeTpl<Scalar>& X) { | |
368 | ✗ | os << " R: " << X.get_R() << std::endl; | |
369 | ✗ | os << " mu: " << X.get_mu() << std::endl; | |
370 | ✗ | os << " box: " << X.get_box().transpose() << std::endl; | |
371 | ✗ | os << " nf: " << X.get_nf() << std::endl; | |
372 | ✗ | os << "inner_appr: "; | |
373 | ✗ | if (X.get_inner_appr()) { | |
374 | ✗ | os << "true" << std::endl; | |
375 | } else { | ||
376 | ✗ | os << "false" << std::endl; | |
377 | } | ||
378 | ✗ | os << " min_force: " << X.get_min_nforce() << std::endl; | |
379 | ✗ | os << " max_force: " << X.get_max_nforce() << std::endl; | |
380 | ✗ | return os; | |
381 | } | ||
382 | |||
383 | } // namespace crocoddyl | ||
384 |