GCC Code Coverage Report


Directory: ./
File: include/hpp/pinocchio/device-sync.hh
Date: 2025-05-04 12:09:19
Exec Total Coverage
Lines: 26 42 61.9%
Branches: 8 24 33.3%

Line Branch Exec Source
1 //
2 // Copyright (c) 2016 CNRS
3 // Author: NMansard from 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_DEVICE_SYNC_HH
32 #define HPP_PINOCCHIO_DEVICE_SYNC_HH
33
34 #include <hpp/pinocchio/deprecated.hh>
35 #include <hpp/pinocchio/device-data.hh>
36 #include <hpp/pinocchio/fwd.hh>
37
38 namespace hpp {
39 namespace pinocchio {
40 /// Abstract class representing a Device.
41 class HPP_PINOCCHIO_DLLAPI AbstractDevice {
42 public:
43 /// \name Access to pinocchio API
44 /// \{
45
46 /// Access to pinocchio model
47 ModelConstPtr_t modelPtr() const { return model_; }
48 /// Access to pinocchio model
49 16292 ModelPtr_t modelPtr() { return model_; }
50 /// Access to pinocchio model
51 2291 const Model& model() const {
52
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2290 times.
2291 assert(model_);
53 2290 return *model_;
54 }
55 /// Access to pinocchio model
56 163834 Model& model() {
57
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 163834 times.
163834 assert(model_);
58 163834 return *model_;
59 }
60
61 /// Access to pinocchio geomModel
62 GeomModelConstPtr_t geomModelPtr() const { return geomModel_; }
63 /// Access to pinocchio geomModel
64 1000 GeomModelPtr_t geomModelPtr() { return geomModel_; }
65 /// Access to pinocchio geomModel
66 const GeomModel& geomModel() const {
67 assert(geomModel_);
68 return *geomModel_;
69 }
70 /// Access to pinocchio geomModel
71 152 GeomModel& geomModel() {
72
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 152 times.
152 assert(geomModel_);
73 152 return *geomModel_;
74 }
75
76 /// Access to Pinocchio data/
77 DataConstPtr_t dataPtr() const { return d().data_; }
78 /// Access to Pinocchio data/
79 11773 DataPtr_t dataPtr() { return d().data_; }
80 /// Access to Pinocchio data/
81 const Data& data() const {
82 assert(d().data_);
83 return *d().data_;
84 }
85 /// Access to Pinocchio data/
86 3341 Data& data() {
87
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 3341 times.
3341 assert(d().data_);
88 3341 return *d().data_;
89 }
90
91 /// Access to Pinocchio geomData/
92 GeomDataConstPtr_t geomDataPtr() const { return d().geomData_; }
93 /// Access to Pinocchio geomData/
94 81 GeomDataPtr_t geomDataPtr() { return d().geomData_; }
95 /// Access to Pinocchio geomData/
96 const GeomData& geomData() const {
97 assert(d().geomData_);
98 return *d().geomData_;
99 }
100 /// Access to Pinocchio geomData/
101 222 GeomData& geomData() {
102
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 222 times.
222 assert(d().geomData_);
103 222 return *d().geomData_;
104 }
105
106 /// \}
107 // -----------------------------------------------------------------------
108 /// \name Current state
109 /// \{
110
111 /// Get current configuration
112 const Configuration_t& currentConfiguration() const {
113 return d().currentConfiguration_;
114 }
115 /// Set current configuration
116 /// \return True if the current configuration was modified and false if
117 /// the current configuration did not change.
118 virtual bool currentConfiguration(ConfigurationIn_t configuration);
119
120 /// Get current velocity
121 const vector_t& currentVelocity() const { return d().currentVelocity_; }
122
123 /// Set current velocity
124 bool currentVelocity(vectorIn_t velocity);
125
126 /// Get current acceleration
127 const vector_t& currentAcceleration() const {
128 return d().currentAcceleration_;
129 }
130
131 /// Set current acceleration
132 bool currentAcceleration(vectorIn_t acceleration);
133 /// \}
134 // -----------------------------------------------------------------------
135 /// \name Mass and center of mass
136 /// \{
137
138 /// Get mass of robot
139 const value_type& mass() const;
140
141 /// Get position of center of mass
142 const vector3_t& positionCenterOfMass() const;
143
144 /// Get Jacobian of center of mass with respect to configuration
145 const ComJacobian_t& jacobianCenterOfMass() const;
146
147 /// \}
148 // -----------------------------------------------------------------------
149 /// \name Forward kinematics
150 /// \{
151
152 /// \deprecated Use computeForwardKinematics(Computation_t) instead to select
153 /// what should be computed.
154 HPP_PINOCCHIO_DEPRECATED void controlComputation(const Computation_t&) {}
155 /// \deprecated returns COMPUTE_ALL
156 HPP_PINOCCHIO_DEPRECATED Computation_t computationFlag() const {
157 return COMPUTE_ALL;
158 }
159 /// Compute forward kinematics computing everything
160 void computeForwardKinematics() { computeForwardKinematics(COMPUTE_ALL); }
161 /// Compute forward kinematics with custom computation flag
162 /// \param flag to customise the computation. This should be a bitwise OR
163 /// between Computation_t values.
164 2012 void computeForwardKinematics(int flag) {
165
1/2
✓ Branch 3 taken 2012 times.
✗ Branch 4 not taken.
2012 d().computeForwardKinematics(modelPtr(), flag);
166 2012 }
167 /// Compute frame forward kinematics
168 /// \note call AbstractDevice::computeForwardKinematics.
169 void computeFramesForwardKinematics() {
170 d().computeFramesForwardKinematics(modelPtr());
171 }
172 /// Update the geometry placement to the currentConfiguration
173 void updateGeometryPlacements() {
174 d().updateGeometryPlacements(modelPtr(), geomModelPtr());
175 }
176 /// \}
177 // -----------------------------------------------------------------------
178 protected:
179 AbstractDevice();
180 AbstractDevice(const ModelPtr_t& m, const GeomModelPtr_t& gm);
181
182 virtual DeviceData& d() = 0;
183 virtual DeviceData const& d() const = 0;
184
185 // Pinocchio objects
186 ModelPtr_t model_;
187 GeomModelPtr_t geomModel_;
188 }; // class AbstractDevice
189
190 /// A thread-safe access to a Device.
191 ///
192 /// To ensure thread safety, one can do
193 /// \code{cpp}
194 /// // In some place of the code:
195 /// DevicePtr_t device = ...;
196 /// device->numberDeviceData (4);
197 ///
198 /// // Acquires a lock on the device.
199 /// DeviceSync deviceSync (device);
200 /// deviceSync.currentConfiguration(q);
201 /// deviceSync.computeForwardKinematics(JOINT_POSITION | JACOBIAN);
202 ///
203 /// JointPtr_t joint = ...;
204 /// joint->currentTransformation (deviceSync.d());
205 ///
206 /// CollisionObjectPtr_t body = ...;
207 /// body->fcl (deviceSync.d());
208 /// body->getTransform (deviceSync.d());
209 ///
210 /// // The lock is release when deviceSync is destroyed.
211 /// \endcode
212 class HPP_PINOCCHIO_DLLAPI DeviceSync : public AbstractDevice {
213 public:
214 /// Constructor
215 /// \param device to lock
216 /// \param lock whether to acquire the lock.
217 DeviceSync(const DevicePtr_t& device, bool lock = true);
218
219 /// Destructor.
220 /// The lock is released if necessary.
221 virtual ~DeviceSync();
222
223 /// Accessor to the locked DeviceData.
224 /// \note this asserts that this isLocked()
225 3965 DeviceData& d() {
226
2/2
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 3982 times.
3965 assert(isLocked());
227 3982 return *d_;
228 }
229 /// Const accessor to the locked DeviceData.
230 /// \note this asserts that this isLocked()
231 DeviceData const& d() const {
232 assert(isLocked());
233 return *d_;
234 }
235
236 /// Lock the current DeviceData
237 void lock();
238 /// Check if the current DeviceData is locked
239 6950 bool isLocked() const { return d_ != NULL; }
240 /// Unlock the current DeviceData
241 void unlock();
242
243 private:
244 DevicePtr_t device_;
245 DeviceData* d_;
246 }; // class DeviceSync
247 } // namespace pinocchio
248 } // namespace hpp
249
250 #endif // HPP_PINOCCHIO_DEVICE_SYNC_HH
251