GCC Code Coverage Report


Directory: ./
File: tests/features/test_feature_point6d.cpp
Date: 2024-12-13 12:22:33
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