GCC Code Coverage Report


Directory: ./
File: src/com-between-feet.cc
Date: 2025-05-05 12:19:30
Exec Total Coverage
Lines: 0 76 0.0%
Branches: 0 148 0.0%

Line Branch Exec Source
1 //
2 // Copyright (c) 2015 CNRS
3 // Authors: Joseph Mirabel
4 //
5 //
6
7 // Redistribution and use in source and binary forms, with or without
8 // modification, are permitted provided that the following conditions are
9 // met:
10 //
11 // 1. Redistributions of source code must retain the above copyright
12 // notice, this list of conditions and the following disclaimer.
13 //
14 // 2. Redistributions in binary form must reproduce the above copyright
15 // notice, this list of conditions and the following disclaimer in the
16 // documentation and/or other materials provided with the distribution.
17 //
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 // HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
29 // DAMAGE.
30
31 #include <hpp/constraints/com-between-feet.hh>
32 #include <hpp/pinocchio/center-of-mass-computation.hh>
33 #include <hpp/pinocchio/device.hh>
34 #include <hpp/pinocchio/joint.hh>
35 #include <hpp/util/debug.hh>
36
37 namespace hpp {
38 namespace constraints {
39 namespace {
40 ✗ static size_type size(std::vector<bool> mask) {
41 ✗ size_type res = 0;
42 ✗ for (std::vector<bool>::iterator it = mask.begin(); it != mask.end(); ++it) {
43 ✗ if (*it) ++res;
44 }
45 ✗ return res;
46 }
47 } // namespace
48
49 ✗ ComBetweenFeetPtr_t ComBetweenFeet::create(
50 const std::string& name, const DevicePtr_t& robot, const JointPtr_t& jointL,
51 const JointPtr_t& jointR, const vector3_t pointL, const vector3_t pointR,
52 const JointPtr_t& jointRef, const vector3_t pointRef,
53 std::vector<bool> mask) {
54 ✗ CenterOfMassComputationPtr_t comc = CenterOfMassComputation::create(robot);
55 ✗ comc->add(robot->rootJoint());
56 return create(name, robot, comc, jointL, jointR, pointL, pointR, jointRef,
57 ✗ pointRef, mask);
58 }
59
60 ✗ ComBetweenFeetPtr_t ComBetweenFeet::create(
61 const std::string& name, const DevicePtr_t& robot,
62 const CenterOfMassComputationPtr_t& comc, const JointPtr_t& jointL,
63 const JointPtr_t& jointR, const vector3_t pointL, const vector3_t pointR,
64 const JointPtr_t& jointRef, const vector3_t pointRef,
65 std::vector<bool> mask) {
66 ComBetweenFeet* ptr =
67 new ComBetweenFeet(name, robot, comc, jointL, jointR, pointL, pointR,
68 ✗ jointRef, pointRef, mask);
69 ✗ ComBetweenFeetPtr_t shPtr(ptr);
70 ✗ return shPtr;
71 }
72
73 ✗ ComBetweenFeet::ComBetweenFeet(const std::string& name,
74 const DevicePtr_t& robot,
75 const CenterOfMassComputationPtr_t& comc,
76 const JointPtr_t& jointL,
77 const JointPtr_t& jointR, const vector3_t pointL,
78 const vector3_t pointR,
79 const JointPtr_t& jointRef,
80 ✗ const vector3_t pointRef, std::vector<bool> mask)
81 : DifferentiableFunction(robot->configSize(), robot->numberDof(),
82 ✗ LiegroupSpace::Rn(size(mask)), name),
83 ✗ robot_(robot),
84 ✗ com_(PointCom::create(comc)),
85 ✗ left_(PointInJoint::create(jointL, pointL)),
86 ✗ right_(PointInJoint::create(jointR, pointR)),
87 ✗ pointRef_(),
88 ✗ jointRef_(jointRef),
89 ✗ mask_(mask) {
90 ✗ cross_.setZero();
91 ✗ u_ = right_ - left_;
92 ✗ xmxl_ = com_ - left_;
93 ✗ xmxr_ = com_ - right_;
94 ✗ ecrossu_ = (com_ - (0.5 * (left_ + right_))) ^ (u_);
95 // expr_ = RotationMultiply <ECrossU_t> (jointRef_, ecrossu_, true);
96 ✗ expr_ = JointTranspose(jointRef_) * ecrossu_;
97 ✗ xmxlDotu_ = xmxl_ * u_;
98 ✗ xmxrDotu_ = xmxr_ * u_;
99 ✗ for (int i = 0; i < 3; i++) pointRef_[i] = pointRef[i];
100 }
101
102 ✗ void ComBetweenFeet::impl_compute(LiegroupElementRef result,
103 ConfigurationIn_t argument) const {
104 ✗ robot_->currentConfiguration(argument);
105 ✗ robot_->computeForwardKinematics(pinocchio::JOINT_POSITION);
106 ✗ size_t index = 0;
107 ✗ if (mask_[0]) {
108 ✗ com_->invalidate();
109 ✗ com_->computeValue(argument);
110 ✗ result.vector()[index++] = (com_->value() - pointRef_)[2];
111 }
112 ✗ if (mask_[1]) {
113 ✗ expr_->invalidate();
114 ✗ expr_->computeValue(argument);
115 ✗ result.vector()[index++] = expr_->value()[2];
116 }
117 ✗ if (mask_[2]) {
118 ✗ xmxlDotu_->invalidate();
119 ✗ xmxlDotu_->computeValue(argument);
120 ✗ result.vector()[index++] = xmxlDotu_->value()[0];
121 }
122 ✗ if (mask_[3]) {
123 ✗ xmxrDotu_->invalidate();
124 ✗ xmxrDotu_->computeValue(argument);
125 ✗ result.vector()[index] = xmxrDotu_->value()[0];
126 }
127 }
128
129 ✗ void ComBetweenFeet::impl_jacobian(matrixOut_t jacobian,
130 ConfigurationIn_t arg) const {
131 ✗ robot_->currentConfiguration(arg);
132 ✗ robot_->computeForwardKinematics(pinocchio::JOINT_POSITION |
133 pinocchio::JACOBIAN);
134 ✗ size_t index = 0;
135 ✗ if (mask_[0]) {
136 ✗ com_->invalidate();
137 ✗ com_->computeJacobian(arg);
138 ✗ jacobian.row(index++).leftCols(jointRef_->jacobian().cols()) =
139 ✗ com_->jacobian().row(2);
140 }
141 ✗ if (mask_[1]) {
142 ✗ expr_->invalidate();
143 ✗ expr_->computeJacobian(arg);
144 ✗ jacobian.row(index++).leftCols(jointRef_->jacobian().cols()) =
145 ✗ expr_->jacobian().row(2);
146 }
147 ✗ if (mask_[2]) {
148 ✗ xmxlDotu_->invalidate();
149 ✗ xmxlDotu_->computeJacobian(arg);
150 ✗ jacobian.row(index++).leftCols(jointRef_->jacobian().cols()) =
151 ✗ xmxlDotu_->jacobian();
152 }
153 ✗ if (mask_[3]) {
154 ✗ xmxrDotu_->invalidate();
155 ✗ xmxrDotu_->computeJacobian(arg);
156 ✗ jacobian.row(index).leftCols(jointRef_->jacobian().cols()) =
157 ✗ xmxrDotu_->jacobian();
158 }
159 }
160 } // namespace constraints
161 } // namespace hpp
162