Directory: | ./ |
---|---|
File: | src/explicit/input-configurations.hh |
Date: | 2025-05-05 12:19:30 |
Exec | Total | Coverage | |
---|---|---|---|
Lines: | 73 | 80 | 91.2% |
Branches: | 83 | 170 | 48.8% |
Line | Branch | Exec | Source |
---|---|---|---|
1 | // Copyright (c) 2020, Airbus SAS and CNRS | ||
2 | // Authors: Florent Lamiraux | ||
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 | #ifndef HPP_CONSTRAINTS_SRC_EXPLICIT_CONFIGURATION_HH | ||
30 | #define HPP_CONSTRAINTS_SRC_EXPLICIT_CONFIGURATION_HH | ||
31 | |||
32 | #include <hpp/constraints/matrix-view.hh> | ||
33 | #include <hpp/pinocchio/device.hh> | ||
34 | #include <hpp/pinocchio/joint.hh> | ||
35 | |||
36 | namespace hpp { | ||
37 | namespace constraints { | ||
38 | namespace explicit_ { | ||
39 | namespace { | ||
40 | using Eigen::BlockIndex; | ||
41 | 20 | inline BlockIndex::segments_t vectorOfBoolToIntervals(std::vector<bool>& v) { | |
42 | 20 | BlockIndex::segments_t ret; | |
43 |
2/2✓ Branch 1 taken 338 times.
✓ Branch 2 taken 20 times.
|
358 | for (std::size_t i = 0; i < v.size(); ++i) |
44 |
4/6✓ Branch 1 taken 338 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 104 times.
✓ Branch 5 taken 234 times.
✓ Branch 8 taken 104 times.
✗ Branch 9 not taken.
|
338 | if (v[i]) ret.push_back(BlockIndex::segment_t(i, 1)); |
45 |
1/2✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
|
20 | BlockIndex::shrink(ret); |
46 | 20 | return ret; | |
47 | } | ||
48 | |||
49 | // This function computes the configuration variables of | ||
50 | // - joint1 and its parents up to the common ancestor with joint2, | ||
51 | // - joint2 parent and its parents up to the common ancestor with | ||
52 | // joint1. | ||
53 | // Note that configuration variables of joint2 do not belong to | ||
54 | // the resulting set. | ||
55 | 12 | inline std::vector<bool> relPoseConfVariables(const DevicePtr_t& robot, | |
56 | JointConstPtr_t joint1, | ||
57 | JointConstPtr_t joint2) { | ||
58 |
2/4✓ Branch 3 taken 12 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 12 times.
✗ Branch 7 not taken.
|
12 | std::vector<bool> conf(robot->configSize(), false); |
59 |
5/6✓ Branch 1 taken 10 times.
✓ Branch 2 taken 12 times.
✓ Branch 5 taken 10 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 10 times.
✓ Branch 8 taken 12 times.
|
22 | while (joint1 && joint1->index() != 0) { |
60 |
3/4✓ Branch 2 taken 80 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 70 times.
✓ Branch 5 taken 10 times.
|
80 | for (size_type i = 0; i < joint1->configSize(); ++i) |
61 |
2/4✓ Branch 1 taken 70 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 70 times.
✗ Branch 5 not taken.
|
70 | conf[joint1->rankInConfiguration() + i] = |
62 |
2/4✓ Branch 2 taken 70 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 70 times.
✗ Branch 6 not taken.
|
140 | !conf[joint1->rankInConfiguration() + i]; |
63 | hppDout(info, "Adding joint1 " << joint1->name() << " as input variable."); | ||
64 |
1/2✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
|
10 | joint1 = joint1->parentJoint(); |
65 | } | ||
66 |
1/2✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
|
12 | joint2 = joint2->parentJoint(); |
67 |
2/6✗ Branch 1 not taken.
✓ Branch 2 taken 12 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 12 times.
|
12 | while (joint2 && joint2->index() != 0) { |
68 | ✗ | for (size_type i = 0; i < joint2->configSize(); ++i) | |
69 | ✗ | conf[joint2->rankInConfiguration() + i] = | |
70 | ✗ | !conf[joint2->rankInConfiguration() + i]; | |
71 | hppDout(info, "Adding joint2 " << joint2->name() << " as input variable."); | ||
72 | ✗ | joint2 = joint2->parentJoint(); | |
73 | } | ||
74 | 12 | return conf; | |
75 | } | ||
76 | |||
77 | // This function computes the velocity variables of | ||
78 | // - joint1 and its parents up to the root joint, | ||
79 | // - joint2 parent and its parent up to root joint. | ||
80 | // Note that velocity variables of joint2 do not belong to | ||
81 | // the resulting set. | ||
82 | 12 | inline std::vector<bool> relPoseVelVariables(const DevicePtr_t& robot, | |
83 | JointConstPtr_t joint1, | ||
84 | JointConstPtr_t joint2) { | ||
85 |
2/4✓ Branch 3 taken 12 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 12 times.
✗ Branch 7 not taken.
|
12 | std::vector<bool> vel(robot->numberDof(), false); |
86 |
5/6✓ Branch 1 taken 10 times.
✓ Branch 2 taken 12 times.
✓ Branch 5 taken 10 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 10 times.
✓ Branch 8 taken 12 times.
|
22 | while (joint1 && joint1->index() != 0) { |
87 |
3/4✓ Branch 2 taken 70 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 60 times.
✓ Branch 5 taken 10 times.
|
70 | for (size_type i = 0; i < joint1->numberDof(); ++i) |
88 |
4/8✓ Branch 2 taken 60 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 60 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 60 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 60 times.
✗ Branch 14 not taken.
|
60 | vel[joint1->rankInVelocity() + i] = !vel[joint1->rankInVelocity() + i]; |
89 | hppDout(info, "Adding joint1 " << joint1->name() << " as input variable."); | ||
90 |
1/2✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
|
10 | joint1 = joint1->parentJoint(); |
91 | } | ||
92 |
1/2✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
|
12 | joint2 = joint2->parentJoint(); |
93 |
2/6✗ Branch 1 not taken.
✓ Branch 2 taken 12 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 12 times.
|
12 | while (joint2 && joint2->index() != 0) { |
94 | ✗ | for (size_type i = 0; i < joint2->numberDof(); ++i) | |
95 | ✗ | vel[joint2->rankInVelocity() + i] = !vel[joint2->rankInVelocity() + i]; | |
96 | hppDout(info, "Adding joint2 " << joint2->name() << " as input variable."); | ||
97 | ✗ | joint2 = joint2->parentJoint(); | |
98 | } | ||
99 | 12 | return vel; | |
100 | } | ||
101 | } // namespace | ||
102 | namespace relativePose { | ||
103 | // This function computes the configuration variables of | ||
104 | // - joint1 and its parents up to the common ancestor with joint2, | ||
105 | // - joint2 parent and its parents up to the common ancestor with | ||
106 | // joint1. | ||
107 | // Note that configuration variables of joint2 do not belong to | ||
108 | // the resulting set. | ||
109 | 8 | inline BlockIndex::segments_t inputConfVariables(const DevicePtr_t& robot, | |
110 | JointConstPtr_t joint1, | ||
111 | JointConstPtr_t joint2) { | ||
112 |
1/2✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
|
16 | std::vector<bool> conf(relPoseConfVariables(robot, joint1, joint2)); |
113 |
1/2✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
|
16 | return vectorOfBoolToIntervals(conf); |
114 | 8 | } | |
115 | |||
116 | // This function computes the velocity variables of | ||
117 | // - joint1 and its parents up to the root joint, | ||
118 | // - joint2 parent and its parent up to root joint. | ||
119 | // Note that velocity variables of joint2 do not belong to | ||
120 | // the resulting set. | ||
121 | 8 | inline BlockIndex::segments_t inputVelocityVariables(const DevicePtr_t& robot, | |
122 | JointConstPtr_t joint1, | ||
123 | JointConstPtr_t joint2) { | ||
124 |
1/2✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
|
16 | std::vector<bool> vel(relPoseVelVariables(robot, joint1, joint2)); |
125 |
1/2✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
|
16 | return vectorOfBoolToIntervals(vel); |
126 | 8 | } | |
127 | |||
128 | // Return configuration variables of a joint | ||
129 | 9 | inline BlockIndex::segments_t jointConfInterval(JointConstPtr_t j) { | |
130 | return BlockIndex::segments_t( | ||
131 |
3/6✓ Branch 3 taken 9 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 9 times.
✗ Branch 8 not taken.
✓ Branch 11 taken 9 times.
✗ Branch 12 not taken.
|
18 | 1, BlockIndex::segment_t(j->rankInConfiguration(), j->configSize())); |
132 | } | ||
133 | // Return velocity variables of a joint | ||
134 | 9 | inline BlockIndex::segments_t jointVelInterval(JointConstPtr_t j) { | |
135 | return BlockIndex::segments_t( | ||
136 |
3/6✓ Branch 3 taken 9 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 9 times.
✗ Branch 8 not taken.
✓ Branch 11 taken 9 times.
✗ Branch 12 not taken.
|
18 | 1, BlockIndex::segment_t(j->rankInVelocity(), j->numberDof())); |
137 | } | ||
138 | } // namespace relativePose | ||
139 | namespace contact { | ||
140 | // Compute input configuration variables of | ||
141 | // explicit_::ConvexShapeContact. | ||
142 | 2 | inline BlockIndex::segments_t inputConfVariables( | |
143 | const DevicePtr_t& robot, const JointAndShapes_t& floorSurfaces, | ||
144 | const JointAndShapes_t& objectSurfaces) { | ||
145 |
2/4✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
|
2 | std::vector<bool> res(robot->configSize(), false); |
146 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
|
2 | assert(objectSurfaces.size() > 0); |
147 | 2 | JointPtr_t objectJoint = objectSurfaces.front().first; | |
148 | 2 | for (JointAndShapes_t::const_iterator it(floorSurfaces.begin()); | |
149 |
2/2✓ Branch 3 taken 4 times.
✓ Branch 4 taken 2 times.
|
6 | it != floorSurfaces.end(); ++it) { |
150 | 4 | JointPtr_t joint1(it->first); | |
151 | 4 | JointPtr_t joint2(objectJoint); | |
152 |
1/2✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
|
8 | std::vector<bool> conf(relPoseConfVariables(robot, joint1, joint2)); |
153 |
2/2✓ Branch 1 taken 56 times.
✓ Branch 2 taken 4 times.
|
60 | for (std::size_t i = 0; i < res.size(); ++i) { |
154 |
4/6✓ Branch 1 taken 56 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 28 times.
✓ Branch 5 taken 28 times.
✓ Branch 7 taken 28 times.
✗ Branch 8 not taken.
|
56 | if (conf[i]) res[i] = true; |
155 | } | ||
156 | 4 | } | |
157 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
4 | return vectorOfBoolToIntervals(res); |
158 | 2 | } | |
159 | |||
160 | // Compute size of input configuration variables of | ||
161 | // explicit_::ConvexShapeContact. | ||
162 | 1 | inline size_type inputSize(const DevicePtr_t& robot, | |
163 | const JointAndShapes_t& floorSurfaces, | ||
164 | const JointAndShapes_t& objectSurfaces) { | ||
165 | BlockIndex::segments_t variables( | ||
166 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | inputConfVariables(robot, floorSurfaces, objectSurfaces)); |
167 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | return (size_type)BlockIndex::cardinal(variables); |
168 | 1 | } | |
169 | // Compute input configuration variables of | ||
170 | // explicit_::ConvexShapeContact. | ||
171 | 2 | inline BlockIndex::segments_t inputVelocityVariables( | |
172 | const DevicePtr_t& robot, const JointAndShapes_t& floorSurfaces, | ||
173 | const JointAndShapes_t& objectSurfaces) { | ||
174 |
2/4✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
|
2 | std::vector<bool> res(robot->numberDof(), false); |
175 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
|
2 | assert(objectSurfaces.size() > 0); |
176 | 2 | JointPtr_t objectJoint = objectSurfaces.front().first; | |
177 | 2 | for (JointAndShapes_t::const_iterator it(floorSurfaces.begin()); | |
178 |
2/2✓ Branch 3 taken 4 times.
✓ Branch 4 taken 2 times.
|
6 | it != floorSurfaces.end(); ++it) { |
179 | 4 | JointPtr_t joint1(it->first); | |
180 | 4 | JointPtr_t joint2(objectJoint); | |
181 |
1/2✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
|
8 | std::vector<bool> conf(relPoseVelVariables(robot, joint1, joint2)); |
182 |
2/2✓ Branch 1 taken 48 times.
✓ Branch 2 taken 4 times.
|
52 | for (std::size_t i = 0; i < res.size(); ++i) { |
183 |
4/6✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 24 times.
✓ Branch 5 taken 24 times.
✓ Branch 7 taken 24 times.
✗ Branch 8 not taken.
|
48 | if (conf[i]) res[i] = true; |
184 | } | ||
185 | 4 | } | |
186 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
4 | return vectorOfBoolToIntervals(res); |
187 | 2 | } | |
188 | 1 | inline size_type inputDerivSize(const DevicePtr_t& robot, | |
189 | const JointAndShapes_t& floorSurfaces, | ||
190 | const JointAndShapes_t& objectSurfaces) { | ||
191 | BlockIndex::segments_t variables( | ||
192 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | inputVelocityVariables(robot, floorSurfaces, objectSurfaces)); |
193 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | return (size_type)BlockIndex::cardinal(variables); |
194 | 1 | } | |
195 | } // namespace contact | ||
196 | } // namespace explicit_ | ||
197 | } // namespace constraints | ||
198 | } // namespace hpp | ||
199 | |||
200 | #endif // HPP_CONSTRAINTS_SRC_EXPLICIT_CONFIGURATION_HH | ||
201 |