GCC Code Coverage Report


Directory: ./
File: include/crocoddyl/multibody/impulses/impulse-3d.hpp
Date: 2025-01-16 08:47:40
Exec Total Coverage
Lines: 21 21 100.0%
Branches: 22 44 50.0%

Line Branch Exec Source
1 ///////////////////////////////////////////////////////////////////////////////
2 // BSD 3-Clause License
3 //
4 // Copyright (C) 2019-2023, LAAS-CNRS, University of Edinburgh,
5 // Heriot-Watt University
6 // Copyright note valid unless otherwise stated in individual files.
7 // All rights reserved.
8 ///////////////////////////////////////////////////////////////////////////////
9
10 #ifndef CROCODDYL_MULTIBODY_IMPULSES_IMPULSE_3D_HPP_
11 #define CROCODDYL_MULTIBODY_IMPULSES_IMPULSE_3D_HPP_
12
13 #include <pinocchio/multibody/data.hpp>
14 #include <pinocchio/spatial/motion.hpp>
15
16 #include "crocoddyl/multibody/fwd.hpp"
17 #include "crocoddyl/multibody/impulse-base.hpp"
18
19 namespace crocoddyl {
20
21 template <typename _Scalar>
22 class ImpulseModel3DTpl : public ImpulseModelAbstractTpl<_Scalar> {
23 public:
24 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
25
26 typedef _Scalar Scalar;
27 typedef MathBaseTpl<Scalar> MathBase;
28 typedef ImpulseModelAbstractTpl<Scalar> Base;
29 typedef ImpulseData3DTpl<Scalar> Data;
30 typedef StateMultibodyTpl<Scalar> StateMultibody;
31 typedef ImpulseDataAbstractTpl<Scalar> ImpulseDataAbstract;
32 typedef typename MathBase::Vector2s Vector2s;
33 typedef typename MathBase::Vector3s Vector3s;
34 typedef typename MathBase::VectorXs VectorXs;
35 typedef typename MathBase::MatrixXs Matrix3s;
36 typedef typename MathBase::MatrixXs MatrixXs;
37
38 /**
39 * @brief Initialize the 3d impulse model
40 *
41 * @param[in] state State of the multibody system
42 * @param[in] id Reference frame id of the impulse
43 * @param[in] type Type of impulse (default LOCAL)
44 */
45 ImpulseModel3DTpl(
46 boost::shared_ptr<StateMultibody> state, const pinocchio::FrameIndex id,
47 const pinocchio::ReferenceFrame type = pinocchio::ReferenceFrame::LOCAL);
48 virtual ~ImpulseModel3DTpl();
49
50 /**
51 * @brief Compute the 6d impulse Jacobian
52 *
53 * @param[in] data 6d impulse data
54 * @param[in] x State point \f$\mathbf{x}\in\mathbb{R}^{ndx}\f$
55 */
56 virtual void calc(const boost::shared_ptr<ImpulseDataAbstract>& data,
57 const Eigen::Ref<const VectorXs>& x);
58
59 /**
60 * @brief Compute the derivatives of the 6d impulse holonomic constraint
61 *
62 * @param[in] data 6d impulse data
63 * @param[in] x State point \f$\mathbf{x}\in\mathbb{R}^{ndx}\f$
64 */
65 virtual void calcDiff(const boost::shared_ptr<ImpulseDataAbstract>& data,
66 const Eigen::Ref<const VectorXs>& x);
67
68 /**
69 * @brief Convert the force into a stack of spatial forces
70 *
71 * @param[in] data 6d impulse data
72 * @param[in] force 6d impulse
73 */
74 virtual void updateForce(const boost::shared_ptr<ImpulseDataAbstract>& data,
75 const VectorXs& force);
76
77 /**
78 * @brief Create the 6d impulse data
79 */
80 virtual boost::shared_ptr<ImpulseDataAbstract> createData(
81 pinocchio::DataTpl<Scalar>* const data);
82
83 /**
84 * @brief Print relevant information of the 3d impulse model
85 *
86 * @param[out] os Output stream object
87 */
88 virtual void print(std::ostream& os) const;
89
90 protected:
91 using Base::id_;
92 using Base::state_;
93 using Base::type_;
94 };
95
96 template <typename _Scalar>
97 struct ImpulseData3DTpl : public ImpulseDataAbstractTpl<_Scalar> {
98 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
99
100 typedef _Scalar Scalar;
101 typedef MathBaseTpl<Scalar> MathBase;
102 typedef ImpulseDataAbstractTpl<Scalar> Base;
103 typedef typename MathBase::Vector3s Vector3s;
104 typedef typename MathBase::Matrix3s Matrix3s;
105 typedef typename MathBase::Matrix3xs Matrix3xs;
106 typedef typename MathBase::Matrix6xs Matrix6xs;
107 typedef typename pinocchio::ForceTpl<Scalar> Force;
108
109 template <template <typename Scalar> class Model>
110 3488 ImpulseData3DTpl(Model<Scalar>* const model,
111 pinocchio::DataTpl<Scalar>* const data)
112 : Base(model, data),
113
1/2
✓ Branch 1 taken 3488 times.
✗ Branch 2 not taken.
3488 f_local(Force::Zero()),
114
1/2
✓ Branch 4 taken 3488 times.
✗ Branch 5 not taken.
3488 dv0_local_dq(3, model->get_state()->get_nv()),
115
1/2
✓ Branch 4 taken 3488 times.
✗ Branch 5 not taken.
3488 fJf(6, model->get_state()->get_nv()),
116
1/2
✓ Branch 4 taken 3488 times.
✗ Branch 5 not taken.
3488 v_partial_dq(6, model->get_state()->get_nv()),
117
1/2
✓ Branch 4 taken 3488 times.
✗ Branch 5 not taken.
3488 v_partial_dv(6, model->get_state()->get_nv()),
118
5/10
✓ Branch 2 taken 3488 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 3488 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 3488 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 3488 times.
✗ Branch 12 not taken.
✓ Branch 17 taken 3488 times.
✗ Branch 18 not taken.
6976 fJf_df(3, model->get_state()->get_nv()) {
119 3488 frame = model->get_id();
120 3488 jMf =
121
1/2
✓ Branch 7 taken 3488 times.
✗ Branch 8 not taken.
3488 model->get_state()->get_pinocchio()->frames[model->get_id()].placement;
122
2/4
✓ Branch 1 taken 3488 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3488 times.
✗ Branch 5 not taken.
3488 fXj = jMf.inverse().toActionMatrix();
123
1/2
✓ Branch 1 taken 3488 times.
✗ Branch 2 not taken.
3488 v0.setZero();
124
1/2
✓ Branch 1 taken 3488 times.
✗ Branch 2 not taken.
3488 dv0_local_dq.setZero();
125
1/2
✓ Branch 1 taken 3488 times.
✗ Branch 2 not taken.
3488 fJf.setZero();
126
1/2
✓ Branch 1 taken 3488 times.
✗ Branch 2 not taken.
3488 v_partial_dq.setZero();
127
1/2
✓ Branch 1 taken 3488 times.
✗ Branch 2 not taken.
3488 v_partial_dv.setZero();
128
1/2
✓ Branch 1 taken 3488 times.
✗ Branch 2 not taken.
3488 v0_skew.setZero();
129
1/2
✓ Branch 1 taken 3488 times.
✗ Branch 2 not taken.
3488 v0_world_skew.setZero();
130
1/2
✓ Branch 1 taken 3488 times.
✗ Branch 2 not taken.
3488 f_skew.setZero();
131
1/2
✓ Branch 1 taken 3488 times.
✗ Branch 2 not taken.
3488 fJf_df.setZero();
132 3488 }
133
134 using Base::df_dx;
135 using Base::dv0_dq;
136 using Base::f;
137 using Base::frame;
138 using Base::fXj;
139 using Base::Jc;
140 using Base::jMf;
141 using Base::pinocchio;
142
143 Vector3s v0;
144 Force f_local;
145 Matrix3xs dv0_local_dq;
146 Matrix6xs fJf;
147 Matrix6xs v_partial_dq;
148 Matrix6xs v_partial_dv;
149 Matrix3s v0_skew;
150 Matrix3s v0_world_skew;
151 Matrix3s f_skew;
152 Matrix3xs fJf_df;
153 };
154
155 } // namespace crocoddyl
156
157 /* --- Details -------------------------------------------------------------- */
158 /* --- Details -------------------------------------------------------------- */
159 /* --- Details -------------------------------------------------------------- */
160 #include "crocoddyl/multibody/impulses/impulse-3d.hxx"
161
162 #endif // CROCODDYL_MULTIBODY_IMPULSES_IMPULSE_3D_HPP_
163