| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | /* | ||
| 2 | * Copyright 2015, LAAS-CNRS | ||
| 3 | * Author: Andrea Del Prete | ||
| 4 | */ | ||
| 5 | |||
| 6 | #include <ctime> | ||
| 7 | #include <hpp/centroidal-dynamics/util.hh> | ||
| 8 | |||
| 9 | namespace centroidal_dynamics { | ||
| 10 | |||
| 11 | 11 | dd_MatrixPtr cone_span_eigen_to_cdd(Cref_matrixXX input, | |
| 12 | const bool canonicalize) { | ||
| 13 | 11 | dd_debug = false; | |
| 14 | 11 | dd_MatrixPtr M = NULL; | |
| 15 | dd_rowrange i; | ||
| 16 | dd_colrange j; | ||
| 17 | 11 | dd_rowrange m_input = (dd_rowrange)(input.rows()); | |
| 18 | 11 | dd_colrange d_input = (dd_colrange)(input.cols() + 1); | |
| 19 | 11 | dd_RepresentationType rep = dd_Generator; | |
| 20 | mytype value; | ||
| 21 | 11 | dd_NumberType NT = dd_Real; | |
| 22 |
1/2✓ Branch 1 taken 11 times.
✗ Branch 2 not taken.
|
11 | dd_init(value); |
| 23 |
1/2✓ Branch 1 taken 11 times.
✗ Branch 2 not taken.
|
11 | M = dd_CreateMatrix(m_input, d_input); |
| 24 | 11 | M->representation = rep; | |
| 25 | 11 | M->numbtype = NT; | |
| 26 |
2/2✓ Branch 1 taken 336 times.
✓ Branch 2 taken 11 times.
|
347 | for (i = 0; i < input.rows(); i++) { |
| 27 |
1/2✓ Branch 1 taken 336 times.
✗ Branch 2 not taken.
|
336 | dd_set_d(value, 0); |
| 28 |
1/2✓ Branch 1 taken 336 times.
✗ Branch 2 not taken.
|
336 | dd_set(M->matrix[i][0], value); |
| 29 |
2/2✓ Branch 0 taken 2016 times.
✓ Branch 1 taken 336 times.
|
2352 | for (j = 1; j < d_input; j++) { |
| 30 |
2/4✓ Branch 1 taken 2016 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2016 times.
✗ Branch 5 not taken.
|
2016 | dd_set_d(value, input(i, j - 1)); |
| 31 |
1/2✓ Branch 1 taken 2016 times.
✗ Branch 2 not taken.
|
2016 | dd_set(M->matrix[i][j], value); |
| 32 | } | ||
| 33 | } | ||
| 34 |
1/2✓ Branch 1 taken 11 times.
✗ Branch 2 not taken.
|
11 | dd_clear(value); |
| 35 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 10 times.
|
11 | if (canonicalize) { |
| 36 | 1 | dd_ErrorType error = dd_NoError; | |
| 37 | dd_rowset redset, impl_linset; | ||
| 38 | dd_rowindex newpos; | ||
| 39 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | dd_MatrixCanonicalize(&M, &impl_linset, &redset, &newpos, &error); |
| 40 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | set_free(redset); |
| 41 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | set_free(impl_linset); |
| 42 | 1 | free(newpos); | |
| 43 | } | ||
| 44 | 11 | return M; | |
| 45 | } | ||
| 46 | |||
| 47 | 2 | void init_cdd_library() { | |
| 48 | 2 | dd_set_global_constants(); | |
| 49 | 2 | dd_debug = false; | |
| 50 | 2 | } | |
| 51 | |||
| 52 | ✗ | void release_cdd_library() { | |
| 53 | // dd_free_global_constants(); | ||
| 54 | ✗ | } | |
| 55 | |||
| 56 | 1000 | void uniform3(Cref_vector3 lower_bounds, Cref_vector3 upper_bounds, | |
| 57 | Ref_vector3 out) { | ||
| 58 |
1/2✗ Branch 2 not taken.
✓ Branch 3 taken 1000 times.
|
1000 | assert(lower_bounds.rows() == out.rows()); |
| 59 |
1/2✗ Branch 2 not taken.
✓ Branch 3 taken 1000 times.
|
1000 | assert(upper_bounds.rows() == out.rows()); |
| 60 |
1/2✗ Branch 2 not taken.
✓ Branch 3 taken 1000 times.
|
1000 | assert(lower_bounds.cols() == out.cols()); |
| 61 |
1/2✗ Branch 2 not taken.
✓ Branch 3 taken 1000 times.
|
1000 | assert(upper_bounds.cols() == out.cols()); |
| 62 |
2/2✓ Branch 1 taken 3000 times.
✓ Branch 2 taken 1000 times.
|
4000 | for (int i = 0; i < out.rows(); i++) |
| 63 |
2/2✓ Branch 1 taken 3000 times.
✓ Branch 2 taken 3000 times.
|
6000 | for (int j = 0; j < out.cols(); j++) |
| 64 | 6000 | out(i, j) = (rand() / value_type(RAND_MAX)) * | |
| 65 | 3000 | (upper_bounds(i, j) - lower_bounds(i, j)) + | |
| 66 | 3000 | lower_bounds(i, j); | |
| 67 | 1000 | } | |
| 68 | |||
| 69 | 40 | void uniform(Cref_matrixXX lower_bounds, Cref_matrixXX upper_bounds, | |
| 70 | Ref_matrixXX out) { | ||
| 71 |
1/2✗ Branch 2 not taken.
✓ Branch 3 taken 40 times.
|
40 | assert(lower_bounds.rows() == out.rows()); |
| 72 |
1/2✗ Branch 2 not taken.
✓ Branch 3 taken 40 times.
|
40 | assert(upper_bounds.rows() == out.rows()); |
| 73 |
1/2✗ Branch 2 not taken.
✓ Branch 3 taken 40 times.
|
40 | assert(lower_bounds.cols() == out.cols()); |
| 74 |
1/2✗ Branch 2 not taken.
✓ Branch 3 taken 40 times.
|
40 | assert(upper_bounds.cols() == out.cols()); |
| 75 |
2/2✓ Branch 1 taken 40 times.
✓ Branch 2 taken 40 times.
|
80 | for (int i = 0; i < out.rows(); i++) |
| 76 |
2/2✓ Branch 1 taken 120 times.
✓ Branch 2 taken 40 times.
|
160 | for (int j = 0; j < out.cols(); j++) |
| 77 | 240 | out(i, j) = (rand() / value_type(RAND_MAX)) * | |
| 78 | 120 | (upper_bounds(i, j) - lower_bounds(i, j)) + | |
| 79 | 120 | lower_bounds(i, j); | |
| 80 | 40 | } | |
| 81 | |||
| 82 | 20 | void euler_matrix(double roll, double pitch, double yaw, Ref_rotation R) { | |
| 83 | 20 | const int i = 0; | |
| 84 | 20 | const int j = 1; | |
| 85 | 20 | const int k = 2; | |
| 86 | 20 | double si = sin(roll); | |
| 87 | 20 | double sj = sin(pitch); | |
| 88 | 20 | double sk = sin(yaw); | |
| 89 | 20 | double ci = cos(roll); | |
| 90 | 20 | double cj = cos(pitch); | |
| 91 | 20 | double ck = cos(yaw); | |
| 92 | 20 | double cc = ci * ck; | |
| 93 | 20 | double cs = ci * sk; | |
| 94 | 20 | double sc = si * ck; | |
| 95 | 20 | double ss = si * sk; | |
| 96 | |||
| 97 | 20 | R(i, i) = cj * ck; | |
| 98 | 20 | R(i, j) = sj * sc - cs; | |
| 99 | 20 | R(i, k) = sj * cc + ss; | |
| 100 | 20 | R(j, i) = cj * sk; | |
| 101 | 20 | R(j, j) = sj * ss + cc; | |
| 102 | 20 | R(j, k) = sj * cs - sc; | |
| 103 | 20 | R(k, i) = -sj; | |
| 104 | 20 | R(k, j) = cj * si; | |
| 105 | 20 | R(k, k) = cj * ci; | |
| 106 | // R = (angle_axis_t(roll, Vector3::UnitX()) | ||
| 107 | // * angle_axis_t(pitch, Vector3::UnitY()) | ||
| 108 | // * angle_axis_t(yaw, Vector3::UnitZ())).toRotationMatrix(); | ||
| 109 | 20 | } | |
| 110 | |||
| 111 | 20 | bool generate_rectangle_contacts(double lx, double ly, Cref_vector3 pos, | |
| 112 | Cref_vector3 rpy, Ref_matrix43 p, | ||
| 113 | Ref_matrix43 N) { | ||
| 114 | // compute rotation matrix | ||
| 115 |
1/2✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
|
20 | Rotation R; |
| 116 |
5/10✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 20 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 20 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 20 times.
✗ Branch 14 not taken.
|
20 | euler_matrix(rpy(0), rpy(1), rpy(2), R); |
| 117 | // contact points in local frame | ||
| 118 |
12/24✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 20 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 20 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 20 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 20 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 20 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 20 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 20 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 20 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 20 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 20 times.
✗ Branch 35 not taken.
|
20 | p << lx, ly, 0, lx, -ly, 0, -lx, -ly, 0, -lx, ly, 0; |
| 119 | // contact points in world frame | ||
| 120 |
6/12✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 20 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 20 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 20 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 20 times.
✗ Branch 17 not taken.
|
20 | p.row(0) = pos + (R * p.row(0).transpose()); |
| 121 |
6/12✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 20 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 20 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 20 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 20 times.
✗ Branch 17 not taken.
|
20 | p.row(1) = pos + (R * p.row(1).transpose()); |
| 122 |
6/12✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 20 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 20 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 20 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 20 times.
✗ Branch 17 not taken.
|
20 | p.row(2) = pos + (R * p.row(2).transpose()); |
| 123 |
6/12✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 20 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 20 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 20 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 20 times.
✗ Branch 17 not taken.
|
20 | p.row(3) = pos + (R * p.row(3).transpose()); |
| 124 | // normal direction in local frame | ||
| 125 |
1/2✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
|
20 | RVector3 n; |
| 126 |
3/6✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 20 times.
✗ Branch 8 not taken.
|
20 | n << 0, 0, 1; |
| 127 | // normal directions in world frame | ||
| 128 |
4/8✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 20 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 20 times.
✗ Branch 11 not taken.
|
20 | n = (R * n.transpose()).transpose(); |
| 129 |
4/8✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 20 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 20 times.
✗ Branch 11 not taken.
|
20 | N << n, n, n, n; |
| 130 | 20 | return true; | |
| 131 | } | ||
| 132 | |||
| 133 | 11381 | Rotation crossMatrix(Cref_vector3 x) { | |
| 134 |
2/4✓ Branch 1 taken 11381 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 11381 times.
✗ Branch 5 not taken.
|
11381 | Rotation res = Rotation::Zero(); |
| 135 | 11381 | res(0, 1) = -x(2); | |
| 136 | 11381 | res(0, 2) = x(1); | |
| 137 | 11381 | res(1, 0) = x(2); | |
| 138 | 11381 | res(1, 2) = -x(0); | |
| 139 | 11381 | res(2, 0) = -x(1); | |
| 140 | 11381 | res(2, 1) = x(0); | |
| 141 | 11381 | return res; | |
| 142 | } | ||
| 143 | |||
| 144 | ✗ | std::string getDateAndTimeAsString() { | |
| 145 | time_t rawtime; | ||
| 146 | struct tm* timeinfo; | ||
| 147 | char buffer[80]; | ||
| 148 | ✗ | time(&rawtime); | |
| 149 | ✗ | timeinfo = localtime(&rawtime); | |
| 150 | ✗ | strftime(buffer, 80, "%Y%m%d_%I%M%S", timeinfo); | |
| 151 | ✗ | return std::string(buffer); | |
| 152 | } | ||
| 153 | /* | ||
| 154 | int fact(const int n) | ||
| 155 | { | ||
| 156 | assert(n>=0); | ||
| 157 | int res = 1; | ||
| 158 | for (int i=2 ; i <= n ; ++i) | ||
| 159 | res *= i; | ||
| 160 | return res; | ||
| 161 | } | ||
| 162 | |||
| 163 | int choosenk(const int n, const int k) | ||
| 164 | { | ||
| 165 | return fact(n) / (fact(k) * fact(n - k)); | ||
| 166 | }*/ | ||
| 167 | |||
| 168 | /* is this faster ? | ||
| 169 | value_type choosenk(const int n, const int k) | ||
| 170 | { | ||
| 171 | if(k>n/2) | ||
| 172 | return nchoosek(n,n-k); | ||
| 173 | else if(k==1) | ||
| 174 | return n; | ||
| 175 | else | ||
| 176 | { | ||
| 177 | double c = 1; | ||
| 178 | for(int i = 1;i<=k;i++) | ||
| 179 | c *= (((double)n-k+i)/((double)i)); | ||
| 180 | return std::round(c); | ||
| 181 | } | ||
| 182 | }*/ | ||
| 183 | |||
| 184 | ✗ | value_type nchoosek(const int n, const int k) { | |
| 185 | ✗ | if (k > n / 2) | |
| 186 | ✗ | return nchoosek(n, n - k); | |
| 187 | ✗ | else if (k == 1) | |
| 188 | ✗ | return n; | |
| 189 | else { | ||
| 190 | ✗ | value_type c = 1; | |
| 191 | ✗ | for (int i = 1; i <= k; i++) | |
| 192 | ✗ | c *= (((value_type)n - k + i) / ((value_type)i)); | |
| 193 | ✗ | return round(c); | |
| 194 | } | ||
| 195 | } | ||
| 196 | |||
| 197 | } // namespace centroidal_dynamics | ||
| 198 |