GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: include/crocoddyl/multibody/cop-support.hxx Lines: 47 64 73.4 %
Date: 2024-02-13 11:12:33 Branches: 34 76 44.7 %

Line Branch Exec Source
1
///////////////////////////////////////////////////////////////////////////////
2
// BSD 3-Clause License
3
//
4
// Copyright (C) 2021, University of Edinburgh, University of Oxford
5
// Copyright note valid unless otherwise stated in individual files.
6
// All rights reserved.
7
///////////////////////////////////////////////////////////////////////////////
8
9
#include <math.h>
10
11
#include <iostream>
12
13
namespace crocoddyl {
14
15
template <typename Scalar>
16
3
CoPSupportTpl<Scalar>::CoPSupportTpl()
17
    : R_(Matrix3s::Identity()),
18
      box_(std::numeric_limits<Scalar>::infinity(),
19

3
           std::numeric_limits<Scalar>::infinity()) {
20
3
  A_.setZero();
21
3
  ub_.setZero();
22
3
  lb_.setZero();
23
24
  // Update the inequality matrix and bounds
25
3
  update();
26
3
}
27
28
template <typename Scalar>
29
56
CoPSupportTpl<Scalar>::CoPSupportTpl(const Matrix3s& R, const Vector2s& box)
30
56
    : R_(R), box_(box) {
31
56
  A_.setZero();
32
56
  ub_.setZero();
33
56
  lb_.setZero();
34
35
  // Update the inequality matrix and bounds
36
56
  update();
37
56
}
38
39
template <typename Scalar>
40
CoPSupportTpl<Scalar>::CoPSupportTpl(const WrenchConeTpl<Scalar>& other)
41
    : A_(other.get_A()),
42
      ub_(other.get_ub()),
43
      lb_(other.get_lb()),
44
      R_(other.get_R()),
45
      box_(other.get_box()) {}
46
47
template <typename Scalar>
48
39
CoPSupportTpl<Scalar>::CoPSupportTpl(const CoPSupportTpl<Scalar>& other)
49
    : A_(other.get_A()),
50
      ub_(other.get_ub()),
51
      lb_(other.get_lb()),
52
      R_(other.get_R()),
53
39
      box_(other.get_box()) {}
54
55
template <typename Scalar>
56
98
CoPSupportTpl<Scalar>::~CoPSupportTpl() {}
57
58
template <typename Scalar>
59
59
void CoPSupportTpl<Scalar>::update() {
60
  // Initialize the matrix and bounds
61
59
  A_.setZero();
62
59
  ub_.setZero();
63
59
  lb_.setOnes();
64
59
  lb_ *= -std::numeric_limits<Scalar>::infinity();
65
66
  // CoP information
67
  // This matrix is defined as
68
  // [0  0 -W  1  0  0;
69
  //  0  0 -W -1  0  0;
70
  //  0  0 -L  0  1  0;
71
  //  0  0 -L  0 -1  0]
72
59
  const Scalar L = box_(0) / Scalar(2.);
73
59
  const Scalar W = box_(1) / Scalar(2.);
74



59
  A_.row(0) << -W * R_.col(2).transpose(), R_.col(0).transpose();
75




59
  A_.row(1) << -W * R_.col(2).transpose(), -R_.col(0).transpose();
76



59
  A_.row(2) << -L * R_.col(2).transpose(), R_.col(1).transpose();
77




59
  A_.row(3) << -L * R_.col(2).transpose(), -R_.col(1).transpose();
78
59
}
79
80
template <typename Scalar>
81
3537
const typename MathBaseTpl<Scalar>::Matrix46s& CoPSupportTpl<Scalar>::get_A()
82
    const {
83
3537
  return A_;
84
}
85
86
template <typename Scalar>
87
79
const typename MathBaseTpl<Scalar>::Vector4s& CoPSupportTpl<Scalar>::get_ub()
88
    const {
89
79
  return ub_;
90
}
91
92
template <typename Scalar>
93
69
const typename MathBaseTpl<Scalar>::Vector4s& CoPSupportTpl<Scalar>::get_lb()
94
    const {
95
69
  return lb_;
96
}
97
98
template <typename Scalar>
99
48
const typename MathBaseTpl<Scalar>::Vector2s& CoPSupportTpl<Scalar>::get_box()
100
    const {
101
48
  return box_;
102
}
103
104
template <typename Scalar>
105
49
const typename MathBaseTpl<Scalar>::Matrix3s& CoPSupportTpl<Scalar>::get_R()
106
    const {
107
49
  return R_;
108
}
109
110
template <typename Scalar>
111
void CoPSupportTpl<Scalar>::set_R(const Matrix3s& R) {
112
  R_ = R;
113
}
114
115
template <typename Scalar>
116
void CoPSupportTpl<Scalar>::set_box(const Vector2s& box) {
117
  box_ = box;
118
  if (box_(0) < Scalar(0.)) {
119
    box_(0) = std::numeric_limits<Scalar>::infinity();
120
    std::cerr << "Warning: box(0) has to be a positive value, set to inf float"
121
              << std::endl;
122
  }
123
  if (box_(1) < Scalar(0.)) {
124
    box_(1) = std::numeric_limits<Scalar>::infinity();
125
    std::cerr << "Warning: box(0) has to be a positive value, set to inf float"
126
              << std::endl;
127
  }
128
}
129
130
template <typename Scalar>
131
3
CoPSupportTpl<Scalar>& CoPSupportTpl<Scalar>::operator=(
132
    const CoPSupportTpl<Scalar>& other) {
133
3
  if (this != &other) {
134
3
    A_ = other.get_A();
135
3
    ub_ = other.get_ub();
136
3
    lb_ = other.get_lb();
137
3
    R_ = other.get_R();
138
3
    box_ = other.get_box();
139
  }
140
3
  return *this;
141
}
142
143
template <typename Scalar>
144
std::ostream& operator<<(std::ostream& os, const CoPSupportTpl<Scalar>& X) {
145
  os << "         R: " << X.get_R() << std::endl;
146
  os << "       box: " << X.get_box().transpose() << std::endl;
147
  return os;
148
}
149
150
}  // namespace crocoddyl