| Directory: | ./ |
|---|---|
| File: | include/pinocchio/spatial/motion-ref.hpp |
| Date: | 2025-02-12 21:03:38 |
| Exec | Total | Coverage | |
|---|---|---|---|
| Lines: | 42 | 42 | 100.0% |
| Branches: | 4 | 8 | 50.0% |
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | // | ||
| 2 | // Copyright (c) 2017-2019 CNRS INRIA | ||
| 3 | // | ||
| 4 | |||
| 5 | #ifndef __pinocchio_spatial_motion_ref_hpp__ | ||
| 6 | #define __pinocchio_spatial_motion_ref_hpp__ | ||
| 7 | |||
| 8 | namespace pinocchio | ||
| 9 | { | ||
| 10 | |||
| 11 | template<typename Vector6ArgType> | ||
| 12 | struct traits<MotionRef<Vector6ArgType>> | ||
| 13 | { | ||
| 14 | typedef typename Vector6ArgType::Scalar Scalar; | ||
| 15 | typedef typename PINOCCHIO_EIGEN_PLAIN_TYPE(Vector6ArgType) Vector6; | ||
| 16 | enum | ||
| 17 | { | ||
| 18 | LINEAR = 0, | ||
| 19 | ANGULAR = 3, | ||
| 20 | Options = Vector6::Options | ||
| 21 | }; | ||
| 22 | typedef Eigen::Matrix<Scalar, 3, 1, Options> Vector3; | ||
| 23 | typedef Eigen::Matrix<Scalar, 4, 4, Options> Matrix4; | ||
| 24 | typedef Eigen::Matrix<Scalar, 6, 6, Options> Matrix6; | ||
| 25 | typedef Matrix6 ActionMatrixType; | ||
| 26 | typedef Matrix4 HomogeneousMatrixType; | ||
| 27 | typedef typename Vector6ArgType::template FixedSegmentReturnType<3>::Type LinearType; | ||
| 28 | typedef typename Vector6ArgType::template FixedSegmentReturnType<3>::Type AngularType; | ||
| 29 | typedef typename Vector6ArgType::template ConstFixedSegmentReturnType<3>::Type ConstLinearType; | ||
| 30 | typedef typename Vector6ArgType::template ConstFixedSegmentReturnType<3>::Type ConstAngularType; | ||
| 31 | typedef MotionTpl<Scalar, Options> MotionPlain; | ||
| 32 | typedef MotionPlain PlainReturnType; | ||
| 33 | typedef typename PINOCCHIO_EIGEN_REF_TYPE(Vector6ArgType) DataRefType; | ||
| 34 | typedef DataRefType ToVectorReturnType; | ||
| 35 | typedef typename PINOCCHIO_EIGEN_REF_CONST_TYPE(Vector6ArgType) ConstDataRefType; | ||
| 36 | typedef ConstDataRefType ToVectorConstReturnType; | ||
| 37 | typedef MotionRef<Vector6ArgType> MotionRefType; | ||
| 38 | |||
| 39 | }; // traits MotionRef | ||
| 40 | |||
| 41 | template<typename Vector6ArgType> | ||
| 42 | struct SE3GroupAction<MotionRef<Vector6ArgType>> | ||
| 43 | { | ||
| 44 | typedef typename traits<MotionRef<Vector6ArgType>>::MotionPlain ReturnType; | ||
| 45 | }; | ||
| 46 | |||
| 47 | template<typename Vector6ArgType, typename MotionDerived> | ||
| 48 | struct MotionAlgebraAction<MotionRef<Vector6ArgType>, MotionDerived> | ||
| 49 | { | ||
| 50 | typedef typename traits<MotionRef<Vector6ArgType>>::MotionPlain ReturnType; | ||
| 51 | }; | ||
| 52 | |||
| 53 | namespace internal | ||
| 54 | { | ||
| 55 | template<typename Vector6ArgType, typename Scalar> | ||
| 56 | struct RHSScalarMultiplication<MotionRef<Vector6ArgType>, Scalar> | ||
| 57 | { | ||
| 58 | typedef typename pinocchio::traits<MotionRef<Vector6ArgType>>::MotionPlain ReturnType; | ||
| 59 | }; | ||
| 60 | |||
| 61 | template<typename Vector6ArgType, typename Scalar> | ||
| 62 | struct LHSScalarMultiplication<MotionRef<Vector6ArgType>, Scalar> | ||
| 63 | { | ||
| 64 | typedef typename traits<MotionRef<Vector6ArgType>>::MotionPlain ReturnType; | ||
| 65 | }; | ||
| 66 | } // namespace internal | ||
| 67 | |||
| 68 | template<typename Vector6ArgType> | ||
| 69 | class MotionRef : public MotionDense<MotionRef<Vector6ArgType>> | ||
| 70 | { | ||
| 71 | public: | ||
| 72 | EIGEN_MAKE_ALIGNED_OPERATOR_NEW | ||
| 73 | typedef MotionDense<MotionRef> Base; | ||
| 74 | typedef typename traits<MotionRef>::DataRefType DataRefType; | ||
| 75 | MOTION_TYPEDEF_TPL(MotionRef); | ||
| 76 | |||
| 77 | using Base::operator=; | ||
| 78 | using Base::angular; | ||
| 79 | using Base::linear; | ||
| 80 | |||
| 81 | using Base::__mequ__; | ||
| 82 | using Base::__minus__; | ||
| 83 | using Base::__mult__; | ||
| 84 | using Base::__opposite__; | ||
| 85 | using Base::__pequ__; | ||
| 86 | using Base::__plus__; | ||
| 87 | |||
| 88 | /// \brief Default constructor from a 6 dimensional vector. | ||
| 89 | 237865 | MotionRef(typename PINOCCHIO_EIGEN_REF_TYPE(Vector6ArgType) v_like) | |
| 90 | 237865 | : m_ref(v_like) | |
| 91 | { | ||
| 92 | EIGEN_STATIC_ASSERT( | ||
| 93 | Vector6ArgType::ColsAtCompileTime == 1, YOU_TRIED_CALLING_A_VECTOR_METHOD_ON_A_MATRIX); | ||
| 94 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 119145 times.
|
237865 | assert(v_like.size() == 6); |
| 95 | 237865 | } | |
| 96 | |||
| 97 | /// \brief Copy constructor from another MotionRef. | ||
| 98 | MotionRef(const MotionRef & other) | ||
| 99 | : m_ref(other.m_ref) | ||
| 100 | { | ||
| 101 | } | ||
| 102 | |||
| 103 | 132092 | ToVectorConstReturnType toVector_impl() const | |
| 104 | { | ||
| 105 | 132092 | return m_ref; | |
| 106 | } | ||
| 107 | 886 | ToVectorReturnType toVector_impl() | |
| 108 | { | ||
| 109 | 886 | return m_ref; | |
| 110 | } | ||
| 111 | |||
| 112 | // Getters | ||
| 113 | 18052 | ConstAngularType angular_impl() const | |
| 114 | { | ||
| 115 | 18052 | return ConstAngularType(m_ref.derived(), ANGULAR); | |
| 116 | } | ||
| 117 | 5519 | ConstLinearType linear_impl() const | |
| 118 | { | ||
| 119 | 10497 | return ConstLinearType(m_ref.derived(), LINEAR); | |
| 120 | } | ||
| 121 | 109089 | AngularType angular_impl() | |
| 122 | { | ||
| 123 | 112029 | return m_ref.template segment<3>(ANGULAR); | |
| 124 | } | ||
| 125 | 56752 | LinearType linear_impl() | |
| 126 | { | ||
| 127 | 113622 | return m_ref.template segment<3>(LINEAR); | |
| 128 | } | ||
| 129 | |||
| 130 | template<typename V3> | ||
| 131 | void angular_impl(const Eigen::MatrixBase<V3> & w) | ||
| 132 | { | ||
| 133 | EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(V3, 3); | ||
| 134 | angular_impl() = w; | ||
| 135 | } | ||
| 136 | |||
| 137 | template<typename V3> | ||
| 138 | void linear_impl(const Eigen::MatrixBase<V3> & v) | ||
| 139 | { | ||
| 140 | EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(V3, 3); | ||
| 141 | linear_impl() = v; | ||
| 142 | } | ||
| 143 | |||
| 144 | // Specific operators for MotionTpl and MotionRef | ||
| 145 | template<typename S1, int O1> | ||
| 146 | MotionPlain __plus__(const MotionTpl<S1, O1> & v) const | ||
| 147 | { | ||
| 148 | return MotionPlain(m_ref + v.toVector()); | ||
| 149 | } | ||
| 150 | |||
| 151 | template<typename Vector6Like> | ||
| 152 | MotionPlain __plus__(const MotionRef<Vector6ArgType> & v) const | ||
| 153 | { | ||
| 154 | return MotionPlain(m_ref + v.toVector()); | ||
| 155 | } | ||
| 156 | |||
| 157 | template<typename S1, int O1> | ||
| 158 | MotionPlain __minus__(const MotionTpl<S1, O1> & v) const | ||
| 159 | { | ||
| 160 | return MotionPlain(m_ref - v.toVector()); | ||
| 161 | } | ||
| 162 | |||
| 163 | template<typename Vector6Like> | ||
| 164 | MotionPlain __minus__(const MotionRef<Vector6ArgType> & v) const | ||
| 165 | { | ||
| 166 | return MotionPlain(m_ref - v.toVector()); | ||
| 167 | } | ||
| 168 | |||
| 169 | template<typename S1, int O1> | ||
| 170 | 16292 | MotionRef & __pequ__(const MotionTpl<S1, O1> & v) | |
| 171 | { | ||
| 172 | 16292 | m_ref += v.toVector(); | |
| 173 | 16292 | return *this; | |
| 174 | } | ||
| 175 | |||
| 176 | template<typename Vector6Like> | ||
| 177 | MotionRef & __pequ__(const MotionRef<Vector6ArgType> & v) | ||
| 178 | { | ||
| 179 | m_ref += v.toVector(); | ||
| 180 | return *this; | ||
| 181 | } | ||
| 182 | |||
| 183 | template<typename S1, int O1> | ||
| 184 | 128 | MotionRef & __mequ__(const MotionTpl<S1, O1> & v) | |
| 185 | { | ||
| 186 | 128 | m_ref -= v.toVector(); | |
| 187 | 128 | return *this; | |
| 188 | } | ||
| 189 | |||
| 190 | template<typename Vector6Like> | ||
| 191 | MotionRef & __mequ__(const MotionRef<Vector6ArgType> & v) | ||
| 192 | { | ||
| 193 | m_ref -= v.toVector(); | ||
| 194 | return *this; | ||
| 195 | } | ||
| 196 | |||
| 197 | template<typename OtherScalar> | ||
| 198 | 257 | MotionPlain __mult__(const OtherScalar & alpha) const | |
| 199 | { | ||
| 200 |
1/2✓ Branch 2 taken 257 times.
✗ Branch 3 not taken.
|
257 | return MotionPlain(alpha * m_ref); |
| 201 | } | ||
| 202 | |||
| 203 | 2 | MotionRef & ref() | |
| 204 | { | ||
| 205 | 2 | return *this; | |
| 206 | } | ||
| 207 | |||
| 208 | 1 | inline PlainReturnType plain() const | |
| 209 | { | ||
| 210 | 1 | return PlainReturnType(m_ref); | |
| 211 | } | ||
| 212 | |||
| 213 | protected: | ||
| 214 | DataRefType m_ref; | ||
| 215 | |||
| 216 | }; // class MotionRef<Vector6Like> | ||
| 217 | |||
| 218 | template<typename Vector6ArgType> | ||
| 219 | struct traits<MotionRef<const Vector6ArgType>> | ||
| 220 | { | ||
| 221 | typedef typename Vector6ArgType::Scalar Scalar; | ||
| 222 | typedef typename PINOCCHIO_EIGEN_PLAIN_TYPE(Vector6ArgType) Vector6; | ||
| 223 | enum | ||
| 224 | { | ||
| 225 | LINEAR = 0, | ||
| 226 | ANGULAR = 3, | ||
| 227 | Options = Vector6::Options | ||
| 228 | }; | ||
| 229 | typedef Eigen::Matrix<Scalar, 3, 1, Options> Vector3; | ||
| 230 | typedef Eigen::Matrix<Scalar, 4, 4, Options> Matrix4; | ||
| 231 | typedef Eigen::Matrix<Scalar, 6, 6, Options> Matrix6; | ||
| 232 | typedef Matrix6 ActionMatrixType; | ||
| 233 | typedef Matrix4 HomogeneousMatrixType; | ||
| 234 | typedef typename Vector6ArgType::template ConstFixedSegmentReturnType<3>::Type ConstLinearType; | ||
| 235 | typedef typename Vector6ArgType::template ConstFixedSegmentReturnType<3>::Type ConstAngularType; | ||
| 236 | typedef ConstLinearType LinearType; | ||
| 237 | typedef ConstAngularType AngularType; | ||
| 238 | typedef MotionTpl<Scalar, Options> MotionPlain; | ||
| 239 | typedef MotionPlain PlainReturnType; | ||
| 240 | typedef typename PINOCCHIO_EIGEN_REF_CONST_TYPE(Vector6ArgType) ConstDataRefType; | ||
| 241 | typedef ConstDataRefType ToVectorConstReturnType; | ||
| 242 | typedef ConstDataRefType DataRefType; | ||
| 243 | typedef DataRefType ToVectorReturnType; | ||
| 244 | typedef MotionRef<const Vector6ArgType> MotionRefType; | ||
| 245 | |||
| 246 | }; // traits MotionRef<const Vector6ArgType> | ||
| 247 | |||
| 248 | template<typename Vector6ArgType> | ||
| 249 | class MotionRef<const Vector6ArgType> : public MotionDense<MotionRef<const Vector6ArgType>> | ||
| 250 | { | ||
| 251 | public: | ||
| 252 | EIGEN_MAKE_ALIGNED_OPERATOR_NEW | ||
| 253 | typedef MotionDense<MotionRef> Base; | ||
| 254 | typedef typename traits<MotionRef>::DataRefType DataRefType; | ||
| 255 | MOTION_TYPEDEF_TPL(MotionRef); | ||
| 256 | |||
| 257 | using Base::operator=; | ||
| 258 | using Base::angular; | ||
| 259 | using Base::linear; | ||
| 260 | |||
| 261 | using Base::__minus__; | ||
| 262 | using Base::__mult__; | ||
| 263 | using Base::__opposite__; | ||
| 264 | using Base::__plus__; | ||
| 265 | |||
| 266 | 415679 | MotionRef(typename PINOCCHIO_EIGEN_REF_CONST_TYPE(Vector6ArgType) v_like) | |
| 267 | 415679 | : m_ref(v_like) | |
| 268 | { | ||
| 269 | EIGEN_STATIC_ASSERT( | ||
| 270 | Vector6ArgType::ColsAtCompileTime == 1, YOU_TRIED_CALLING_A_VECTOR_METHOD_ON_A_MATRIX); | ||
| 271 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 209461 times.
|
415679 | assert(v_like.size() == 6); |
| 272 | 415679 | } | |
| 273 | |||
| 274 | /// \brief Copy constructor from another MotionRef. | ||
| 275 | MotionRef(const MotionRef & other) | ||
| 276 | : m_ref(other.m_ref) | ||
| 277 | { | ||
| 278 | } | ||
| 279 | |||
| 280 | 782 | ToVectorConstReturnType toVector_impl() const | |
| 281 | { | ||
| 282 | 782 | return m_ref; | |
| 283 | } | ||
| 284 | |||
| 285 | // Getters | ||
| 286 | 714541 | ConstAngularType angular_impl() const | |
| 287 | { | ||
| 288 | 714541 | return ConstAngularType(m_ref.derived(), ANGULAR); | |
| 289 | } | ||
| 290 | 39011 | ConstLinearType linear_impl() const | |
| 291 | { | ||
| 292 | 206230 | return ConstLinearType(m_ref.derived(), LINEAR); | |
| 293 | } | ||
| 294 | |||
| 295 | // Specific operators for MotionTpl and MotionRef | ||
| 296 | template<typename S1, int O1> | ||
| 297 | 1187 | MotionPlain __plus__(const MotionTpl<S1, O1> & v) const | |
| 298 | { | ||
| 299 |
1/2✓ Branch 3 taken 1187 times.
✗ Branch 4 not taken.
|
1187 | return MotionPlain(m_ref + v.toVector()); |
| 300 | } | ||
| 301 | |||
| 302 | template<typename Vector6Like> | ||
| 303 | MotionPlain __plus__(const MotionRef<Vector6ArgType> & v) const | ||
| 304 | { | ||
| 305 | return MotionPlain(m_ref + v.toVector()); | ||
| 306 | } | ||
| 307 | |||
| 308 | template<typename S1, int O1> | ||
| 309 | MotionPlain __minus__(const MotionTpl<S1, O1> & v) const | ||
| 310 | { | ||
| 311 | return MotionPlain(m_ref - v.toVector()); | ||
| 312 | } | ||
| 313 | |||
| 314 | template<typename Vector6Like> | ||
| 315 | MotionPlain __minus__(const MotionRef<Vector6ArgType> & v) const | ||
| 316 | { | ||
| 317 | return MotionPlain(m_ref - v.toVector()); | ||
| 318 | } | ||
| 319 | |||
| 320 | template<typename OtherScalar> | ||
| 321 | MotionPlain __mult__(const OtherScalar & alpha) const | ||
| 322 | { | ||
| 323 | return MotionPlain(alpha * m_ref); | ||
| 324 | } | ||
| 325 | |||
| 326 | const MotionRef & ref() const | ||
| 327 | { | ||
| 328 | return *this; | ||
| 329 | } | ||
| 330 | |||
| 331 | 4260 | inline PlainReturnType plain() const | |
| 332 | { | ||
| 333 | 4260 | return PlainReturnType(m_ref); | |
| 334 | } | ||
| 335 | |||
| 336 | protected: | ||
| 337 | DataRefType m_ref; | ||
| 338 | |||
| 339 | }; // class MotionRef<const Vector6Like> | ||
| 340 | |||
| 341 | } // namespace pinocchio | ||
| 342 | |||
| 343 | #endif // ifndef __pinocchio_spatial_motion_ref_hpp__ | ||
| 344 |