Directory: | ./ |
---|---|
File: | src/generic-transformation.cc |
Date: | 2025-05-05 12:19:30 |
Exec | Total | Coverage | |
---|---|---|---|
Lines: | 144 | 150 | 96.0% |
Branches: | 140 | 277 | 50.5% |
Line | Branch | Exec | Source |
---|---|---|---|
1 | // Copyright (c) 2016, Joseph Mirabel | ||
2 | // Authors: Joseph Mirabel (joseph.mirabel@laas.fr) | ||
3 | // | ||
4 | |||
5 | // Redistribution and use in source and binary forms, with or without | ||
6 | // modification, are permitted provided that the following conditions are | ||
7 | // met: | ||
8 | // | ||
9 | // 1. Redistributions of source code must retain the above copyright | ||
10 | // notice, this list of conditions and the following disclaimer. | ||
11 | // | ||
12 | // 2. Redistributions in binary form must reproduce the above copyright | ||
13 | // notice, this list of conditions and the following disclaimer in the | ||
14 | // documentation and/or other materials provided with the distribution. | ||
15 | // | ||
16 | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
17 | // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
18 | // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
19 | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
20 | // HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
21 | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
22 | // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
23 | // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
24 | // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
25 | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
26 | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH | ||
27 | // DAMAGE. | ||
28 | |||
29 | #include <boost/serialization/vector.hpp> | ||
30 | #include <hpp/constraints/generic-transformation.hh> | ||
31 | #include <hpp/constraints/macros.hh> | ||
32 | #include <hpp/pinocchio/configuration.hh> | ||
33 | #include <hpp/pinocchio/device.hh> | ||
34 | #include <hpp/pinocchio/serialization.hh> | ||
35 | #include <hpp/util/indent.hh> | ||
36 | #include <hpp/util/serialization.hh> | ||
37 | #include <pinocchio/serialization/se3.hpp> | ||
38 | |||
39 | #include "generic-transformation/helper.hh" | ||
40 | #include "serialization.hh" | ||
41 | |||
42 | namespace hpp { | ||
43 | namespace constraints { | ||
44 | template <bool pos, bool ori, bool ose3> | ||
45 | 188 | LiegroupSpacePtr_t liegroupSpace(const std::vector<bool>& mask) { | |
46 |
2/4✓ Branch 1 taken 77 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 77 times.
✗ Branch 6 not taken.
|
308 | if (!ose3) return LiegroupSpace::Rn(size(mask)); |
47 | assert(ori); | ||
48 |
6/12✓ Branch 1 taken 17 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 17 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 17 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 17 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 17 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 17 times.
✗ Branch 14 not taken.
|
34 | assert(mask[(pos ? 3 : 0) + 0] && mask[(pos ? 3 : 0) + 1] && |
49 | mask[(pos ? 3 : 0) + 2] && | ||
50 | "Full orientation is necessary to output R3xSO3 / SO3 error"); | ||
51 |
1/2✓ Branch 1 taken 17 times.
✗ Branch 2 not taken.
|
34 | const size_type nTranslation = size(mask) - 3; |
52 |
1/2✓ Branch 1 taken 17 times.
✗ Branch 2 not taken.
|
34 | LiegroupSpacePtr_t SO3 = LiegroupSpace::SO3(); |
53 |
2/5✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 14 times.
✗ Branch 4 not taken.
|
34 | switch (nTranslation) { |
54 | 6 | case 0: | |
55 | 6 | return SO3; | |
56 | ✗ | case 1: | |
57 | ✗ | return LiegroupSpace::R1() * SO3; | |
58 | ✗ | case 2: | |
59 | ✗ | return LiegroupSpace::R2() * SO3; | |
60 | 28 | case 3: | |
61 |
1/2✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
|
28 | return LiegroupSpace::R3xSO3(); |
62 | ✗ | default: | |
63 | ✗ | throw std::logic_error("This should not happen. Invalid mask."); | |
64 | } | ||
65 | } | ||
66 | |||
67 | template <bool pos, bool ori, bool ose3> | ||
68 | 188 | inline Eigen::RowBlockIndices indices(const std::vector<bool>& mask) { | |
69 |
1/2✓ Branch 2 taken 94 times.
✗ Branch 3 not taken.
|
188 | ArrayXb _mask(mask.size() + (ose3 ? 1 : 0)); |
70 |
4/6✓ Branch 1 taken 399 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 399 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 399 times.
✓ Branch 8 taken 94 times.
|
986 | for (std::size_t i = 0; i < mask.size(); ++i) _mask[i] = mask[i]; |
71 | if (ose3) { | ||
72 | assert(ori); | ||
73 |
6/12✓ Branch 1 taken 17 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 17 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 17 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 17 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 17 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 17 times.
✗ Branch 14 not taken.
|
34 | assert(mask[(pos ? 3 : 0) + 0] && mask[(pos ? 3 : 0) + 1] && |
74 | mask[(pos ? 3 : 0) + 2] && | ||
75 | "Full orientation is necessary to output R3xSO3 / SO3 error"); | ||
76 |
1/2✓ Branch 2 taken 17 times.
✗ Branch 3 not taken.
|
34 | _mask[_mask.size() - 1] = true; |
77 | } | ||
78 | return Eigen::RowBlockIndices( | ||
79 |
2/4✓ Branch 1 taken 94 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 94 times.
✗ Branch 5 not taken.
|
376 | Eigen::BlockIndex::fromLogicalExpression(_mask)); |
80 | 188 | } | |
81 | |||
82 | 56 | void GenericTransformationModel<true>::setJoint1(const JointConstPtr_t& j) { | |
83 |
5/6✓ Branch 1 taken 52 times.
✓ Branch 2 taken 4 times.
✓ Branch 5 taken 52 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 52 times.
✓ Branch 8 taken 4 times.
|
56 | if (j && j->index() > 0) |
84 | 52 | joint1 = j; | |
85 | else | ||
86 | 4 | joint1.reset(); | |
87 |
3/4✓ Branch 1 taken 52 times.
✓ Branch 2 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 52 times.
|
56 | assert(!joint1 || joint1->index()); |
88 | 56 | } | |
89 | |||
90 | template <int _Options> | ||
91 | 56 | std::ostream& GenericTransformation<_Options>::print(std::ostream& os) const { | |
92 | os << (IsRelative ? "Relative" : "") | ||
93 | << (ComputePosition ? (ComputeOrientation ? "Transformation" : "Position") | ||
94 | : "Orientation") | ||
95 | 56 | << ": " << name() << ", active dof: " | |
96 |
2/4✓ Branch 2 taken 28 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 28 times.
✗ Branch 6 not taken.
|
56 | << pretty_print(BlockIndex::fromLogicalExpression(activeParameters_)) |
97 |
2/4✓ Branch 1 taken 28 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 28 times.
✗ Branch 5 not taken.
|
56 | << incindent << iendl |
98 |
11/26✓ Branch 1 taken 28 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 15 times.
✓ Branch 5 taken 13 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 15 times.
✓ Branch 8 taken 13 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 15 times.
✗ Branch 11 not taken.
✓ Branch 14 taken 15 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 15 times.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 24 taken 15 times.
✗ Branch 25 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 15 times.
✓ Branch 30 taken 15 times.
✗ Branch 31 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
|
112 | << "Joint1: " << ((IsRelative && joint1()) ? joint1()->name() : "World") |
99 |
4/8✓ Branch 1 taken 28 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 28 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 28 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 28 times.
✗ Branch 11 not taken.
|
56 | << iendl << "Frame in joint 1" << incindent << iendl; |
100 | 56 | pinocchio::display(os, frame1InJoint1()) | |
101 | 56 | << decindent << iendl | |
102 |
12/22✓ Branch 3 taken 22 times.
✓ Branch 4 taken 6 times.
✓ Branch 6 taken 22 times.
✗ Branch 7 not taken.
✓ Branch 10 taken 22 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 22 times.
✗ Branch 14 not taken.
✓ Branch 17 taken 6 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 28 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 28 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 6 times.
✓ Branch 27 taken 22 times.
✓ Branch 29 taken 22 times.
✓ Branch 30 taken 6 times.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
|
112 | << "Joint2: " << (joint2() ? joint2()->name() : "World") << iendl |
103 |
3/6✓ Branch 1 taken 28 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 28 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 28 times.
✗ Branch 8 not taken.
|
56 | << "Frame in joint 2" << incindent << iendl; |
104 | 56 | pinocchio::display(os, frame2InJoint2()) << decindent << iendl << "mask: "; | |
105 |
2/2✓ Branch 3 taken 108 times.
✓ Branch 4 taken 28 times.
|
272 | for (size_type i = 0; i < DerSize; ++i) os << mask_[i] << ", "; |
106 | 56 | return os << decindent; | |
107 | } | ||
108 | |||
109 | template <int _Options> | ||
110 | typename GenericTransformation<_Options>::Ptr_t | ||
111 | 58 | GenericTransformation<_Options>::create(const std::string& name, | |
112 | const DevicePtr_t& robot, | ||
113 | const JointConstPtr_t& joint2, | ||
114 | const Transform3s& reference, | ||
115 | std::vector<bool> mask) { | ||
116 | 116 | GenericTransformation<_Options>* ptr = | |
117 |
2/4✓ Branch 1 taken 29 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 29 times.
✗ Branch 5 not taken.
|
58 | new GenericTransformation<_Options>(name, robot, mask); |
118 |
1/2✓ Branch 2 taken 29 times.
✗ Branch 3 not taken.
|
58 | ptr->joint1(JointConstPtr_t()); |
119 | 58 | ptr->joint2(joint2); | |
120 | 58 | ptr->reference(reference); | |
121 | 58 | Ptr_t shPtr(ptr); | |
122 |
1/2✓ Branch 2 taken 29 times.
✗ Branch 3 not taken.
|
58 | ptr->init(shPtr); |
123 | 58 | return shPtr; | |
124 | } | ||
125 | |||
126 | template <int _Options> | ||
127 | typename GenericTransformation<_Options>::Ptr_t | ||
128 | 18 | GenericTransformation<_Options>::create( | |
129 | const std::string& name, const DevicePtr_t& robot, | ||
130 | /* World frame */ const JointConstPtr_t& joint2, | ||
131 | const Transform3s& frame2, const Transform3s& frame1, | ||
132 | std::vector<bool> mask) { | ||
133 | 36 | GenericTransformation<_Options>* ptr = | |
134 |
2/4✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
|
18 | new GenericTransformation<_Options>(name, robot, mask); |
135 |
1/2✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
|
18 | ptr->joint1(JointConstPtr_t()); |
136 | 18 | ptr->joint2(joint2); | |
137 | 18 | ptr->frame1InJoint1(frame1); | |
138 | 18 | ptr->frame2InJoint2(frame2); | |
139 | 18 | Ptr_t shPtr(ptr); | |
140 | 18 | return shPtr; | |
141 | } | ||
142 | |||
143 | template <int _Options> | ||
144 | typename GenericTransformation<_Options>::Ptr_t | ||
145 | 26 | GenericTransformation<_Options>::create(const std::string& name, | |
146 | const DevicePtr_t& robot, | ||
147 | const JointConstPtr_t& joint1, | ||
148 | const JointConstPtr_t& joint2, | ||
149 | const Transform3s& reference, | ||
150 | std::vector<bool> mask) { | ||
151 | 52 | GenericTransformation<_Options>* ptr = | |
152 |
2/4✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 13 times.
✗ Branch 5 not taken.
|
26 | new GenericTransformation<_Options>(name, robot, mask); |
153 | 26 | ptr->joint1(joint1); | |
154 | 26 | ptr->joint2(joint2); | |
155 | 26 | ptr->reference(reference); | |
156 | 26 | Ptr_t shPtr(ptr); | |
157 |
1/2✓ Branch 2 taken 13 times.
✗ Branch 3 not taken.
|
26 | ptr->init(shPtr); |
158 | 26 | return shPtr; | |
159 | } | ||
160 | |||
161 | template <int _Options> | ||
162 | typename GenericTransformation<_Options>::Ptr_t | ||
163 | 86 | GenericTransformation<_Options>::create(const std::string& name, | |
164 | const DevicePtr_t& robot, | ||
165 | const JointConstPtr_t& joint1, | ||
166 | const JointConstPtr_t& joint2, | ||
167 | const Transform3s& frame1, | ||
168 | const Transform3s& frame2, | ||
169 | std::vector<bool> mask) { | ||
170 | 172 | GenericTransformation<_Options>* ptr = | |
171 |
2/4✓ Branch 1 taken 43 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 43 times.
✗ Branch 5 not taken.
|
86 | new GenericTransformation<_Options>(name, robot, mask); |
172 | 86 | ptr->joint1(joint1); | |
173 | 86 | ptr->joint2(joint2); | |
174 | 86 | ptr->frame1InJoint1(frame1); | |
175 | 86 | ptr->frame2InJoint2(frame2); | |
176 | 86 | Ptr_t shPtr(ptr); | |
177 | 86 | return shPtr; | |
178 | } | ||
179 | |||
180 | template <int _Options> | ||
181 | 188 | GenericTransformation<_Options>::GenericTransformation(const std::string& name, | |
182 | const DevicePtr_t& robot, | ||
183 | std::vector<bool> mask) | ||
184 | : DifferentiableFunction( | ||
185 | robot->configSize(), robot->numberDof(), | ||
186 | liegroupSpace<(bool)ComputePosition, (bool)ComputeOrientation, | ||
187 | (bool)OutputR3xSO3>(mask), | ||
188 | name), | ||
189 | 188 | robot_(robot), | |
190 |
2/4✓ Branch 2 taken 94 times.
✗ Branch 3 not taken.
✓ Branch 8 taken 94 times.
✗ Branch 9 not taken.
|
188 | m_(robot->numberDof() - robot->extraConfigSpace().dimension()), |
191 |
1/2✓ Branch 1 taken 94 times.
✗ Branch 2 not taken.
|
188 | Vindices_(indices<(bool)ComputePosition, (bool)ComputeOrientation, |
192 | (bool)OutputR3xSO3>(mask)), | ||
193 |
5/10✓ Branch 2 taken 94 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 94 times.
✗ Branch 7 not taken.
✓ Branch 10 taken 94 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 94 times.
✗ Branch 14 not taken.
✓ Branch 19 taken 94 times.
✗ Branch 20 not taken.
|
376 | mask_(mask) { |
194 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 94 times.
|
188 | assert(mask.size() == DerSize); |
195 | 188 | std::size_t iOri = 0; | |
196 | 188 | m_.rowOri = 0; | |
197 | if (ComputePosition) { | ||
198 |
2/2✓ Branch 0 taken 180 times.
✓ Branch 1 taken 60 times.
|
480 | for (size_type i = 0; i < 3; ++i) |
199 |
3/4✓ Branch 1 taken 180 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 178 times.
✓ Branch 4 taken 2 times.
|
360 | if (mask_[i]) m_.rowOri++; |
200 | 120 | m_.fullPos = (m_.rowOri == 3); | |
201 | 120 | iOri = 3; | |
202 | } else | ||
203 | 68 | m_.fullPos = false; | |
204 | if (ComputeOrientation) | ||
205 |
7/12✓ Branch 1 taken 73 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 70 times.
✓ Branch 4 taken 3 times.
✓ Branch 6 taken 70 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 70 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 70 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 70 times.
✗ Branch 14 not taken.
|
146 | m_.fullOri = mask_[iOri + 0] && mask_[iOri + 1] && mask_[iOri + 2]; |
206 | else | ||
207 | 42 | m_.fullOri = false; | |
208 | 188 | } | |
209 | |||
210 | template <int _Options> | ||
211 | 460 | inline void GenericTransformation<_Options>::computeActiveParams() { | |
212 |
1/2✓ Branch 1 taken 230 times.
✗ Branch 2 not taken.
|
460 | activeParameters_.setConstant(false); |
213 |
1/2✓ Branch 1 taken 230 times.
✗ Branch 2 not taken.
|
460 | activeDerivativeParameters_.setConstant(false); |
214 | |||
215 |
2/4✓ Branch 1 taken 230 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 230 times.
✗ Branch 5 not taken.
|
460 | setActiveParameters(robot_, joint1(), joint2(), activeParameters_, |
216 | 460 | activeDerivativeParameters_); | |
217 | 460 | } | |
218 | |||
219 | template <int _Options> | ||
220 | 49370 | void GenericTransformation<_Options>::impl_compute( | |
221 | LiegroupElementRef result, ConfigurationIn_t argument) const { | ||
222 | GTDataV<IsRelative, (bool)ComputePosition, (bool)ComputeOrientation, | ||
223 | (bool)OutputR3xSO3> | ||
224 |
1/2✓ Branch 1 taken 24707 times.
✗ Branch 2 not taken.
|
49370 | data(m_, robot_); |
225 | |||
226 |
2/4✓ Branch 1 taken 24709 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 24706 times.
✗ Branch 5 not taken.
|
49414 | data.device.currentConfiguration(argument); |
227 |
1/2✓ Branch 1 taken 24707 times.
✗ Branch 2 not taken.
|
49416 | data.device.computeForwardKinematics(pinocchio::JOINT_POSITION); |
228 | compute<IsRelative, (bool)ComputePosition, (bool)ComputeOrientation, | ||
229 |
1/2✓ Branch 1 taken 24705 times.
✗ Branch 2 not taken.
|
49414 | (bool)OutputR3xSO3>::error(data); |
230 | |||
231 |
2/4✓ Branch 1 taken 24704 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 24704 times.
✗ Branch 6 not taken.
|
49410 | result.vector() = Vindices_.rview(data.value); |
232 |
2/4✓ Branch 1 taken 24703 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 24703 times.
|
49408 | assert(hpp::pinocchio::checkNormalized(result)); |
233 | 49406 | } | |
234 | |||
235 | template <int _Options> | ||
236 | 7172 | void GenericTransformation<_Options>::impl_jacobian( | |
237 | matrixOut_t jacobian, ConfigurationIn_t arg) const { | ||
238 | // TODO there is still a little bit a memory which is dynamically | ||
239 | // allocated in GTDataJ. At the moment, this allocation is necessary to | ||
240 | // support multithreadind. To avoid it, DeviceData should provide some | ||
241 | // a temporary buffer to pass to an Eigen::Map | ||
242 | { | ||
243 | GTDataJ<IsRelative, (bool)ComputePosition, (bool)ComputeOrientation, | ||
244 | (bool)OutputR3xSO3> | ||
245 |
1/2✓ Branch 1 taken 3585 times.
✗ Branch 2 not taken.
|
7172 | data(m_, robot_); |
246 | |||
247 |
2/4✓ Branch 1 taken 3584 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3584 times.
✗ Branch 5 not taken.
|
7170 | data.device.currentConfiguration(arg); |
248 |
1/2✓ Branch 1 taken 3586 times.
✗ Branch 2 not taken.
|
7170 | data.device.computeForwardKinematics(pinocchio::JOINT_POSITION | |
249 | pinocchio::JACOBIAN); | ||
250 | compute<IsRelative, (bool)ComputePosition, (bool)ComputeOrientation, | ||
251 |
1/2✓ Branch 1 taken 3585 times.
✗ Branch 2 not taken.
|
7172 | (bool)OutputR3xSO3>::error(data); |
252 | compute<IsRelative, (bool)ComputePosition, (bool)ComputeOrientation, | ||
253 |
2/4✓ Branch 1 taken 3585 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3581 times.
✗ Branch 5 not taken.
|
7170 | (bool)OutputR3xSO3>::jacobian(data, jacobian, mask_); |
254 | 7162 | } | |
255 | |||
256 | #ifdef CHECK_JACOBIANS | ||
257 | const value_type eps = std::sqrt(Eigen::NumTraits<value_type>::epsilon()); | ||
258 | matrix_t Jfd(outputDerivativeSize(), inputDerivativeSize()); | ||
259 | Jfd.setZero(); | ||
260 | finiteDifferenceCentral(Jfd, arg, robot_, eps); | ||
261 | size_type row, col; | ||
262 | value_type maxError = (jacobian - Jfd).cwiseAbs().maxCoeff(&row, &col); | ||
263 | if (maxError > std::sqrt(eps)) { | ||
264 | hppDout( | ||
265 | error, "Jacobian of " | ||
266 | << name() | ||
267 | << " does not match central finite difference. " | ||
268 | "DOF " | ||
269 | << col << " at row " << row << ": " << maxError << " > " | ||
270 | << /* HESSIAN_MAXIMUM_COEF << " * " << */ std::sqrt(eps)); | ||
271 | hppDnum(error, "Jacobian is" << iendl << jacobian << iendl | ||
272 | << "Finite diff is" << iendl << Jfd << iendl | ||
273 | << "Difference is" << iendl | ||
274 | << (jacobian - Jfd)); | ||
275 | } | ||
276 | #endif | ||
277 | 7172 | } | |
278 | |||
279 | template <int _Options> | ||
280 | template <class Archive> | ||
281 | 44 | void GenericTransformation<_Options>::serialize(Archive& ar, | |
282 | const unsigned int version) { | ||
283 | (void)version; | ||
284 |
1/2✓ Branch 1 taken 22 times.
✗ Branch 2 not taken.
|
44 | ar& boost::serialization::make_nvp( |
285 | 44 | "base", boost::serialization::base_object<DifferentiableFunction>(*this)); | |
286 |
1/2✓ Branch 2 taken 22 times.
✗ Branch 3 not taken.
|
44 | ar& BOOST_SERIALIZATION_NVP(robot_); |
287 |
1/2✓ Branch 2 taken 22 times.
✗ Branch 3 not taken.
|
44 | ar& BOOST_SERIALIZATION_NVP(m_); |
288 |
1/2✓ Branch 1 taken 22 times.
✗ Branch 2 not taken.
|
44 | ar& boost::serialization::make_nvp("mask_", |
289 | 44 | const_cast<std::vector<bool>&>(mask_)); | |
290 |
1/2✓ Branch 2 taken 22 times.
✗ Branch 3 not taken.
|
44 | ar& BOOST_SERIALIZATION_NVP(self_); |
291 | } | ||
292 | |||
293 | /// Force instanciation of relevant classes | ||
294 | template class GenericTransformation<PositionBit | OrientationBit>; | ||
295 | template class GenericTransformation<PositionBit>; | ||
296 | template class GenericTransformation<OrientationBit>; | ||
297 | template class GenericTransformation<RelativeBit | PositionBit | | ||
298 | OrientationBit>; | ||
299 | template class GenericTransformation<RelativeBit | PositionBit>; | ||
300 | template class GenericTransformation<RelativeBit | OrientationBit>; | ||
301 | |||
302 | template class GenericTransformation<OutputR3xSO3Bit | PositionBit | | ||
303 | OrientationBit>; | ||
304 | // template class GenericTransformation< OutputR3xSO3Bit | PositionBit >; | ||
305 | template class GenericTransformation<OutputR3xSO3Bit | OrientationBit>; | ||
306 | template class GenericTransformation<OutputR3xSO3Bit | RelativeBit | | ||
307 | PositionBit | OrientationBit>; | ||
308 | // template class GenericTransformation< OutputR3xSO3Bit | RelativeBit | | ||
309 | // PositionBit >; | ||
310 | template class GenericTransformation<OutputR3xSO3Bit | RelativeBit | | ||
311 | OrientationBit>; | ||
312 | |||
313 | HPP_SERIALIZATION_IMPLEMENT(hpp::constraints::Position); | ||
314 | HPP_SERIALIZATION_IMPLEMENT(hpp::constraints::Orientation); | ||
315 | HPP_SERIALIZATION_IMPLEMENT(hpp::constraints::Transformation); | ||
316 | HPP_SERIALIZATION_IMPLEMENT(hpp::constraints::RelativePosition); | ||
317 | HPP_SERIALIZATION_IMPLEMENT(hpp::constraints::RelativeOrientation); | ||
318 | HPP_SERIALIZATION_IMPLEMENT(hpp::constraints::RelativeTransformation); | ||
319 | HPP_SERIALIZATION_IMPLEMENT(hpp::constraints::TransformationR3xSO3); | ||
320 | HPP_SERIALIZATION_IMPLEMENT(hpp::constraints::RelativeTransformationR3xSO3); | ||
321 | HPP_SERIALIZATION_IMPLEMENT(hpp::constraints::OrientationSO3); | ||
322 | HPP_SERIALIZATION_IMPLEMENT(hpp::constraints::RelativeOrientationSO3); | ||
323 | } // namespace constraints | ||
324 | } // namespace hpp | ||
325 | |||
326 | namespace boost { | ||
327 | namespace serialization { | ||
328 | using hpp::constraints::GenericTransformationModel; | ||
329 | |||
330 | #define _make_nvp(attr) make_nvp(#attr, m.attr) | ||
331 | template <class Archive> | ||
332 | 44 | inline void serialize(Archive& ar, GenericTransformationModel<false>& m, | |
333 | const unsigned int version) { | ||
334 | (void)version; | ||
335 | 44 | hpp::constraints::internal::serialize_joint(ar, "joint2", m.joint2); | |
336 |
1/2✓ Branch 2 taken 22 times.
✗ Branch 3 not taken.
|
44 | ar& _make_nvp(R1isID); |
337 |
1/2✓ Branch 2 taken 22 times.
✗ Branch 3 not taken.
|
44 | ar& _make_nvp(R2isID); |
338 |
1/2✓ Branch 2 taken 22 times.
✗ Branch 3 not taken.
|
44 | ar& _make_nvp(t1isZero); |
339 |
1/2✓ Branch 2 taken 22 times.
✗ Branch 3 not taken.
|
44 | ar& _make_nvp(t2isZero); |
340 |
1/2✓ Branch 2 taken 22 times.
✗ Branch 3 not taken.
|
44 | ar& _make_nvp(F1inJ1); |
341 |
1/2✓ Branch 2 taken 22 times.
✗ Branch 3 not taken.
|
44 | ar& _make_nvp(F2inJ2); |
342 |
1/2✓ Branch 2 taken 22 times.
✗ Branch 3 not taken.
|
44 | ar& _make_nvp(fullPos); |
343 |
1/2✓ Branch 2 taken 22 times.
✗ Branch 3 not taken.
|
44 | ar& _make_nvp(fullOri); |
344 |
1/2✓ Branch 2 taken 22 times.
✗ Branch 3 not taken.
|
44 | ar& _make_nvp(rowOri); |
345 |
1/2✓ Branch 2 taken 22 times.
✗ Branch 3 not taken.
|
44 | ar& make_nvp("cols", const_cast<hpp::constraints::size_type&>(m.cols)); |
346 | } | ||
347 | |||
348 | template <class Archive> | ||
349 | 24 | inline void serialize(Archive& ar, GenericTransformationModel<true>& m, | |
350 | const unsigned int version) { | ||
351 | (void)version; | ||
352 |
1/2✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
|
24 | ar& make_nvp( |
353 | "base", | ||
354 | 24 | boost::serialization::base_object<GenericTransformationModel<false> >(m)); | |
355 | 24 | hpp::constraints::internal::serialize_joint(ar, "joint1", m.joint1); | |
356 | } | ||
357 | } // namespace serialization | ||
358 | } // namespace boost | ||
359 | |||
360 | 12 | BOOST_CLASS_EXPORT(hpp::constraints::Position) | |
361 | 12 | BOOST_CLASS_EXPORT(hpp::constraints::Orientation) | |
362 | 12 | BOOST_CLASS_EXPORT(hpp::constraints::Transformation) | |
363 | 12 | BOOST_CLASS_EXPORT(hpp::constraints::RelativePosition) | |
364 | 12 | BOOST_CLASS_EXPORT(hpp::constraints::RelativeOrientation) | |
365 | 12 | BOOST_CLASS_EXPORT(hpp::constraints::RelativeTransformation) | |
366 | 12 | BOOST_CLASS_EXPORT(hpp::constraints::TransformationR3xSO3) | |
367 | 12 | BOOST_CLASS_EXPORT(hpp::constraints::RelativeTransformationR3xSO3) | |
368 | 12 | BOOST_CLASS_EXPORT(hpp::constraints::OrientationSO3) | |
369 | 12 | BOOST_CLASS_EXPORT(hpp::constraints::RelativeOrientationSO3) | |
370 |