Directory: | ./ |
---|---|
File: | include/hpp/constraints/symbolic-function.hh |
Date: | 2025-05-05 12:19:30 |
Exec | Total | Coverage | |
---|---|---|---|
Lines: | 59 | 65 | 90.8% |
Branches: | 48 | 96 | 50.0% |
Line | Branch | Exec | Source |
---|---|---|---|
1 | // Copyright (c) 2015, LAAS-CNRS | ||
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 | #ifndef HPP_CONSTRAINTS_SYMBOLIC_FUNCTION_HH | ||
30 | #define HPP_CONSTRAINTS_SYMBOLIC_FUNCTION_HH | ||
31 | |||
32 | #include <hpp/constraints/config.hh> | ||
33 | #include <hpp/constraints/differentiable-function.hh> | ||
34 | #include <hpp/constraints/fwd.hh> | ||
35 | #include <hpp/constraints/symbolic-calculus.hh> | ||
36 | #include <hpp/pinocchio/device.hh> | ||
37 | #include <hpp/pinocchio/liegroup-element.hh> | ||
38 | |||
39 | namespace hpp { | ||
40 | namespace constraints { | ||
41 | |||
42 | /// Wrapper of a CalculusBaseAbstract derived object into a | ||
43 | /// DifferentiableFunction \note At the moment, it is not possible to write a | ||
44 | /// CalculusBaseAbstract | ||
45 | /// derived object that uses the extra config space of the robot. | ||
46 | template <typename Expression> | ||
47 | class HPP_CONSTRAINTS_DLLAPI SymbolicFunction : public DifferentiableFunction { | ||
48 | public: | ||
49 | typedef shared_ptr<SymbolicFunction> Ptr_t; | ||
50 | typedef weak_ptr<SymbolicFunction> WkPtr_t; | ||
51 | |||
52 | EIGEN_MAKE_ALIGNED_OPERATOR_NEW | ||
53 | |||
54 | /// Return a shared pointer to a new instance | ||
55 | 1 | static Ptr_t create(const std::string& name, const DevicePtr_t& robot, | |
56 | const typename Traits<Expression>::Ptr_t expr) { | ||
57 |
2/4✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
|
1 | std::vector<bool> mask(expr->value().size(), true); |
58 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
|
2 | return create(name, robot, expr, mask); |
59 | 1 | } | |
60 | |||
61 | /// Return a shared pointer to a new instance | ||
62 | 1 | static Ptr_t create(const std::string& name, const DevicePtr_t& robot, | |
63 | const typename Traits<Expression>::Ptr_t expr, | ||
64 | std::vector<bool> mask) { | ||
65 |
1/2✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
1 | assert(mask.size() == (std::size_t)expr->value().size()); |
66 |
4/8✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
|
2 | Ptr_t ptr(new SymbolicFunction(name, robot, expr, mask)); |
67 | 1 | ptr->init(ptr); | |
68 | 1 | return ptr; | |
69 | } | ||
70 | |||
71 | /// Return a shared pointer to a new instance | ||
72 | 52 | static Ptr_t create(const std::string& name, size_type sizeInput, | |
73 | size_type sizeInputDerivative, size_type sizeOutput, | ||
74 | const typename Traits<Expression>::Ptr_t expr) { | ||
75 |
1/2✓ Branch 2 taken 26 times.
✗ Branch 3 not taken.
|
52 | std::vector<bool> mask(sizeOutput, true); |
76 |
4/8✓ Branch 2 taken 26 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 26 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 26 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 26 times.
✗ Branch 12 not taken.
|
104 | Ptr_t ptr(new SymbolicFunction(name, sizeInput, sizeInputDerivative, |
77 | sizeOutput, expr, mask)); | ||
78 | 52 | ptr->init(ptr); | |
79 | 104 | return ptr; | |
80 | 52 | } | |
81 | |||
82 | 108 | virtual ~SymbolicFunction() {} | |
83 | |||
84 | 1 | SymbolicFunction(const std::string& name, const DevicePtr_t& robot, | |
85 | const typename Traits<Expression>::Ptr_t expr, | ||
86 | std::vector<bool> mask) | ||
87 | : DifferentiableFunction(robot->configSize(), robot->numberDof(), | ||
88 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | LiegroupSpace::Rn(expr->value().size()), name), |
89 | 1 | robot_(robot), | |
90 | 1 | expr_(expr), | |
91 |
5/10✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
|
3 | mask_(mask) { |
92 | 1 | size_type d = robot_->extraConfigSpace().dimension(); | |
93 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | activeParameters_.tail(d).setConstant(false); |
94 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | activeDerivativeParameters_.tail(d).setConstant(false); |
95 | 1 | } | |
96 | |||
97 | 52 | SymbolicFunction(const std::string& name, size_type sizeInput, | |
98 | size_type sizeInputDerivative, size_type sizeOutput, | ||
99 | const typename Traits<Expression>::Ptr_t expr, | ||
100 | std::vector<bool> mask) | ||
101 | : DifferentiableFunction(sizeInput, sizeInputDerivative, | ||
102 | LiegroupSpace::Rn(sizeOutput), name), | ||
103 | 52 | robot_(), | |
104 | 52 | expr_(expr), | |
105 |
3/6✓ Branch 2 taken 26 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 26 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 26 times.
✗ Branch 12 not taken.
|
104 | mask_(mask) {} |
106 | |||
107 | protected: | ||
108 | /// Compute value of error | ||
109 | /// | ||
110 | /// \param argument configuration of the robot, | ||
111 | /// \retval result error vector | ||
112 | 2718 | virtual void impl_compute(LiegroupElementRef result, | |
113 | ConfigurationIn_t argument) const { | ||
114 |
2/2✓ Branch 1 taken 100 times.
✓ Branch 2 taken 1309 times.
|
2718 | if (robot_) { |
115 |
1/2✓ Branch 3 taken 100 times.
✗ Branch 4 not taken.
|
100 | robot_->currentConfiguration(argument); |
116 | 100 | robot_->computeForwardKinematics(pinocchio::JOINT_POSITION); | |
117 | } | ||
118 | 2718 | expr_->invalidate(); | |
119 |
1/2✓ Branch 3 taken 1409 times.
✗ Branch 4 not taken.
|
2718 | expr_->computeValue(argument); |
120 | 2718 | size_t index = 0; | |
121 |
2/2✓ Branch 1 taken 1909 times.
✓ Branch 2 taken 1409 times.
|
5936 | for (std::size_t i = 0; i < mask_.size(); i++) { |
122 |
1/2✓ Branch 1 taken 1909 times.
✗ Branch 2 not taken.
|
3218 | if (mask_[i]) result.vector()[index++] = expr_->value()[i]; |
123 | } | ||
124 | 2718 | } | |
125 | |||
126 | 1312 | virtual void impl_jacobian(matrixOut_t jacobian, | |
127 | ConfigurationIn_t arg) const { | ||
128 |
2/2✓ Branch 1 taken 100 times.
✓ Branch 2 taken 606 times.
|
1312 | if (robot_) { |
129 |
1/2✓ Branch 3 taken 100 times.
✗ Branch 4 not taken.
|
100 | robot_->currentConfiguration(arg); |
130 | 100 | robot_->computeForwardKinematics(pinocchio::JOINT_POSITION | | |
131 | pinocchio::JACOBIAN); | ||
132 | } | ||
133 | 1312 | expr_->invalidate(); | |
134 |
1/2✓ Branch 3 taken 706 times.
✗ Branch 4 not taken.
|
1312 | expr_->computeJacobian(arg); |
135 | 1312 | size_t index = 0; | |
136 | |||
137 | 1312 | const typename Expression::JacobianType_t& Je(expr_->jacobian()); | |
138 | size_type nv; | ||
139 |
2/2✓ Branch 1 taken 100 times.
✓ Branch 2 taken 606 times.
|
1312 | if (robot_) { |
140 | 100 | size_type d = robot_->extraConfigSpace().dimension(); | |
141 | 100 | nv = Je.cols(); | |
142 |
1/2✗ Branch 3 not taken.
✓ Branch 4 taken 100 times.
|
100 | assert(robot_->numberDof() == Je.cols() + d); |
143 |
1/2✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
|
100 | jacobian.rightCols(d).setZero(); |
144 | } else { | ||
145 | 1212 | nv = jacobian.cols(); | |
146 | } | ||
147 | |||
148 |
2/2✓ Branch 1 taken 1206 times.
✓ Branch 2 taken 706 times.
|
3124 | for (std::size_t i = 0; i < mask_.size(); i++) { |
149 |
4/8✓ Branch 1 taken 1206 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1206 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1206 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1206 times.
✗ Branch 12 not taken.
|
1812 | if (mask_[i]) jacobian.row(index++).head(nv) = Je.row(i); |
150 | } | ||
151 | 1312 | } | |
152 | |||
153 | 53 | void init(const Ptr_t& self) { wkPtr_ = self; } | |
154 | |||
155 | 13 | bool isEqual(const DifferentiableFunction& other) const { | |
156 | ✗ | const SymbolicFunction& castother = | |
157 |
0/2✗ Branch 0 not taken.
✗ Branch 1 not taken.
|
13 | dynamic_cast<const SymbolicFunction&>(other); |
158 | ✗ | if (!DifferentiableFunction::isEqual(other)) return false; | |
159 | |||
160 | ✗ | if (robot_ != castother.robot_) return false; | |
161 | ✗ | if (expr_ != castother.expr_) return false; | |
162 | ✗ | if (mask_ != castother.mask_) return false; | |
163 | |||
164 | ✗ | return true; | |
165 | } | ||
166 | |||
167 | private: | ||
168 | WkPtr_t wkPtr_; | ||
169 | DevicePtr_t robot_; | ||
170 | typename Traits<Expression>::Ptr_t expr_; | ||
171 | std::vector<bool> mask_; | ||
172 | }; // class SymbolicFunction | ||
173 | } // namespace constraints | ||
174 | } // namespace hpp | ||
175 | #endif // HPP_CONSTRAINTS_SYMBOLIC_FUNCTION_HH | ||
176 |