GCC Code Coverage Report


Directory: ./
File: include/hpp/pinocchio/configuration.hh
Date: 2025-05-04 12:09:19
Exec Total Coverage
Lines: 8 8 100.0%
Branches: 10 18 55.6%

Line Branch Exec Source
1 //
2 // Copyright (c) 2014 CNRS
3 // Author: Florent Lamiraux
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 #ifndef HPP_PINOCCHIO_CONFIGURATION_HH
32 #define HPP_PINOCCHIO_CONFIGURATION_HH
33
34 #include <hpp/pinocchio/fwd.hh>
35 #include <iomanip>
36
37 namespace hpp {
38 namespace pinocchio {
39 /// Saturate joint parameter value so that they are not out of bounds.
40 ///
41 /// \param robot robot that describes the kinematic chain
42 /// \param[in,out] configuration initial and result configurations
43 /// \retval configuration reached after saturation.
44 void saturate(const DevicePtr_t& robot, ConfigurationOut_t configuration);
45
46 /// Saturate joint parameter value so that they are not out of bounds.
47 ///
48 /// \param robot robot that describes the kinematic chain
49 /// \param[in,out] configuration initial and result configurations
50 /// \retval saturation an array of boolean saying who saturated (size
51 /// robot.numberDof()).
52 bool saturate(const DevicePtr_t& robot, ConfigurationOut_t configuration,
53 ArrayXb& saturation);
54
55 /// Integrate a constant velocity during unit time.
56 ///
57 /// \tparam saturateConfig when true, calls
58 /// \c hpp::pinocchio::saturate(robot, result) at the end
59 /// \tparam LieGroup is a compile-time map of joint type to Lie group type,
60 /// that defines the joint-wise operations.
61 /// \param robot robot that describes the kinematic chain
62 /// \param configuration initial and result configurations
63 /// \param velocity velocity vector
64 /// \retval result configuration reached after integration.
65 /// Velocity is dispatched to each joint that integrates according to its
66 /// Lie group structure, i.e.
67 /// \li \f$q_i += v_i\f$ for translation joint and bounded rotation joints,
68 /// \li \f$q_i += v_i \mbox{ modulo } 2\pi\f$ for unbounded rotation joints,
69 /// \li constant rotation velocity for SO(3) joints.
70 ///
71 /// \note The default template arguments correspond to
72 /// \c integrate<true,DefaultLieGroupMap>.
73 template <bool saturateConfig, typename LieGroup>
74 void integrate(const DevicePtr_t& robot, ConfigurationIn_t configuration,
75 vectorIn_t velocity, ConfigurationOut_t result);
76
77 void integrate(const DevicePtr_t& robot, ConfigurationIn_t configuration,
78 vectorIn_t velocity, ConfigurationOut_t result);
79
80 /// Interpolate between two configurations of the robot
81 ///
82 /// \tparam LieGroup is a compile-time map of joint type to Lie group type,
83 /// that defines the joint-wise operations.
84 /// \param robot robot that describes the kinematic chain
85 /// \param q0, q1 two configurations to interpolate
86 /// \param u in [0,1] position along the interpolation: q0 for u=0,
87 /// q1 for u=1
88 /// \retval result interpolated configuration
89 ///
90 /// \note The default template arguments correspond to
91 /// \c interpolate<RnxSOnLieGroupMap>.
92 template <typename LieGroup>
93 void interpolate(const DevicePtr_t& robot, ConfigurationIn_t q0,
94 ConfigurationIn_t q1, const value_type& u,
95 ConfigurationOut_t result);
96
97 void interpolate(const DevicePtr_t& robot, ConfigurationIn_t q0,
98 ConfigurationIn_t q1, const value_type& u,
99 ConfigurationOut_t result);
100
101 /// Difference between two configurations as a vector
102 ///
103 /// \tparam LieGroup is a compile-time map of joint type to Lie group type,
104 /// that defines the joint-wise operations.
105 /// \param robot robot that describes the kinematic chain
106 /// \param q1 first configuration,
107 /// \param q2 second configuration,
108 /// \retval result difference as a vector \f$\textbf{v}\f$ such that
109 /// q1 is the result of method integrate from q2 with vector
110 /// \f$\textbf{v}\f$
111 /// \note If the configuration space is a vector space, this is
112 /// \f$\textbf{v} = q_1 - q_2\f$
113 ///
114 /// \note The default template arguments correspond to
115 /// \c difference<RnxSOnLieGroupMap>.
116 template <typename LieGroup>
117 void difference(const DevicePtr_t& robot, ConfigurationIn_t q1,
118 ConfigurationIn_t q2, vectorOut_t result);
119
120 void difference(const DevicePtr_t& robot, ConfigurationIn_t q1,
121 ConfigurationIn_t q2, vectorOut_t result);
122
123 /// Test that two configurations are close
124 ///
125 /// \param robot robot that describes the kinematic chain
126 /// \param q1 first configuration,
127 /// \param q2 second configuration,
128 /// \param eps numerical threshold
129 /// \return true if the configurations are closer than the numerical
130 /// threshold
131 bool isApprox(const DevicePtr_t& robot, ConfigurationIn_t q1,
132 ConfigurationIn_t q2, value_type eps);
133
134 /// Distance between two configuration.
135 ///
136 /// \param robot robot that describes the kinematic chain
137 /// \param q1 first configuration,
138 /// \param q2 second configuration,
139 value_type distance(const DevicePtr_t& robot, ConfigurationIn_t q1,
140 ConfigurationIn_t q2);
141
142 /// Normalize configuration
143 ///
144 /// Configuration space is a represented by a sub-manifold of a vector
145 /// space. Normalization consists in projecting a vector on this
146 /// sub-manifold. It mostly consists in normalizing quaternions for
147 /// SO3 joints and 2D-vectors for unbounded rotations.
148 void normalize(const DevicePtr_t& robot, Configuration_t& q);
149
150 /// For backward compatibility.
151 /// See normalize normalize (const DevicePtr_t&, Configuration_t&)
152 inline void normalize(const DevicePtr_t& robot, ConfigurationOut_t q) {
153 Configuration_t qq = q;
154 normalize(robot, qq);
155 q = qq;
156 }
157
158 /// Check if a configuration is normalized
159 ///
160 /// It consists in checking that norm of quaternions and complex is one.
161 bool isNormalized(const DevicePtr_t& robot, ConfigurationIn_t q,
162 const value_type& eps);
163
164 /// Write configuration in a string
165 48 inline std::string displayConfig(ConfigurationIn_t q, int precision = 20) {
166
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 std::ostringstream oss;
167
2/4
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 48 times.
✗ Branch 6 not taken.
48 oss << "(" << std::setprecision(precision);
168
2/2
✓ Branch 1 taken 928 times.
✓ Branch 2 taken 48 times.
976 for (size_type i = 0; i < q.size(); ++i) {
169
3/6
✓ Branch 1 taken 928 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 928 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 928 times.
✗ Branch 8 not taken.
928 oss << q[i] << ",";
170 }
171
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
48 oss << ")";
172
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
96 return oss.str();
173 48 }
174
175 /// Write a SE3 taking into account the indentation
176 std::ostream& display(std::ostream& os, const SE3& m);
177 } // namespace pinocchio
178 } // namespace hpp
179 #endif // HPP_PINOCCHIO_CONFIGURATION_HH
180