| Directory: | ./ |
|---|---|
| File: | tests/features/test_feature_point6d.cpp |
| Date: | 2025-05-13 12:28:21 |
| Exec | Total | Coverage | |
|---|---|---|---|
| Lines: | 127 | 135 | 94.1% |
| Branches: | 120 | 252 | 47.6% |
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | /* | ||
| 2 | * Copyright 2019, | ||
| 3 | * François Bleibel, | ||
| 4 | * Olivier Stasse, | ||
| 5 | * | ||
| 6 | * CNRS/AIST | ||
| 7 | * | ||
| 8 | */ | ||
| 9 | |||
| 10 | /* -------------------------------------------------------------------------- */ | ||
| 11 | /* --- INCLUDES ------------------------------------------------------------- */ | ||
| 12 | /* -------------------------------------------------------------------------- */ | ||
| 13 | #include <dynamic-graph/linear-algebra.h> | ||
| 14 | |||
| 15 | #include <iostream> | ||
| 16 | #include <sot/core/debug.hh> | ||
| 17 | #include <sot/core/feature-abstract.hh> | ||
| 18 | #include <sot/core/feature-point6d.hh> | ||
| 19 | #include <sot/core/gain-adaptive.hh> | ||
| 20 | #include <sot/core/macros.hh> | ||
| 21 | #include <sot/core/sot.hh> | ||
| 22 | #include <sot/core/task.hh> | ||
| 23 | using namespace std; | ||
| 24 | using namespace dynamicgraph::sot; | ||
| 25 | |||
| 26 | class TestPoint6d { | ||
| 27 | public: | ||
| 28 | SOT_CORE_DISABLE_WARNING_PUSH | ||
| 29 | SOT_CORE_DISABLE_WARNING_DEPRECATED | ||
| 30 | FeaturePoint6d feature_, featureDes_; | ||
| 31 | SOT_CORE_DISABLE_WARNING_POP | ||
| 32 | Task task_; | ||
| 33 | int time_; | ||
| 34 | int dim_, robotDim_, featureDim_; | ||
| 35 | dynamicgraph::Vector manual_; | ||
| 36 | |||
| 37 | 1 | TestPoint6d(unsigned dim, std::string &name) | |
| 38 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | : feature_("feature" + name), |
| 39 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | featureDes_("featureDes" + name), |
| 40 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | task_("task" + name), |
| 41 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | time_(0) |
| 42 | |||
| 43 | { | ||
| 44 |
2/4✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
|
1 | feature_.computationFrame("desired"); |
| 45 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | feature_.setReference(&featureDes_); |
| 46 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | feature_.selectionSIN = Flags(true); |
| 47 | |||
| 48 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | task_.addFeature(feature_); |
| 49 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | task_.setWithDerivative(true); |
| 50 | 1 | dim_ = dim; | |
| 51 | 1 | robotDim_ = featureDim_ = dim; | |
| 52 | |||
| 53 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | dynamicgraph::Matrix Jq(dim, dim); |
| 54 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | Jq.setIdentity(); |
| 55 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | feature_.articularJacobianSIN.setReference(&Jq); |
| 56 | |||
| 57 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | manual_.resize(dim); |
| 58 | 1 | } | |
| 59 | |||
| 60 | 4 | void setInputs(MatrixHomogeneous &s, MatrixHomogeneous &sd, | |
| 61 | dynamicgraph::Vector &vd, double gain) { | ||
| 62 | 4 | feature_.positionSIN = s; | |
| 63 | 4 | feature_.positionSIN.access(time_); | |
| 64 | 4 | feature_.positionSIN.setReady(); | |
| 65 | |||
| 66 | 4 | featureDes_.positionSIN = sd; | |
| 67 | 4 | featureDes_.positionSIN.access(time_); | |
| 68 | 4 | featureDes_.positionSIN.setReady(); | |
| 69 | |||
| 70 | 4 | featureDes_.velocitySIN = vd; | |
| 71 | 4 | featureDes_.velocitySIN.access(time_); | |
| 72 | 4 | featureDes_.velocitySIN.setReady(); | |
| 73 | |||
| 74 | 4 | task_.controlGainSIN = gain; | |
| 75 | 4 | task_.controlGainSIN.access(time_); | |
| 76 | 4 | task_.controlGainSIN.setReady(); | |
| 77 | 4 | } | |
| 78 | |||
| 79 | 4 | void printInputs() { | |
| 80 | 4 | std::cout << "----- inputs -----" << std::endl; | |
| 81 |
1/2✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
|
4 | std::cout << "feature_.position: " << feature_.positionSIN(time_) |
| 82 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
4 | << std::endl; |
| 83 |
1/2✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
|
4 | std::cout << "featureDes_.position: " << featureDes_.positionSIN(time_) |
| 84 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
4 | << std::endl; |
| 85 | 4 | std::cout << "featureDes_.velocity: " | |
| 86 |
2/4✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 4 times.
✗ Branch 7 not taken.
|
4 | << featureDes_.velocitySIN(time_).transpose() << std::endl; |
| 87 | 4 | std::cout << "task.controlGain: " << task_.controlGainSIN(time_) | |
| 88 | 4 | << std::endl; | |
| 89 | 4 | } | |
| 90 | |||
| 91 | 4 | int recompute() { | |
| 92 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
4 | feature_.errorSOUT.recompute(time_); |
| 93 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
4 | feature_.errordotSOUT.recompute(time_); |
| 94 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
4 | task_.taskSOUT.recompute(time_); |
| 95 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
4 | task_.errorSOUT.recompute(time_); |
| 96 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
4 | task_.errorTimeDerivativeSOUT.recompute(time_); |
| 97 | 4 | time_++; | |
| 98 |
2/4✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
|
4 | MatrixHomogeneous s = feature_.positionSIN; |
| 99 |
2/4✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
|
4 | MatrixHomogeneous sd = featureDes_.positionSIN; |
| 100 |
2/4✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
|
4 | dynamicgraph::Vector vd = featureDes_.velocitySIN; |
| 101 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
4 | double gain = task_.controlGainSIN; |
| 102 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
4 | dynamicgraph::Vector manual; |
| 103 | const std::vector<dynamicgraph::sot::MultiBound> &taskTaskSOUT = | ||
| 104 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
4 | task_.taskSOUT(time_); |
| 105 | |||
| 106 | /// Verify the computation of the desired frame. | ||
| 107 | /// -gain *(s-sd) - ([w]x (sd -s)-vd) | ||
| 108 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
4 | dynamicgraph::Matrix aM; |
| 109 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
4 | dynamicgraph::Vector aV; |
| 110 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
4 | aM.resize(3, 3); |
| 111 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
4 | aV.resize(3); |
| 112 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
4 | aM(0, 0) = 0.0; |
| 113 |
2/4✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
|
4 | aM(0, 1) = -vd(5); |
| 114 |
2/4✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
|
4 | aM(0, 2) = vd(4); |
| 115 |
2/4✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
|
4 | aM(1, 0) = vd(5); |
| 116 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
4 | aM(1, 1) = 0.0; |
| 117 |
2/4✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
|
4 | aM(1, 2) = -vd(3); |
| 118 |
2/4✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
|
4 | aM(2, 0) = -vd(4); |
| 119 |
2/4✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
|
4 | aM(2, 1) = vd(3); |
| 120 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
4 | aM(2, 2) = 0.0; |
| 121 |
5/8✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 12 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 12 times.
✓ Branch 10 taken 4 times.
|
16 | for (unsigned int i = 0; i < 3; i++) aV(i) = sd(i, 3) - s(i, 3); |
| 122 | |||
| 123 |
2/4✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
|
4 | aV = aM * aV; |
| 124 | |||
| 125 | /// Recompute error_th. | ||
| 126 |
2/2✓ Branch 0 taken 12 times.
✓ Branch 1 taken 4 times.
|
16 | for (unsigned int i = 0; i < 3; i++) { |
| 127 |
5/10✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 12 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 12 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 12 times.
✗ Branch 14 not taken.
|
12 | manual_[i] = -gain * (s(i, 3) - sd(i, 3)) - (aV(i) - vd(i)); |
| 128 |
3/6✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 12 times.
|
12 | if (manual_[i] != taskTaskSOUT[i].getSingleBound()) return -1; |
| 129 | } | ||
| 130 | 4 | return 0; | |
| 131 | 4 | } | |
| 132 | |||
| 133 | 4 | void printOutput() { | |
| 134 | 4 | std::cout << "----- output -----" << std::endl; | |
| 135 | 4 | std::cout << "time: " << time_ << std::endl; | |
| 136 |
1/2✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
|
4 | std::cout << "feature.errorSOUT: " << feature_.errorSOUT(time_).transpose() |
| 137 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
4 | << std::endl; |
| 138 | 4 | std::cout << "feature.errordotSOUT: " | |
| 139 |
2/4✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 4 times.
✗ Branch 7 not taken.
|
4 | << feature_.errordotSOUT(time_).transpose() << std::endl; |
| 140 | 4 | std::cout << "task.taskSOUT: " << task_.taskSOUT(time_) << std::endl; | |
| 141 | // std::cout << "task.errorSOUT: " << task_.errorSOUT(time_) | ||
| 142 | //<< std::endl; | ||
| 143 | // std::cout << "task.errordtSOUT: " << task_.errorTimeDerivativeSOUT(time_) | ||
| 144 | //<< std::endl; | ||
| 145 |
2/4✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 4 times.
✗ Branch 7 not taken.
|
4 | std::cout << "manual: " << manual_.transpose() << std::endl; |
| 146 | 4 | } | |
| 147 | |||
| 148 | 4 | int runTest(MatrixHomogeneous &s, MatrixHomogeneous &sd, | |
| 149 | dynamicgraph::Vector &vd, double gain) { | ||
| 150 | 4 | setInputs(s, sd, vd, gain); | |
| 151 | 4 | printInputs(); | |
| 152 | 4 | int r = recompute(); | |
| 153 | 4 | printOutput(); | |
| 154 | 4 | return r; | |
| 155 | } | ||
| 156 | }; | ||
| 157 | |||
| 158 | 1 | int main(void) { | |
| 159 | // Name of the robot | ||
| 160 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | std::string srobot("Robot"); |
| 161 | // Dimension of the robot. | ||
| 162 | 1 | unsigned int dim = 6; | |
| 163 | // Feature and Desired Feature | ||
| 164 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | MatrixHomogeneous s, sd; |
| 165 | // Desired velocity | ||
| 166 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | dynamicgraph::Vector vd(6); |
| 167 | // Task gain. | ||
| 168 | double gain; | ||
| 169 | // Result of test | ||
| 170 | int r; | ||
| 171 | |||
| 172 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | TestPoint6d testFeaturePoint6d(dim, srobot); |
| 173 | |||
| 174 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | std::cout << " ----- Test Velocity -----" << std::endl; |
| 175 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | s.setIdentity(); |
| 176 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | sd.setIdentity(); |
| 177 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | vd.setConstant(1.); |
| 178 | 1 | gain = 0.0; | |
| 179 | |||
| 180 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
|
1 | if ((r = testFeaturePoint6d.runTest(s, sd, vd, gain)) < 0) { |
| 181 | ✗ | std::cerr << "Failure on 1st test." << std::endl; | |
| 182 | ✗ | return r; | |
| 183 | } | ||
| 184 | |||
| 185 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | std::cout << " ----- Test Position -----" << std::endl; |
| 186 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | s.setIdentity(); |
| 187 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | sd.setIdentity(); |
| 188 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | sd.translation()[2] = 2.0; |
| 189 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | vd.setZero(); |
| 190 | 1 | gain = 1.0; | |
| 191 | |||
| 192 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
|
1 | if ((r = testFeaturePoint6d.runTest(s, sd, vd, gain)) < 0) { |
| 193 | ✗ | std::cerr << "Failure on 2nd test." << std::endl; | |
| 194 | ✗ | return r; | |
| 195 | } | ||
| 196 | |||
| 197 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | std::cout << " ----- Test both -----" << std::endl; |
| 198 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | s.setIdentity(); |
| 199 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | sd.setIdentity(); |
| 200 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | sd.translation()[2] = 2.0; |
| 201 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | vd.setConstant(1.); |
| 202 | 1 | gain = 3.0; | |
| 203 | |||
| 204 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
|
1 | if ((r = testFeaturePoint6d.runTest(s, sd, vd, gain)) < 0) { |
| 205 | ✗ | std::cerr << "Failure on 3th test." << std::endl; | |
| 206 | ✗ | return r; | |
| 207 | } | ||
| 208 | |||
| 209 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | std::cout << " ----- Test both again -----" << std::endl; |
| 210 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | s.setIdentity(); |
| 211 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | sd.setIdentity(); |
| 212 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | sd.translation()[2] = 2.0; |
| 213 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | vd.setConstant(1.); |
| 214 | 1 | gain = 3.0; | |
| 215 | |||
| 216 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
|
1 | if ((r = testFeaturePoint6d.runTest(s, sd, vd, gain)) < 0) { |
| 217 | ✗ | std::cerr << "Failure on 4th test." << std::endl; | |
| 218 | ✗ | return r; | |
| 219 | } | ||
| 220 | |||
| 221 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | std::cout << "Test successfull !" << std::endl; |
| 222 | 1 | return 0; | |
| 223 | 1 | } | |
| 224 |