GCC Code Coverage Report


Directory: ./
File: include/crocoddyl/multibody/residuals/contact-cop-position.hxx
Date: 2025-01-16 08:47:40
Exec Total Coverage
Lines: 42 56 75.0%
Branches: 15 62 24.2%

Line Branch Exec Source
1 ///////////////////////////////////////////////////////////////////////////////
2 // BSD 3-Clause License
3 //
4 // Copyright (C) 2020-2023, University of Duisburg-Essen, University of
5 // Edinburgh,
6 // Heriot-Watt University
7 // Copyright note valid unless otherwise stated in individual files.
8 // All rights reserved.
9 ///////////////////////////////////////////////////////////////////////////////
10
11 #include "crocoddyl/multibody/residuals/contact-cop-position.hpp"
12
13 namespace crocoddyl {
14
15 template <typename _Scalar>
16 32 ResidualModelContactCoPPositionTpl<_Scalar>::ResidualModelContactCoPPositionTpl(
17 boost::shared_ptr<StateMultibody> state, const pinocchio::FrameIndex id,
18 const CoPSupport& cref, const std::size_t nu, const bool fwddyn)
19 : Base(state, 4, nu, fwddyn ? true : false, fwddyn ? true : false, true),
20 32 fwddyn_(fwddyn),
21 32 update_jacobians_(true),
22 32 id_(id),
23
4/8
✓ Branch 0 taken 32 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 32 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 32 times.
✗ Branch 7 not taken.
✓ Branch 10 taken 32 times.
✗ Branch 11 not taken.
32 cref_(cref) {}
24
25 template <typename _Scalar>
26 1 ResidualModelContactCoPPositionTpl<_Scalar>::ResidualModelContactCoPPositionTpl(
27 boost::shared_ptr<StateMultibody> state, const pinocchio::FrameIndex id,
28 const CoPSupport& cref)
29 : Base(state, 4),
30 1 fwddyn_(true),
31 1 update_jacobians_(true),
32 1 id_(id),
33
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
1 cref_(cref) {}
34
35 template <typename Scalar>
36 70 ResidualModelContactCoPPositionTpl<
37 70 Scalar>::~ResidualModelContactCoPPositionTpl() {}
38
39 template <typename Scalar>
40 3416 void ResidualModelContactCoPPositionTpl<Scalar>::calc(
41 const boost::shared_ptr<ResidualDataAbstract>& data,
42 const Eigen::Ref<const VectorXs>&, const Eigen::Ref<const VectorXs>&) {
43 3416 Data* d = static_cast<Data*>(data.get());
44
45 // Compute the residual residual r = A * f
46
2/4
✓ Branch 6 taken 3416 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 3416 times.
✗ Branch 10 not taken.
3416 data->r.noalias() = cref_.get_A() * d->contact->f.toVector();
47 3416 }
48
49 template <typename Scalar>
50 2628 void ResidualModelContactCoPPositionTpl<Scalar>::calc(
51 const boost::shared_ptr<ResidualDataAbstract>& data,
52 const Eigen::Ref<const VectorXs>&) {
53 2628 data->r.setZero();
54 2628 }
55
56 template <typename Scalar>
57 38 void ResidualModelContactCoPPositionTpl<Scalar>::calcDiff(
58 const boost::shared_ptr<ResidualDataAbstract>& data,
59 const Eigen::Ref<const VectorXs>&, const Eigen::Ref<const VectorXs>&) {
60
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 38 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
38 if (fwddyn_ || update_jacobians_) {
61 38 updateJacobians(data);
62 }
63 38 }
64
65 template <typename Scalar>
66 34 void ResidualModelContactCoPPositionTpl<Scalar>::calcDiff(
67 const boost::shared_ptr<ResidualDataAbstract>& data,
68 const Eigen::Ref<const VectorXs>&) {
69 34 data->Rx.setZero();
70 34 }
71
72 template <typename Scalar>
73 boost::shared_ptr<ResidualDataAbstractTpl<Scalar> >
74 3418 ResidualModelContactCoPPositionTpl<Scalar>::createData(
75 DataCollectorAbstract* const data) {
76
1/2
✓ Branch 1 taken 3418 times.
✗ Branch 2 not taken.
6836 boost::shared_ptr<ResidualDataAbstract> d = boost::allocate_shared<Data>(
77 3418 Eigen::aligned_allocator<Data>(), this, data);
78
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3418 times.
3418 if (!fwddyn_) {
79 updateJacobians(d);
80 }
81 3418 return d;
82 }
83
84 template <typename Scalar>
85 38 void ResidualModelContactCoPPositionTpl<Scalar>::updateJacobians(
86 const boost::shared_ptr<ResidualDataAbstract>& data) {
87 38 Data* d = static_cast<Data*>(data.get());
88
89 38 const MatrixXs& df_dx = d->contact->df_dx;
90 38 const MatrixXs& df_du = d->contact->df_du;
91 38 const Matrix46& A = cref_.get_A();
92
2/4
✓ Branch 3 taken 38 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 38 times.
✗ Branch 7 not taken.
38 data->Rx.noalias() = A * df_dx;
93
2/4
✓ Branch 3 taken 38 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 38 times.
✗ Branch 7 not taken.
38 data->Ru.noalias() = A * df_du;
94 38 update_jacobians_ = false;
95 38 }
96
97 template <typename Scalar>
98 void ResidualModelContactCoPPositionTpl<Scalar>::print(std::ostream& os) const {
99 boost::shared_ptr<StateMultibody> s =
100 boost::static_pointer_cast<StateMultibody>(state_);
101 const Eigen::IOFormat fmt(2, Eigen::DontAlignCols, ", ", ";\n", "", "", "[",
102 "]");
103 os << "ResidualModelContactCoPPosition {frame="
104 << s->get_pinocchio()->frames[id_].name
105 << ", box=" << cref_.get_box().transpose().format(fmt) << "}";
106 }
107
108 template <typename Scalar>
109 bool ResidualModelContactCoPPositionTpl<Scalar>::is_fwddyn() const {
110 return fwddyn_;
111 }
112
113 template <typename Scalar>
114 3418 pinocchio::FrameIndex ResidualModelContactCoPPositionTpl<Scalar>::get_id()
115 const {
116 3418 return id_;
117 }
118
119 template <typename Scalar>
120 const CoPSupportTpl<Scalar>&
121 ResidualModelContactCoPPositionTpl<Scalar>::get_reference() const {
122 return cref_;
123 }
124
125 template <typename Scalar>
126 void ResidualModelContactCoPPositionTpl<Scalar>::set_id(
127 const pinocchio::FrameIndex id) {
128 id_ = id;
129 }
130
131 template <typename Scalar>
132 void ResidualModelContactCoPPositionTpl<Scalar>::set_reference(
133 const CoPSupport& reference) {
134 cref_ = reference;
135 update_jacobians_ = true;
136 }
137
138 } // namespace crocoddyl
139