GCC Code Coverage Report


Directory: ./
File: include/hpp/constraints/explicit/relative-pose.hh
Date: 2025-05-05 12:19:30
Exec Total Coverage
Lines: 1 2 50.0%
Branches: 0 4 0.0%

Line Branch Exec Source
1 // Copyright (c) 2018, LAAS-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_EXPLICIT_RELATIVE_POSE_HH
30 #define HPP_CONSTRAINTS_EXPLICIT_RELATIVE_POSE_HH
31
32 #include <hpp/constraints/explicit.hh>
33 #include <pinocchio/spatial/se3.hpp>
34
35 namespace hpp {
36 namespace constraints {
37 namespace explicit_ {
38 /// Constraint of relative pose between two frames on a kinematic chain
39 ///
40 /// Given an input configuration \f$\mathbf{q}\f$, solving this constraint
41 /// consists in computing output variables with respect to input
42 /// variables:
43 /// \f[
44 /// \mathbf{q}_{out} = g(\mathbf{q}_{in})
45 ///\f]
46 /// where \f$\mathbf{q}_{out}\f$ are the configuration variables of
47 /// input joint2, \f${q}_{in}\f$ are the configuration variables
48 /// of input joint1 and parent joints, and \f$g\f$ is a mapping
49 /// with values is SE(3). Note that joint2 should be a
50 /// freeflyer joint.
51 ///
52 /// \note According to the documentation of class Explicit, the
53 /// implicit formulation should be
54 /// \f[
55 /// f(\mathbf{q}) = \mathbf{q}_{out} - g(\mathbf{q}_{in}).
56 /// \f]
57 /// As function \f$g\f$ takes values in SE(3), the above expression is
58 /// equivalent to
59 /// \f[
60 /// f(\mathbf{q}) = \log_{SE(3)}\left(g(\mathbf{q}_{in})^{-1}
61 /// \mathbf{q}_{out}\right)
62 /// \f]
63 /// that represents the log of the error of input joint2 pose
64 /// (\f$\mathbf{q}_{out}\f$) with respect to its desired value
65 /// (\f$g(\mathbf{q}_{in}\f$). The problem with this expression is
66 /// that it is different from the corresponding implicit formulation
67 /// hpp::constraints::RelativeTransformationR3xSO3 that compares the poses of
68 /// input joint1 and joint2. For manipulation planning applications where pairs
69 /// of constraints and complements are replaced by an explicit constraint,
70 /// this difference of formulation results in inconsistencies such as a
71 /// configuration satisfying one formulation (the error being below the
72 /// threshold) but not the other one. To cope with this issue, the default
73 /// implicit formulation is replaced by the one defined by class
74 /// hpp::constraints::RelativeTransformationR3xSO3.
75 class HPP_CONSTRAINTS_DLLAPI RelativePose : public Explicit {
76 public:
77 /// Copy object and return shared pointer to copy
78 virtual ImplicitPtr_t copy() const;
79 /// Create instance and return shared pointer
80 ///
81 /// \param name the name of the constraints,
82 /// \param robot the robot the constraints is applied to,
83 /// \param joint1 the first joint the transformation of which is
84 /// constrained,
85 /// \param joint2 the second joint the transformation of which is
86 /// constrained,
87 /// \param frame1 position of a fixed frame in joint 1,
88 /// \param frame2 position of a fixed frame in joint 2,
89 /// \param comp vector of comparison types
90 /// \param mask mask defining which components of the error are
91 /// taken into account to determine whether the constraint
92 /// is satisfied.
93 /// \note if joint1 is 0x0, joint 1 frame is considered to be the global
94 /// frame.
95 static RelativePosePtr_t create(
96 const std::string& name, const DevicePtr_t& robot,
97 const JointConstPtr_t& joint1, const JointConstPtr_t& joint2,
98 const Transform3s& frame1, const Transform3s& frame2,
99 ComparisonTypes_t comp, std::vector<bool> mask = std::vector<bool>());
100
101 static RelativePosePtr_t createCopy(const RelativePosePtr_t& other);
102
103 /// Compute the value of the output configuration variables
104 /// \param qin input configuration variables,
105 /// \param rhs right hand side of constraint
106 ///
107 /// \f{equation}
108 /// f \left(\mathbf{q}_{in}\right) + rhs_{expl}
109 /// \f}
110 /// where \f$rhs_{expl}\f$ is the explicit right hand side converted
111 /// using the following expression:
112 /// \f{equation}
113 /// rhs_{expl} = \log_{SE(3)}\left( F_{2/J_2} rhs_{impl} F_{2/J_2}^{-1}
114 /// \right)
115 /// \f}
116 virtual void outputValue(LiegroupElementRef result, vectorIn_t qin,
117 LiegroupElementConstRef rhs) const;
118
119 /// Compute Jacobian of output value
120 ///
121 /// \f{eqnarray*}
122 /// J &=& \frac{\partial}{\partial\mathbf{q}_{in}}\left(
123 /// f(\mathbf{q}_{in}) + rhs\right).
124 /// \f}
125 /// \param qin vector of input variables,
126 /// \param f_value \f$f(\mathbf{q}_{in})\f$ to avoid recomputation,
127 /// \param rhs right hand side (of implicit formulation).
128 virtual void jacobianOutputValue(vectorIn_t qin,
129 LiegroupElementConstRef f_value,
130 LiegroupElementConstRef rhs,
131 matrixOut_t jacobian) const;
132
133 protected:
134 /// Constructor
135 ///
136 /// \param name the name of the constraints,
137 /// \param robot the robot the constraints is applied to,
138 /// \param joint1 the first joint the transformation of which is
139 /// constrained,
140 /// \param joint2 the second joint the transformation of which is
141 /// constrained,
142 /// \param frame1 position of a fixed frame in joint 1,
143 /// \param frame2 position of a fixed frame in joint 2,
144 /// \param comp vector of comparison types
145 /// \param mask mask defining which components of the error are
146 /// taken into account to determine whether the constraint
147 /// is satisfied.
148 /// \note if joint1 is 0x0, joint 1 frame is considered to be the global
149 /// frame.
150 RelativePose(const std::string& name, const DevicePtr_t& robot,
151 const JointConstPtr_t& joint1, const JointConstPtr_t& joint2,
152 const Transform3s& frame1, const Transform3s& frame2,
153 ComparisonTypes_t comp = ComparisonTypes_t(),
154 std::vector<bool> mask = std::vector<bool>(6, true));
155
156 /// Copy constructor
157 RelativePose(const RelativePose& other);
158
159 /// Store weak pointer to itself
160 void init(RelativePoseWkPtr_t weak);
161
162 private:
163 /** Convert right hand side
164
165 \param implicitRhs right hand side of implicit formulation, this
166 is an element of $SE(3)$
167 \retval explicitRhs right hand side of explicit formulation, this
168 is an element of $\mathbf{R}^6$.
169
170 For this constraint, the implicit formulation does not derive
171 from the explicit formulation. The explicit form writes
172
173 \f{eqnarray}
174 rhs_{expl} &=& \log_{SE(3)} \left(F_{2/J_2} F_{1/J_1}^{-1} J_1^{-1}
175 J_2\right)\\
176 rhs_{impl} &=& F_{1/J_1}^{-1} J_1^{-1}J_2 F_{2/J_2}
177 \f}
178 Thus
179 \f{equation}
180 rhs_{expl} = \log_{SE(3)}\left( F_{2/J_2}rhs_{impl}
181 F_{2/J_2}^{-1}\right)
182 \f}
183 */
184 void implicitToExplicitRhs(LiegroupElementConstRef implicitRhs,
185 vectorOut_t explicitRhs) const;
186 /** Convert right hand side
187
188 \param explicitRhs right hand side of explicit formulation,
189 \retval implicitRhs right hand side of implicit formulation.
190
191 For this constraint, the implicit formulation does not derive
192 from the explicit formulation. The explicit form writes
193
194 \f{eqnarray}
195 rhs_{expl} &=& \log_{SE(3)} \left(F_{2/J_2} F_{1/J_1}^{-1} J_1^{-1}
196 J_2\right)\\
197 rhs_{impl} &=& F_{1/J_1}^{-1} J_1^{-1}J_2 F_{2/J_2}
198 \f}
199 Thus
200 \f{equation}
201 rhs_{impl} = F_{2/J_2}^{-1} \exp_{SE(3)}(rhs_{expl}) F_{2/J_2}
202 \f}
203 */
204 void explicitToImplicitRhs(vectorIn_t explicitRhs,
205 LiegroupElementRef implicitRhs) const;
206 // Create LiegroupSpace instances to avoid useless allocation.
207 static LiegroupSpacePtr_t SE3;
208 static LiegroupSpacePtr_t R3xSO3;
209 JointConstPtr_t joint1_, joint2_;
210 Transform3s frame1_;
211 Transform3s frame2_;
212 RelativePoseWkPtr_t weak_;
213
214 RelativePose() {}
215 HPP_SERIALIZABLE();
216 }; // class RelativePose
217 } // namespace explicit_
218 } // namespace constraints
219 } // namespace hpp
220
221 12 BOOST_CLASS_EXPORT_KEY(hpp::constraints::explicit_::RelativePose)
222
223 #endif // HPP_CONSTRAINTS_EXPLICIT_RELATIVE_POSE_HH
224