GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: tests/test-kinodynamic.cc Lines: 1085 1121 96.8 %
Date: 2024-02-02 12:21:48 Branches: 2881 5844 49.3 %

Line Branch Exec Source
1
// Copyright (C) 2019 LAAS-CNRS
2
// Author: Pierre Fernbach
3
//
4
// This file is part of the hpp-rbprm.
5
//
6
// hpp-rbprm is free software: you can redistribute it and/or modify
7
// it under the terms of the GNU Lesser General Public License as published by
8
// the Free Software Foundation, either version 3 of the License, or
9
// (at your option) any later version.
10
//
11
// test-hpp is distributed in the hope that it will be useful,
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
// GNU Lesser General Public License for more details.
15
//
16
// You should have received a copy of the GNU Lesser General Public License
17
// along with hpp-core.  If not, see <http://www.gnu.org/licenses/>.
18
19
#define BOOST_TEST_MODULE test - kinodynamic
20
#include <boost/test/included/unit_test.hpp>
21
#include <hpp/core/path-vector.hh>
22
#include <hpp/core/problem-solver.hh>
23
#include <hpp/pinocchio/configuration.hh>
24
#include <hpp/rbprm/rbprm-device.hh>
25
#include <pinocchio/fwd.hpp>
26
27
#include "tools-fullbody.hh"
28
#include "tools-obstacle.hh"
29
30
using namespace hpp;
31
using namespace rbprm;
32
33
62
bool checkPathVector(core::PathPtr_t path) {
34
124
  core::PathVectorPtr_t pv = dynamic_pointer_cast<core::PathVector>(path);
35



62
  BOOST_CHECK(pv->numberPaths() > 0);
36
62
  if (pv->numberPaths() == 1) return true;
37
38
  size_type idAcc =
39
37
      path->outputSize() -
40
37
      3;  // because acceleration may be set à 0 in init/end config of paths
41
42
74
  core::PathPtr_t previousPath = pv->pathAtRank(0);
43
  bool successPath;
44

37
  if (previousPath->initial().head(idAcc) !=
45

74
      (*previousPath)(0., successPath).head(idAcc)) {
46
    std::cout << "init config not equal to config at time 0" << std::endl;
47
    std::cout << "init config : "
48
              << hpp::pinocchio::displayConfig(previousPath->initial())
49
              << std::endl;
50
    std::cout << "t=0  config : "
51
              << hpp::pinocchio::displayConfig((*previousPath)(0., successPath))
52
              << std::endl;
53
    return false;
54
  }
55

37
  if (previousPath->end().head(idAcc) !=
56


74
      (*previousPath)(previousPath->length(), successPath).head(idAcc)) {
57
    std::cout << "end config not equal to config at time length()" << std::endl;
58
    std::cout << "end  config : "
59
              << hpp::pinocchio::displayConfig(previousPath->end())
60
              << std::endl;
61
    std::cout << "t=l  config : "
62
              << hpp::pinocchio::displayConfig(
63
                     (*previousPath)(previousPath->length(), successPath))
64
              << std::endl;
65
    return false;
66
  }
67
68
37
  core::PathPtr_t currentPath;
69
383
  for (size_t i = 1; i < pv->numberPaths(); ++i) {
70
346
    currentPath = pv->pathAtRank(i);
71



346
    if (previousPath->end().head(idAcc) != currentPath->initial().head(idAcc)) {
72
      std::cout << "previous path end not equal to current init, for id" << i
73
                << std::endl;
74
      std::cout << "end previous : "
75
                << hpp::pinocchio::displayConfig(previousPath->end())
76
                << std::endl;
77
      std::cout << "init current : "
78
                << hpp::pinocchio::displayConfig(currentPath->initial())
79
                << std::endl;
80
      return false;
81
    }
82

346
    if (currentPath->initial().head(idAcc) !=
83

692
        (*currentPath)(0., successPath).head(idAcc)) {
84
      std::cout << "init config not equal to config at time 0 at index " << i
85
                << std::endl;
86
      std::cout << "init config : "
87
                << hpp::pinocchio::displayConfig(currentPath->initial())
88
                << std::endl;
89
      std::cout << "t=0  config : "
90
                << hpp::pinocchio::displayConfig(
91
                       (*currentPath)(0., successPath))
92
                << std::endl;
93
      return false;
94
    }
95

346
    if (currentPath->end().head(idAcc) !=
96


692
        (*currentPath)(currentPath->length(), successPath).head(idAcc)) {
97
      std::cout << "end config not equal to config at time length() at index "
98
                << i << std::endl;
99
      std::cout << "end  config : "
100
                << hpp::pinocchio::displayConfig(currentPath->end())
101
                << std::endl;
102
      std::cout << "t=l  config : "
103
                << hpp::pinocchio::displayConfig(
104
                       (*currentPath)(currentPath->length(), successPath))
105
                << std::endl;
106
      return false;
107
    }
108
346
    previousPath = currentPath;
109
  }
110
37
  return true;
111
}
112
113
62
bool checkPath(core::PathPtr_t path, double v, double dt = 0.01) {
114
62
  double t = dt;
115
62
  double maxD = v * sqrt(3.) * dt;
116
  bool successPath;
117

62
  vector3_t a = (*path)(0., successPath).head<3>();
118
62
  if (!successPath) return false;
119
62
  vector3_t b;
120
  double norm;
121

79214
  while (t < path->length()) {
122

79152
    b = (*path)(t, successPath).head<3>();
123
79152
    if (!successPath) return false;
124

79152
    norm = (a - b).norm();
125
79152
    if (norm > maxD) return false;
126
79152
    t += dt;
127
79152
    a = b;
128
  }
129
62
  return true;
130
}
131
132
BOOST_AUTO_TEST_SUITE(rbrrt_kinodynamic)
133
134
















4
BOOST_AUTO_TEST_CASE(load_abstract_model_hyq) {
135
4
  hpp::pinocchio::RbPrmDevicePtr_t rbprmDevice = loadHyQAbsract();
136
  // for(size_t i = 0 ; i < rbprmDevice->data().mass.size() ; ++i)
137
  //  std::cout<<"mass : "<<i<<" = "<<rbprmDevice->data().mass[i]<<std::endl;
138
  // BOOST_CHECK_CLOSE(rbprmDevice->mass(),70.,1e-2); // FIXME : need to
139
  // investigate and open an issue
140
2
  hpp::core::ProblemSolverPtr_t ps = hpp::core::ProblemSolver::create();
141
2
  ps->robot(rbprmDevice);
142



2
  BOOST_CHECK_CLOSE(rbprmDevice->mass(), 76.07, 1e-2);
143




2
  BOOST_CHECK_CLOSE(ps->robot()->mass(), 76.07, 1e-2);
144
  // for(size_t i = 0 ; i < rbprmDevice->data().mass.size() ; ++i)
145
  //  std::cout<<"mass : "<<i<<" = "<<rbprmDevice->data().mass[i]<<std::endl;
146
2
}
147
148
















4
BOOST_AUTO_TEST_CASE(load_abstract_model_SimpleHumanoid) {
149
4
  hpp::pinocchio::RbPrmDevicePtr_t rbprmDevice = loadSimpleHumanoidAbsract();
150
  // for(size_t i = 0 ; i < rbprmDevice->data().mass.size() ; ++i)
151
  //  std::cout<<"mass : "<<i<<" = "<<rbprmDevice->data().mass[i]<<std::endl;
152
  // BOOST_CHECK_CLOSE(rbprmDevice->mass(),70.,1e-2); // FIXME : need to
153
  // investigate and open an issue
154
2
  hpp::core::ProblemSolverPtr_t ps = hpp::core::ProblemSolver::create();
155
2
  ps->robot(rbprmDevice);
156



2
  BOOST_CHECK_CLOSE(rbprmDevice->mass(), 70., 1e-2);
157




2
  BOOST_CHECK_CLOSE(ps->robot()->mass(), 70., 1e-2);
158
  // for(size_t i = 0 ; i < rbprmDevice->data().mass.size() ; ++i)
159
  //  std::cout<<"mass : "<<i<<" = "<<rbprmDevice->data().mass[i]<<std::endl;
160
2
}
161
162
















4
BOOST_AUTO_TEST_CASE(straight_line) {
163
4
  hpp::pinocchio::RbPrmDevicePtr_t rbprmDevice = loadSimpleHumanoidAbsract();
164
2
  rbprmDevice->setDimensionExtraConfigSpace(6);
165
4
  BindShooter bShooter;
166
4
  std::vector<double> boundsSO3;
167
2
  boundsSO3.push_back(-1.7);
168
2
  boundsSO3.push_back(1.7);
169
2
  boundsSO3.push_back(-0.1);
170
2
  boundsSO3.push_back(0.1);
171
2
  boundsSO3.push_back(-0.1);
172
2
  boundsSO3.push_back(0.1);
173
2
  bShooter.so3Bounds_ = boundsSO3;
174
  hpp::core::ProblemSolverPtr_t ps =
175
2
      configureRbprmProblemSolverForSupportLimbs(rbprmDevice, bShooter);
176
2
  hpp::core::ProblemSolver& pSolver = *ps;
177

2
  loadObstacleWithAffordance(pSolver, std::string("hpp_environments"),
178
4
                             std::string("multicontact/ground"),
179
4
                             std::string("planning"));
180
  // configure planner
181

2
  pSolver.addPathOptimizer(std::string("RandomShortcutDynamic"));
182

2
  pSolver.configurationShooterType(std::string("RbprmShooter"));
183

2
  pSolver.pathValidationType(std::string("RbprmPathValidation"), 0.05);
184

2
  pSolver.distanceType(std::string("Kinodynamic"));
185

2
  pSolver.steeringMethodType(std::string("RBPRMKinodynamic"));
186

2
  pSolver.pathPlannerType(std::string("DynamicPlanner"));
187
188
  // set problem parameters :
189
2
  double aMax = 0.1;
190
2
  double vMax = 0.3;
191

4
  pSolver.problem()->setParameter(std::string("Kinodynamic/velocityBound"),
192
4
                                  core::Parameter(vMax));
193

4
  pSolver.problem()->setParameter(std::string("Kinodynamic/accelerationBound"),
194
4
                                  core::Parameter(aMax));
195

4
  pSolver.problem()->setParameter(std::string("DynamicPlanner/sizeFootX"),
196
4
                                  core::Parameter(0.2));
197

4
  pSolver.problem()->setParameter(std::string("DynamicPlanner/sizeFootY"),
198
4
                                  core::Parameter(0.12));
199

4
  pSolver.problem()->setParameter(std::string("DynamicPlanner/friction"),
200
4
                                  core::Parameter(0.5));
201
4
  pSolver.problem()->setParameter(
202
4
      std::string("ConfigurationShooter/sampleExtraDOF"),
203
4
      core::Parameter(false));
204
205
6
  for (size_type i = 0; i < 2; ++i) {
206
4
    rbprmDevice->extraConfigSpace().lower(i) = -vMax;
207
4
    rbprmDevice->extraConfigSpace().upper(i) = vMax;
208
  }
209
2
  rbprmDevice->extraConfigSpace().lower(2) = 0.;
210
2
  rbprmDevice->extraConfigSpace().upper(2) = 0.;
211
6
  for (size_type i = 3; i < 5; ++i) {
212
4
    rbprmDevice->extraConfigSpace().lower(i) = -aMax;
213
4
    rbprmDevice->extraConfigSpace().upper(i) = aMax;
214
  }
215
2
  rbprmDevice->extraConfigSpace().lower(5) = 0.;
216
2
  rbprmDevice->extraConfigSpace().upper(5) = 0.;
217
218
  // define the planning problem :
219

4
  core::Configuration_t q_init(rbprmDevice->configSize());
220






2
  q_init << 0, 0, 1.0, 0, 0, 0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0;
221
222
4
  core::Configuration_t q_goal = q_init;
223
2
  q_goal(0) = 1.5;
224
225


2
  pSolver.initConfig(ConfigurationPtr_t(new core::Configuration_t(q_init)));
226


2
  pSolver.addGoalConfig(ConfigurationPtr_t(new core::Configuration_t(q_goal)));
227




2
  BOOST_CHECK_CLOSE(pSolver.robot()->mass(), 70., 1e-2);
228
2
  bool success = pSolver.prepareSolveStepByStep();
229



2
  BOOST_CHECK(success);
230
2
  pSolver.finishSolveStepByStep();
231



2
  BOOST_CHECK(checkPathVector(pSolver.paths().back()));
232



2
  BOOST_CHECK(checkPath(pSolver.paths().back(), 0.5));
233


2
  BOOST_CHECK_EQUAL(pSolver.paths().size(), 1);
234



2
  BOOST_CHECK_CLOSE(pSolver.paths().back()->length(), 8., 1e-6);
235
  core::PathVectorPtr_t pv =
236
4
      dynamic_pointer_cast<core::PathVector>(pSolver.paths().back());
237


2
  BOOST_CHECK_EQUAL(pv->numberPaths(), 1);
238
2
  pSolver.solve();
239


2
  BOOST_CHECK_EQUAL(pSolver.paths().size(), 3);
240



2
  BOOST_CHECK_CLOSE(pSolver.paths().back()->length(), 8., 1e-6);
241



2
  BOOST_CHECK(checkPathVector(pSolver.paths().back()));
242



2
  BOOST_CHECK(checkPath(pSolver.paths().back(), 0.5));
243
2
  pv = dynamic_pointer_cast<core::PathVector>(pSolver.paths().back());
244


2
  BOOST_CHECK_EQUAL(pv->numberPaths(), 1);
245
2
  pSolver.optimizePath(pSolver.paths().back());
246


2
  BOOST_CHECK_EQUAL(pSolver.paths().size(), 4);
247



2
  BOOST_CHECK_CLOSE(pSolver.paths().back()->length(), 8., 1e-6);
248



2
  BOOST_CHECK(checkPathVector(pSolver.paths().back()));
249



2
  BOOST_CHECK(checkPath(pSolver.paths().back(), 0.5));
250
2
  pv = dynamic_pointer_cast<core::PathVector>(pSolver.paths().back());
251


2
  BOOST_CHECK_EQUAL(pv->numberPaths(), 1);
252
2
}
253
254
















4
BOOST_AUTO_TEST_CASE(square_v0) {
255
4
  hpp::pinocchio::RbPrmDevicePtr_t rbprmDevice = loadSimpleHumanoidAbsract();
256
2
  rbprmDevice->setDimensionExtraConfigSpace(6);
257
4
  BindShooter bShooter;
258
4
  std::vector<double> boundsSO3;
259
2
  boundsSO3.push_back(-1.7);
260
2
  boundsSO3.push_back(1.7);
261
2
  boundsSO3.push_back(-0.1);
262
2
  boundsSO3.push_back(0.1);
263
2
  boundsSO3.push_back(-0.1);
264
2
  boundsSO3.push_back(0.1);
265
2
  bShooter.so3Bounds_ = boundsSO3;
266
  hpp::core::ProblemSolverPtr_t ps =
267
2
      configureRbprmProblemSolverForSupportLimbs(rbprmDevice, bShooter);
268
2
  hpp::core::ProblemSolver& pSolver = *ps;
269

2
  loadObstacleWithAffordance(pSolver, std::string("hpp_environments"),
270
4
                             std::string("multicontact/ground"),
271
4
                             std::string("planning"));
272
  // configure planner
273

2
  pSolver.addPathOptimizer(std::string("RandomShortcutDynamic"));
274

2
  pSolver.configurationShooterType(std::string("RbprmShooter"));
275

2
  pSolver.pathValidationType(std::string("RbprmPathValidation"), 0.05);
276

2
  pSolver.distanceType(std::string("Kinodynamic"));
277

2
  pSolver.steeringMethodType(std::string("RBPRMKinodynamic"));
278

2
  pSolver.pathPlannerType(std::string("DynamicPlanner"));
279
280
  // set problem parameters :
281
2
  double aMax = 0.5;
282
2
  double vMax = 1.;
283

4
  pSolver.problem()->setParameter(std::string("Kinodynamic/velocityBound"),
284
4
                                  core::Parameter(vMax));
285

4
  pSolver.problem()->setParameter(std::string("Kinodynamic/accelerationBound"),
286
4
                                  core::Parameter(aMax));
287

4
  pSolver.problem()->setParameter(std::string("DynamicPlanner/sizeFootX"),
288
4
                                  core::Parameter(0.2));
289

4
  pSolver.problem()->setParameter(std::string("DynamicPlanner/sizeFootY"),
290
4
                                  core::Parameter(0.12));
291

4
  pSolver.problem()->setParameter(std::string("DynamicPlanner/friction"),
292
4
                                  core::Parameter(0.5));
293
4
  pSolver.problem()->setParameter(
294
4
      std::string("ConfigurationShooter/sampleExtraDOF"),
295
4
      core::Parameter(false));
296
297
6
  for (size_type i = 0; i < 2; ++i) {
298
4
    rbprmDevice->extraConfigSpace().lower(i) = -vMax;
299
4
    rbprmDevice->extraConfigSpace().upper(i) = vMax;
300
  }
301
2
  rbprmDevice->extraConfigSpace().lower(2) = 0.;
302
2
  rbprmDevice->extraConfigSpace().upper(2) = 0.;
303
6
  for (size_type i = 3; i < 5; ++i) {
304
4
    rbprmDevice->extraConfigSpace().lower(i) = -aMax;
305
4
    rbprmDevice->extraConfigSpace().upper(i) = aMax;
306
  }
307
2
  rbprmDevice->extraConfigSpace().lower(5) = 0.;
308
2
  rbprmDevice->extraConfigSpace().upper(5) = 0.;
309
310
  // define the planning problem :
311

4
  core::Configuration_t q_init(rbprmDevice->configSize());
312






2
  q_init << 0, 0, 1.0, 0, 0, 0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0;
313
314
4
  core::Configuration_t q_goal = q_init;
315
2
  q_goal(0) = 1.;
316
2
  q_goal(1) = 1.;
317
318


2
  pSolver.initConfig(ConfigurationPtr_t(new core::Configuration_t(q_init)));
319


2
  pSolver.addGoalConfig(ConfigurationPtr_t(new core::Configuration_t(q_goal)));
320
2
  bool success = pSolver.prepareSolveStepByStep();
321



2
  BOOST_CHECK(success);
322
2
  pSolver.finishSolveStepByStep();
323


2
  BOOST_CHECK_EQUAL(pSolver.paths().size(), 1);
324



2
  BOOST_CHECK_CLOSE(pSolver.paths().back()->length(), 2.8284271247461898,
325
                    1e-10);
326
2
  pSolver.optimizePath(pSolver.paths().back());
327


2
  BOOST_CHECK_EQUAL(pSolver.paths().size(), 2);
328



2
  BOOST_CHECK_CLOSE(pSolver.paths().back()->length(), 2.8284271247461898,
329
                    1e-10);
330


2
  BOOST_CHECK_EQUAL(
331
      dynamic_pointer_cast<core::PathVector>(pSolver.paths().back())
332
          ->numberPaths(),
333
      1);
334
335
2
  pSolver.resetGoalConfigs();
336
2
  q_goal(0) = 0.;
337
2
  q_goal(1) = 1.;
338


2
  pSolver.addGoalConfig(ConfigurationPtr_t(new core::Configuration_t(q_goal)));
339
2
  success = pSolver.prepareSolveStepByStep();
340



2
  BOOST_CHECK(success);
341
2
  pSolver.finishSolveStepByStep();
342


2
  BOOST_CHECK_EQUAL(pSolver.paths().size(), 3);
343



2
  BOOST_CHECK_CLOSE(pSolver.paths().back()->length(), 2.8284271247461898,
344
                    1e-10);
345
2
  pSolver.optimizePath(pSolver.paths().back());
346


2
  BOOST_CHECK_EQUAL(pSolver.paths().size(), 4);
347



2
  BOOST_CHECK_CLOSE(pSolver.paths().back()->length(), 2.8284271247461898,
348
                    1e-10);
349


2
  BOOST_CHECK_EQUAL(
350
      dynamic_pointer_cast<core::PathVector>(pSolver.paths().back())
351
          ->numberPaths(),
352
      1);
353
354
2
  pSolver.resetGoalConfigs();
355
2
  q_goal(0) = -1.;
356
2
  q_goal(1) = 1.;
357


2
  pSolver.addGoalConfig(ConfigurationPtr_t(new core::Configuration_t(q_goal)));
358
2
  success = pSolver.prepareSolveStepByStep();
359



2
  BOOST_CHECK(success);
360
2
  pSolver.finishSolveStepByStep();
361


2
  BOOST_CHECK_EQUAL(pSolver.paths().size(), 5);
362



2
  BOOST_CHECK_CLOSE(pSolver.paths().back()->length(), 2.8284271247461898,
363
                    1e-10);
364
2
  pSolver.optimizePath(pSolver.paths().back());
365


2
  BOOST_CHECK_EQUAL(pSolver.paths().size(), 6);
366



2
  BOOST_CHECK_CLOSE(pSolver.paths().back()->length(), 2.8284271247461898,
367
                    1e-10);
368


2
  BOOST_CHECK_EQUAL(
369
      dynamic_pointer_cast<core::PathVector>(pSolver.paths().back())
370
          ->numberPaths(),
371
      1);
372
373
2
  pSolver.resetGoalConfigs();
374
2
  q_goal(0) = -1.;
375
2
  q_goal(1) = 0.;
376


2
  pSolver.addGoalConfig(ConfigurationPtr_t(new core::Configuration_t(q_goal)));
377
2
  success = pSolver.prepareSolveStepByStep();
378



2
  BOOST_CHECK(success);
379
2
  pSolver.finishSolveStepByStep();
380


2
  BOOST_CHECK_EQUAL(pSolver.paths().size(), 7);
381



2
  BOOST_CHECK_CLOSE(pSolver.paths().back()->length(), 2.8284271247461898,
382
                    1e-10);
383
2
  pSolver.optimizePath(pSolver.paths().back());
384


2
  BOOST_CHECK_EQUAL(pSolver.paths().size(), 8);
385



2
  BOOST_CHECK_CLOSE(pSolver.paths().back()->length(), 2.8284271247461898,
386
                    1e-10);
387


2
  BOOST_CHECK_EQUAL(
388
      dynamic_pointer_cast<core::PathVector>(pSolver.paths().back())
389
          ->numberPaths(),
390
      1);
391
392
2
  pSolver.resetGoalConfigs();
393
2
  q_goal(0) = -1.5;
394
2
  q_goal(1) = -1.;
395


2
  pSolver.addGoalConfig(ConfigurationPtr_t(new core::Configuration_t(q_goal)));
396
2
  success = pSolver.prepareSolveStepByStep();
397



2
  BOOST_CHECK(success);
398
2
  pSolver.finishSolveStepByStep();
399


2
  BOOST_CHECK_EQUAL(pSolver.paths().size(), 9);
400



2
  BOOST_CHECK_CLOSE(pSolver.paths().back()->length(), 3.4641016151377544,
401
                    1e-10);
402
2
  pSolver.optimizePath(pSolver.paths().back());
403


2
  BOOST_CHECK_EQUAL(pSolver.paths().size(), 10);
404



2
  BOOST_CHECK_CLOSE(pSolver.paths().back()->length(), 3.4641016151377544,
405
                    1e-10);
406


2
  BOOST_CHECK_EQUAL(
407
      dynamic_pointer_cast<core::PathVector>(pSolver.paths().back())
408
          ->numberPaths(),
409
      1);
410
411
2
  pSolver.resetGoalConfigs();
412
2
  q_goal(0) = 0.;
413
2
  q_goal(1) = -1;
414


2
  pSolver.addGoalConfig(ConfigurationPtr_t(new core::Configuration_t(q_goal)));
415
2
  success = pSolver.prepareSolveStepByStep();
416



2
  BOOST_CHECK(success);
417
2
  pSolver.finishSolveStepByStep();
418


2
  BOOST_CHECK_EQUAL(pSolver.paths().size(), 11);
419



2
  BOOST_CHECK_CLOSE(pSolver.paths().back()->length(), 2.8284271247461898,
420
                    1e-10);
421
2
  pSolver.optimizePath(pSolver.paths().back());
422


2
  BOOST_CHECK_EQUAL(pSolver.paths().size(), 12);
423



2
  BOOST_CHECK_CLOSE(pSolver.paths().back()->length(), 2.8284271247461898,
424
                    1e-10);
425


2
  BOOST_CHECK_EQUAL(
426
      dynamic_pointer_cast<core::PathVector>(pSolver.paths().back())
427
          ->numberPaths(),
428
      1);
429
430
2
  pSolver.resetGoalConfigs();
431
2
  q_goal(0) = 1;
432
2
  q_goal(1) = -1;
433


2
  pSolver.addGoalConfig(ConfigurationPtr_t(new core::Configuration_t(q_goal)));
434
2
  success = pSolver.prepareSolveStepByStep();
435



2
  BOOST_CHECK(success);
436
2
  pSolver.finishSolveStepByStep();
437


2
  BOOST_CHECK_EQUAL(pSolver.paths().size(), 13);
438



2
  BOOST_CHECK_CLOSE(pSolver.paths().back()->length(), 2.8284271247461898,
439
                    1e-10);
440
2
  pSolver.optimizePath(pSolver.paths().back());
441


2
  BOOST_CHECK_EQUAL(pSolver.paths().size(), 14);
442



2
  BOOST_CHECK_CLOSE(pSolver.paths().back()->length(), 2.8284271247461898,
443
                    1e-10);
444


2
  BOOST_CHECK_EQUAL(
445
      dynamic_pointer_cast<core::PathVector>(pSolver.paths().back())
446
          ->numberPaths(),
447
      1);
448
449
2
  pSolver.resetGoalConfigs();
450
2
  q_goal(0) = 1.3;
451
2
  q_goal(1) = -1.2;
452


2
  pSolver.addGoalConfig(ConfigurationPtr_t(new core::Configuration_t(q_goal)));
453
2
  success = pSolver.prepareSolveStepByStep();
454



2
  BOOST_CHECK(success);
455
2
  pSolver.finishSolveStepByStep();
456


2
  BOOST_CHECK_EQUAL(pSolver.paths().size(), 15);
457



2
  BOOST_CHECK_CLOSE(pSolver.paths().back()->length(), 3.2249030993194197,
458
                    1e-10);
459
2
  pSolver.optimizePath(pSolver.paths().back());
460


2
  BOOST_CHECK_EQUAL(pSolver.paths().size(), 16);
461



2
  BOOST_CHECK_CLOSE(pSolver.paths().back()->length(), 3.2249030993194197,
462
                    1e-10);
463


2
  BOOST_CHECK_EQUAL(
464
      dynamic_pointer_cast<core::PathVector>(pSolver.paths().back())
465
          ->numberPaths(),
466
      1);
467
2
}
468
469
















4
BOOST_AUTO_TEST_CASE(straight_velocity) {
470
4
  hpp::pinocchio::RbPrmDevicePtr_t rbprmDevice = loadSimpleHumanoidAbsract();
471
2
  rbprmDevice->setDimensionExtraConfigSpace(6);
472
4
  BindShooter bShooter;
473
4
  std::vector<double> boundsSO3;
474
2
  boundsSO3.push_back(-1.7);
475
2
  boundsSO3.push_back(1.7);
476
2
  boundsSO3.push_back(-0.1);
477
2
  boundsSO3.push_back(0.1);
478
2
  boundsSO3.push_back(-0.1);
479
2
  boundsSO3.push_back(0.1);
480
2
  bShooter.so3Bounds_ = boundsSO3;
481
  hpp::core::ProblemSolverPtr_t ps =
482
2
      configureRbprmProblemSolverForSupportLimbs(rbprmDevice, bShooter);
483
2
  hpp::core::ProblemSolver& pSolver = *ps;
484

2
  loadObstacleWithAffordance(pSolver, std::string("hpp_environments"),
485
4
                             std::string("multicontact/ground"),
486
4
                             std::string("planning"));
487
  // configure planner
488

2
  pSolver.addPathOptimizer(std::string("RandomShortcutDynamic"));
489

2
  pSolver.configurationShooterType(std::string("RbprmShooter"));
490

2
  pSolver.pathValidationType(std::string("RbprmPathValidation"), 0.05);
491

2
  pSolver.distanceType(std::string("Kinodynamic"));
492

2
  pSolver.steeringMethodType(std::string("RBPRMKinodynamic"));
493

2
  pSolver.pathPlannerType(std::string("DynamicPlanner"));
494
495
  // set problem parameters :
496
2
  double aMax = 0.5;
497
2
  double vMax = 1.5;
498

4
  pSolver.problem()->setParameter(std::string("Kinodynamic/velocityBound"),
499
4
                                  core::Parameter(vMax));
500

4
  pSolver.problem()->setParameter(std::string("Kinodynamic/accelerationBound"),
501
4
                                  core::Parameter(aMax));
502

4
  pSolver.problem()->setParameter(std::string("DynamicPlanner/sizeFootX"),
503
4
                                  core::Parameter(0.2));
504

4
  pSolver.problem()->setParameter(std::string("DynamicPlanner/sizeFootY"),
505
4
                                  core::Parameter(0.12));
506

4
  pSolver.problem()->setParameter(std::string("DynamicPlanner/friction"),
507
4
                                  core::Parameter(0.5));
508
4
  pSolver.problem()->setParameter(
509
4
      std::string("ConfigurationShooter/sampleExtraDOF"),
510
4
      core::Parameter(false));
511
512
6
  for (size_type i = 0; i < 2; ++i) {
513
4
    rbprmDevice->extraConfigSpace().lower(i) = -vMax;
514
4
    rbprmDevice->extraConfigSpace().upper(i) = vMax;
515
  }
516
2
  rbprmDevice->extraConfigSpace().lower(2) = 0.;
517
2
  rbprmDevice->extraConfigSpace().upper(2) = 0.;
518
6
  for (size_type i = 3; i < 5; ++i) {
519
4
    rbprmDevice->extraConfigSpace().lower(i) = -aMax;
520
4
    rbprmDevice->extraConfigSpace().upper(i) = aMax;
521
  }
522
2
  rbprmDevice->extraConfigSpace().lower(5) = 0.;
523
2
  rbprmDevice->extraConfigSpace().upper(5) = 0.;
524
525
  // define the planning problem :
526

4
  core::Configuration_t q_init(rbprmDevice->configSize());
527






2
  q_init << 0, 0, 1.0, 0, 0, 0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0;
528
2
  q_init(7) = 0.5;  // init velocity along x
529
4
  core::Configuration_t q_goal = q_init;
530
2
  q_goal(0) = 1.;
531
532


2
  pSolver.initConfig(ConfigurationPtr_t(new core::Configuration_t(q_init)));
533


2
  pSolver.addGoalConfig(ConfigurationPtr_t(new core::Configuration_t(q_goal)));
534
2
  bool success = pSolver.prepareSolveStepByStep();
535



2
  BOOST_CHECK(success);
536
2
  pSolver.finishSolveStepByStep();
537


2
  BOOST_CHECK_EQUAL(pSolver.paths().size(), 1);
538



2
  BOOST_CHECK_CLOSE(pSolver.paths().back()->length(), 1.4641016151377546,
539
                    1e-10);
540
2
  pSolver.optimizePath(pSolver.paths().back());
541


2
  BOOST_CHECK_EQUAL(pSolver.paths().size(), 2);
542



2
  BOOST_CHECK_CLOSE(pSolver.paths().back()->length(), 1.4641016151377546,
543
                    1e-10);
544



2
  BOOST_CHECK(checkPathVector(pSolver.paths().back()));
545



2
  BOOST_CHECK(checkPath(pSolver.paths().back(), 1.7));
546


2
  BOOST_CHECK_EQUAL(
547
      dynamic_pointer_cast<core::PathVector>(pSolver.paths().back())
548
          ->numberPaths(),
549
      1);
550
551
2
  pSolver.resetGoalConfigs();
552
2
  q_goal(0) = 0.;
553
2
  q_goal(7) = 0.1;
554
2
  q_goal(8) = -0.2;  // final velocity
555


2
  pSolver.addGoalConfig(ConfigurationPtr_t(new core::Configuration_t(q_goal)));
556
2
  success = pSolver.prepareSolveStepByStep();
557



2
  BOOST_CHECK(success);
558
2
  pSolver.finishSolveStepByStep();
559


2
  BOOST_CHECK_EQUAL(pSolver.paths().size(), 3);
560



2
  BOOST_CHECK_CLOSE(pSolver.paths().back()->length(), 2.642220510185596, 1e-10);
561
2
  pSolver.optimizePath(pSolver.paths().back());
562


2
  BOOST_CHECK_EQUAL(pSolver.paths().size(), 4);
563



2
  BOOST_CHECK_CLOSE(pSolver.paths().back()->length(), 2.642220510185596, 1e-10);
564



2
  BOOST_CHECK(checkPathVector(pSolver.paths().back()));
565



2
  BOOST_CHECK(checkPath(pSolver.paths().back(), 1.7));
566


2
  BOOST_CHECK_EQUAL(
567
      dynamic_pointer_cast<core::PathVector>(pSolver.paths().back())
568
          ->numberPaths(),
569
      1);
570
571
2
  pSolver.resetGoalConfigs();
572
2
  q_goal(0) = 1.;
573
2
  q_goal(7) = -0.3;
574


2
  pSolver.addGoalConfig(ConfigurationPtr_t(new core::Configuration_t(q_goal)));
575
2
  success = pSolver.prepareSolveStepByStep();
576



2
  BOOST_CHECK(success);
577
2
  pSolver.finishSolveStepByStep();
578


2
  BOOST_CHECK_EQUAL(pSolver.paths().size(), 5);
579



2
  BOOST_CHECK_CLOSE(pSolver.paths().back()->length(), 2.8741411087489799,
580
                    1e-10);
581
2
  pSolver.optimizePath(pSolver.paths().back());
582


2
  BOOST_CHECK_EQUAL(pSolver.paths().size(), 6);
583



2
  BOOST_CHECK_CLOSE(pSolver.paths().back()->length(), 2.8741411087489799,
584
                    1e-10);
585



2
  BOOST_CHECK(checkPathVector(pSolver.paths().back()));
586



2
  BOOST_CHECK(checkPath(pSolver.paths().back(), 1.7));
587


2
  BOOST_CHECK_EQUAL(
588
      dynamic_pointer_cast<core::PathVector>(pSolver.paths().back())
589
          ->numberPaths(),
590
      1);
591
592
2
  pSolver.resetGoalConfigs();
593
2
  q_goal(0) = -1.;
594
2
  q_goal(7) = 0.;
595
2
  q_goal(8) = 0.3;
596


2
  pSolver.addGoalConfig(ConfigurationPtr_t(new core::Configuration_t(q_goal)));
597
2
  success = pSolver.prepareSolveStepByStep();
598



2
  BOOST_CHECK(success);
599
2
  pSolver.finishSolveStepByStep();
600


2
  BOOST_CHECK_EQUAL(pSolver.paths().size(), 7);
601



2
  BOOST_CHECK_CLOSE(pSolver.paths().back()->length(), 4.16227766016838, 1e-10);
602
2
  pSolver.optimizePath(pSolver.paths().back());
603


2
  BOOST_CHECK_EQUAL(pSolver.paths().size(), 8);
604



2
  BOOST_CHECK_CLOSE(pSolver.paths().back()->length(), 4.16227766016838, 1e-10);
605



2
  BOOST_CHECK(checkPathVector(pSolver.paths().back()));
606



2
  BOOST_CHECK(checkPath(pSolver.paths().back(), 1.7));
607


2
  BOOST_CHECK_EQUAL(
608
      dynamic_pointer_cast<core::PathVector>(pSolver.paths().back())
609
          ->numberPaths(),
610
      1);
611
2
}
612
613
















4
BOOST_AUTO_TEST_CASE(straight_line_amax_mu05) {
614
4
  hpp::pinocchio::RbPrmDevicePtr_t rbprmDevice = loadSimpleHumanoidAbsract();
615
2
  rbprmDevice->setDimensionExtraConfigSpace(6);
616
4
  BindShooter bShooter;
617
4
  std::vector<double> boundsSO3;
618
2
  boundsSO3.push_back(-1.7);
619
2
  boundsSO3.push_back(1.7);
620
2
  boundsSO3.push_back(-0.1);
621
2
  boundsSO3.push_back(0.1);
622
2
  boundsSO3.push_back(-0.1);
623
2
  boundsSO3.push_back(0.1);
624
2
  bShooter.so3Bounds_ = boundsSO3;
625
  hpp::core::ProblemSolverPtr_t ps =
626
2
      configureRbprmProblemSolverForSupportLimbs(rbprmDevice, bShooter);
627
2
  hpp::core::ProblemSolver& pSolver = *ps;
628

2
  loadObstacleWithAffordance(pSolver, std::string("hpp_environments"),
629
4
                             std::string("multicontact/ground"),
630
4
                             std::string("planning"));
631
  // configure planner
632

2
  pSolver.addPathOptimizer(std::string("RandomShortcutDynamic"));
633

2
  pSolver.configurationShooterType(std::string("RbprmShooter"));
634

2
  pSolver.pathValidationType(std::string("RbprmPathValidation"), 0.05);
635

2
  pSolver.distanceType(std::string("Kinodynamic"));
636

2
  pSolver.steeringMethodType(std::string("RBPRMKinodynamic"));
637

2
  pSolver.pathPlannerType(std::string("DynamicPlanner"));
638
639
  // set problem parameters :
640
2
  double aMax = 10.;
641
2
  double vMax = 1.;
642

4
  pSolver.problem()->setParameter(std::string("Kinodynamic/velocityBound"),
643
4
                                  core::Parameter(vMax));
644

4
  pSolver.problem()->setParameter(std::string("Kinodynamic/accelerationBound"),
645
4
                                  core::Parameter(aMax));
646

4
  pSolver.problem()->setParameter(std::string("DynamicPlanner/sizeFootX"),
647
4
                                  core::Parameter(0.2));
648

4
  pSolver.problem()->setParameter(std::string("DynamicPlanner/sizeFootY"),
649
4
                                  core::Parameter(0.12));
650

4
  pSolver.problem()->setParameter(std::string("DynamicPlanner/friction"),
651
4
                                  core::Parameter(0.5));
652
4
  pSolver.problem()->setParameter(
653
4
      std::string("ConfigurationShooter/sampleExtraDOF"),
654
4
      core::Parameter(false));
655
656
6
  for (size_type i = 0; i < 2; ++i) {
657
4
    rbprmDevice->extraConfigSpace().lower(i) = -vMax;
658
4
    rbprmDevice->extraConfigSpace().upper(i) = vMax;
659
  }
660
2
  rbprmDevice->extraConfigSpace().lower(2) = 0.;
661
2
  rbprmDevice->extraConfigSpace().upper(2) = 0.;
662
6
  for (size_type i = 3; i < 5; ++i) {
663
4
    rbprmDevice->extraConfigSpace().lower(i) = -aMax;
664
4
    rbprmDevice->extraConfigSpace().upper(i) = aMax;
665
  }
666
2
  rbprmDevice->extraConfigSpace().lower(5) = 0.;
667
2
  rbprmDevice->extraConfigSpace().upper(5) = 0.;
668
669
  // define the planning problem :
670

4
  core::Configuration_t q_init(rbprmDevice->configSize());
671






2
  q_init << 0, 0, 1.0, 0, 0, 0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0;
672
673
4
  core::Configuration_t q_goal = q_init;
674
2
  q_goal(0) = 1.5;
675
676


2
  pSolver.initConfig(ConfigurationPtr_t(new core::Configuration_t(q_init)));
677


2
  pSolver.addGoalConfig(ConfigurationPtr_t(new core::Configuration_t(q_goal)));
678




2
  BOOST_CHECK_CLOSE(pSolver.robot()->mass(), 70., 1e-2);
679
2
  bool success = pSolver.prepareSolveStepByStep();
680



2
  BOOST_CHECK(success);
681
2
  pSolver.finishSolveStepByStep();
682


2
  BOOST_CHECK_EQUAL(pSolver.paths().size(), 1);
683



2
  BOOST_CHECK_CLOSE(pSolver.paths().back()->length(), 2.5298682146914024, 1e-6);
684
2
}
685
686
















4
BOOST_AUTO_TEST_CASE(straight_line_amax_mu005) {
687
4
  hpp::pinocchio::RbPrmDevicePtr_t rbprmDevice = loadSimpleHumanoidAbsract();
688
2
  rbprmDevice->setDimensionExtraConfigSpace(6);
689
4
  BindShooter bShooter;
690
4
  std::vector<double> boundsSO3;
691
2
  boundsSO3.push_back(-1.7);
692
2
  boundsSO3.push_back(1.7);
693
2
  boundsSO3.push_back(-0.1);
694
2
  boundsSO3.push_back(0.1);
695
2
  boundsSO3.push_back(-0.1);
696
2
  boundsSO3.push_back(0.1);
697
2
  bShooter.so3Bounds_ = boundsSO3;
698
  hpp::core::ProblemSolverPtr_t ps =
699
2
      configureRbprmProblemSolverForSupportLimbs(rbprmDevice, bShooter);
700
2
  hpp::core::ProblemSolver& pSolver = *ps;
701

2
  loadObstacleWithAffordance(pSolver, std::string("hpp_environments"),
702
4
                             std::string("multicontact/ground"),
703
4
                             std::string("planning"));
704
  // configure planner
705

2
  pSolver.addPathOptimizer(std::string("RandomShortcutDynamic"));
706

2
  pSolver.configurationShooterType(std::string("RbprmShooter"));
707

2
  pSolver.pathValidationType(std::string("RbprmPathValidation"), 0.05);
708

2
  pSolver.distanceType(std::string("Kinodynamic"));
709

2
  pSolver.steeringMethodType(std::string("RBPRMKinodynamic"));
710

2
  pSolver.pathPlannerType(std::string("DynamicPlanner"));
711
712
  // set problem parameters :
713
2
  double aMax = 10.;
714
2
  double vMax = 1.;
715

4
  pSolver.problem()->setParameter(std::string("Kinodynamic/velocityBound"),
716
4
                                  core::Parameter(vMax));
717

4
  pSolver.problem()->setParameter(std::string("Kinodynamic/accelerationBound"),
718
4
                                  core::Parameter(aMax));
719

4
  pSolver.problem()->setParameter(std::string("DynamicPlanner/sizeFootX"),
720
4
                                  core::Parameter(0.2));
721

4
  pSolver.problem()->setParameter(std::string("DynamicPlanner/sizeFootY"),
722
4
                                  core::Parameter(0.12));
723

4
  pSolver.problem()->setParameter(std::string("DynamicPlanner/friction"),
724
4
                                  core::Parameter(0.05));
725
4
  pSolver.problem()->setParameter(
726
4
      std::string("ConfigurationShooter/sampleExtraDOF"),
727
4
      core::Parameter(false));
728
729
6
  for (size_type i = 0; i < 2; ++i) {
730
4
    rbprmDevice->extraConfigSpace().lower(i) = -vMax;
731
4
    rbprmDevice->extraConfigSpace().upper(i) = vMax;
732
  }
733
2
  rbprmDevice->extraConfigSpace().lower(2) = 0.;
734
2
  rbprmDevice->extraConfigSpace().upper(2) = 0.;
735
6
  for (size_type i = 3; i < 5; ++i) {
736
4
    rbprmDevice->extraConfigSpace().lower(i) = -aMax;
737
4
    rbprmDevice->extraConfigSpace().upper(i) = aMax;
738
  }
739
2
  rbprmDevice->extraConfigSpace().lower(5) = 0.;
740
2
  rbprmDevice->extraConfigSpace().upper(5) = 0.;
741
742
  // define the planning problem :
743

4
  core::Configuration_t q_init(rbprmDevice->configSize());
744






2
  q_init << 0, 0, 1.0, 0, 0, 0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0;
745
746
4
  core::Configuration_t q_goal = q_init;
747
2
  q_goal(0) = 1.5;
748
749


2
  pSolver.initConfig(ConfigurationPtr_t(new core::Configuration_t(q_init)));
750


2
  pSolver.addGoalConfig(ConfigurationPtr_t(new core::Configuration_t(q_goal)));
751




2
  BOOST_CHECK_CLOSE(pSolver.robot()->mass(), 70., 1e-2);
752
2
  bool success = pSolver.prepareSolveStepByStep();
753



2
  BOOST_CHECK(success);
754
2
  pSolver.finishSolveStepByStep();
755


2
  BOOST_CHECK_EQUAL(pSolver.paths().size(), 1);
756



2
  BOOST_CHECK_CLOSE(pSolver.paths().back()->length(), 3.5337445642816432, 1e-6);
757
2
}
758
759
















4
BOOST_AUTO_TEST_CASE(straight_line_amax_mu001) {
760
4
  hpp::pinocchio::RbPrmDevicePtr_t rbprmDevice = loadSimpleHumanoidAbsract();
761
2
  rbprmDevice->setDimensionExtraConfigSpace(6);
762
4
  BindShooter bShooter;
763
4
  std::vector<double> boundsSO3;
764
2
  boundsSO3.push_back(-1.7);
765
2
  boundsSO3.push_back(1.7);
766
2
  boundsSO3.push_back(-0.1);
767
2
  boundsSO3.push_back(0.1);
768
2
  boundsSO3.push_back(-0.1);
769
2
  boundsSO3.push_back(0.1);
770
2
  bShooter.so3Bounds_ = boundsSO3;
771
  hpp::core::ProblemSolverPtr_t ps =
772
2
      configureRbprmProblemSolverForSupportLimbs(rbprmDevice, bShooter);
773
2
  hpp::core::ProblemSolver& pSolver = *ps;
774

2
  loadObstacleWithAffordance(pSolver, std::string("hpp_environments"),
775
4
                             std::string("multicontact/ground"),
776
4
                             std::string("planning"));
777
  // configure planner
778

2
  pSolver.addPathOptimizer(std::string("RandomShortcutDynamic"));
779

2
  pSolver.configurationShooterType(std::string("RbprmShooter"));
780

2
  pSolver.pathValidationType(std::string("RbprmPathValidation"), 0.05);
781

2
  pSolver.distanceType(std::string("Kinodynamic"));
782

2
  pSolver.steeringMethodType(std::string("RBPRMKinodynamic"));
783

2
  pSolver.pathPlannerType(std::string("DynamicPlanner"));
784
785
  // set problem parameters :
786
2
  double aMax = 10.;
787
2
  double vMax = 1.;
788

4
  pSolver.problem()->setParameter(std::string("Kinodynamic/velocityBound"),
789
4
                                  core::Parameter(vMax));
790

4
  pSolver.problem()->setParameter(std::string("Kinodynamic/accelerationBound"),
791
4
                                  core::Parameter(aMax));
792

4
  pSolver.problem()->setParameter(std::string("DynamicPlanner/sizeFootX"),
793
4
                                  core::Parameter(0.2));
794

4
  pSolver.problem()->setParameter(std::string("DynamicPlanner/sizeFootY"),
795
4
                                  core::Parameter(0.12));
796

4
  pSolver.problem()->setParameter(std::string("DynamicPlanner/friction"),
797
4
                                  core::Parameter(0.01));
798
4
  pSolver.problem()->setParameter(
799
4
      std::string("ConfigurationShooter/sampleExtraDOF"),
800
4
      core::Parameter(false));
801
802
6
  for (size_type i = 0; i < 2; ++i) {
803
4
    rbprmDevice->extraConfigSpace().lower(i) = -vMax;
804
4
    rbprmDevice->extraConfigSpace().upper(i) = vMax;
805
  }
806
2
  rbprmDevice->extraConfigSpace().lower(2) = 0.;
807
2
  rbprmDevice->extraConfigSpace().upper(2) = 0.;
808
6
  for (size_type i = 3; i < 5; ++i) {
809
4
    rbprmDevice->extraConfigSpace().lower(i) = -aMax;
810
4
    rbprmDevice->extraConfigSpace().upper(i) = aMax;
811
  }
812
2
  rbprmDevice->extraConfigSpace().lower(5) = 0.;
813
2
  rbprmDevice->extraConfigSpace().upper(5) = 0.;
814
815
  // define the planning problem :
816

4
  core::Configuration_t q_init(rbprmDevice->configSize());
817






2
  q_init << 0, 0, 1.0, 0, 0, 0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0;
818
819
4
  core::Configuration_t q_goal = q_init;
820
2
  q_goal(0) = 1.5;
821
822


2
  pSolver.initConfig(ConfigurationPtr_t(new core::Configuration_t(q_init)));
823


2
  pSolver.addGoalConfig(ConfigurationPtr_t(new core::Configuration_t(q_goal)));
824




2
  BOOST_CHECK_CLOSE(pSolver.robot()->mass(), 70., 1e-2);
825
2
  bool success = pSolver.prepareSolveStepByStep();
826



2
  BOOST_CHECK(success);
827
2
  pSolver.finishSolveStepByStep();
828


2
  BOOST_CHECK_EQUAL(pSolver.paths().size(), 1);
829



2
  BOOST_CHECK_CLOSE(pSolver.paths().back()->length(), 8.2531857104894222, 1e-6);
830
2
}
831
832
















4
BOOST_AUTO_TEST_CASE(straight_line_amax_mu5) {
833
4
  hpp::pinocchio::RbPrmDevicePtr_t rbprmDevice = loadSimpleHumanoidAbsract();
834
2
  rbprmDevice->setDimensionExtraConfigSpace(6);
835
4
  BindShooter bShooter;
836
4
  std::vector<double> boundsSO3;
837
2
  boundsSO3.push_back(-1.7);
838
2
  boundsSO3.push_back(1.7);
839
2
  boundsSO3.push_back(-0.1);
840
2
  boundsSO3.push_back(0.1);
841
2
  boundsSO3.push_back(-0.1);
842
2
  boundsSO3.push_back(0.1);
843
2
  bShooter.so3Bounds_ = boundsSO3;
844
  hpp::core::ProblemSolverPtr_t ps =
845
2
      configureRbprmProblemSolverForSupportLimbs(rbprmDevice, bShooter);
846
2
  hpp::core::ProblemSolver& pSolver = *ps;
847

2
  loadObstacleWithAffordance(pSolver, std::string("hpp_environments"),
848
4
                             std::string("multicontact/ground"),
849
4
                             std::string("planning"));
850
  // configure planner
851

2
  pSolver.addPathOptimizer(std::string("RandomShortcutDynamic"));
852

2
  pSolver.configurationShooterType(std::string("RbprmShooter"));
853

2
  pSolver.pathValidationType(std::string("RbprmPathValidation"), 0.05);
854

2
  pSolver.distanceType(std::string("Kinodynamic"));
855

2
  pSolver.steeringMethodType(std::string("RBPRMKinodynamic"));
856

2
  pSolver.pathPlannerType(std::string("DynamicPlanner"));
857
858
  // set problem parameters :
859
2
  double aMax = 10.;
860
2
  double vMax = 1.;
861

4
  pSolver.problem()->setParameter(std::string("Kinodynamic/velocityBound"),
862
4
                                  core::Parameter(vMax));
863

4
  pSolver.problem()->setParameter(std::string("Kinodynamic/accelerationBound"),
864
4
                                  core::Parameter(aMax));
865

4
  pSolver.problem()->setParameter(std::string("DynamicPlanner/sizeFootX"),
866
4
                                  core::Parameter(0.2));
867

4
  pSolver.problem()->setParameter(std::string("DynamicPlanner/sizeFootY"),
868
4
                                  core::Parameter(0.12));
869

4
  pSolver.problem()->setParameter(std::string("DynamicPlanner/friction"),
870
4
                                  core::Parameter(5.));
871
4
  pSolver.problem()->setParameter(
872
4
      std::string("ConfigurationShooter/sampleExtraDOF"),
873
4
      core::Parameter(false));
874
875
6
  for (size_type i = 0; i < 2; ++i) {
876
4
    rbprmDevice->extraConfigSpace().lower(i) = -vMax;
877
4
    rbprmDevice->extraConfigSpace().upper(i) = vMax;
878
  }
879
2
  rbprmDevice->extraConfigSpace().lower(2) = 0.;
880
2
  rbprmDevice->extraConfigSpace().upper(2) = 0.;
881
6
  for (size_type i = 3; i < 5; ++i) {
882
4
    rbprmDevice->extraConfigSpace().lower(i) = -aMax;
883
4
    rbprmDevice->extraConfigSpace().upper(i) = aMax;
884
  }
885
2
  rbprmDevice->extraConfigSpace().lower(5) = 0.;
886
2
  rbprmDevice->extraConfigSpace().upper(5) = 0.;
887
888
  // define the planning problem :
889

4
  core::Configuration_t q_init(rbprmDevice->configSize());
890






2
  q_init << 0, 0, 1.0, 0, 0, 0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0;
891
892
4
  core::Configuration_t q_goal = q_init;
893
2
  q_goal(0) = 1.5;
894
895


2
  pSolver.initConfig(ConfigurationPtr_t(new core::Configuration_t(q_init)));
896


2
  pSolver.addGoalConfig(ConfigurationPtr_t(new core::Configuration_t(q_goal)));
897




2
  BOOST_CHECK_CLOSE(pSolver.robot()->mass(), 70., 1e-2);
898
2
  bool success = pSolver.prepareSolveStepByStep();
899



2
  BOOST_CHECK(success);
900
2
  pSolver.finishSolveStepByStep();
901


2
  BOOST_CHECK_EQUAL(pSolver.paths().size(), 1);
902



2
  BOOST_CHECK_CLOSE(pSolver.paths().back()->length(), 2.5298682886765311, 1e-6);
903
2
}
904
905
















4
BOOST_AUTO_TEST_CASE(straight_line_amax_feetChange) {
906
4
  hpp::pinocchio::RbPrmDevicePtr_t rbprmDevice = loadSimpleHumanoidAbsract();
907
2
  rbprmDevice->setDimensionExtraConfigSpace(6);
908
4
  BindShooter bShooter;
909
4
  std::vector<double> boundsSO3;
910
2
  boundsSO3.push_back(-1.7);
911
2
  boundsSO3.push_back(1.7);
912
2
  boundsSO3.push_back(-0.1);
913
2
  boundsSO3.push_back(0.1);
914
2
  boundsSO3.push_back(-0.1);
915
2
  boundsSO3.push_back(0.1);
916
2
  bShooter.so3Bounds_ = boundsSO3;
917
  hpp::core::ProblemSolverPtr_t ps =
918
2
      configureRbprmProblemSolverForSupportLimbs(rbprmDevice, bShooter);
919
2
  hpp::core::ProblemSolver& pSolver = *ps;
920

2
  loadObstacleWithAffordance(pSolver, std::string("hpp_environments"),
921
4
                             std::string("multicontact/ground"),
922
4
                             std::string("planning"));
923
  // configure planner
924

2
  pSolver.addPathOptimizer(std::string("RandomShortcutDynamic"));
925

2
  pSolver.configurationShooterType(std::string("RbprmShooter"));
926

2
  pSolver.pathValidationType(std::string("RbprmPathValidation"), 0.05);
927

2
  pSolver.distanceType(std::string("Kinodynamic"));
928

2
  pSolver.steeringMethodType(std::string("RBPRMKinodynamic"));
929

2
  pSolver.pathPlannerType(std::string("DynamicPlanner"));
930
931
  // set problem parameters :
932
2
  double aMax = 10.;
933
2
  double vMax = 1.;
934

4
  pSolver.problem()->setParameter(std::string("Kinodynamic/velocityBound"),
935
4
                                  core::Parameter(vMax));
936

4
  pSolver.problem()->setParameter(std::string("Kinodynamic/accelerationBound"),
937
4
                                  core::Parameter(aMax));
938

4
  pSolver.problem()->setParameter(std::string("DynamicPlanner/sizeFootX"),
939
4
                                  core::Parameter(0.05));
940

4
  pSolver.problem()->setParameter(std::string("DynamicPlanner/sizeFootY"),
941
4
                                  core::Parameter(0.05));
942

4
  pSolver.problem()->setParameter(std::string("DynamicPlanner/friction"),
943
4
                                  core::Parameter(0.5));
944
4
  pSolver.problem()->setParameter(
945
4
      std::string("ConfigurationShooter/sampleExtraDOF"),
946
4
      core::Parameter(false));
947
948
6
  for (size_type i = 0; i < 2; ++i) {
949
4
    rbprmDevice->extraConfigSpace().lower(i) = -vMax;
950
4
    rbprmDevice->extraConfigSpace().upper(i) = vMax;
951
  }
952
2
  rbprmDevice->extraConfigSpace().lower(2) = 0.;
953
2
  rbprmDevice->extraConfigSpace().upper(2) = 0.;
954
6
  for (size_type i = 3; i < 5; ++i) {
955
4
    rbprmDevice->extraConfigSpace().lower(i) = -aMax;
956
4
    rbprmDevice->extraConfigSpace().upper(i) = aMax;
957
  }
958
2
  rbprmDevice->extraConfigSpace().lower(5) = 0.;
959
2
  rbprmDevice->extraConfigSpace().upper(5) = 0.;
960
961
  // define the planning problem :
962

4
  core::Configuration_t q_init(rbprmDevice->configSize());
963






2
  q_init << 0, 0, 1.0, 0, 0, 0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0;
964
965
4
  core::Configuration_t q_goal = q_init;
966
2
  q_goal(0) = 1.5;
967
968


2
  pSolver.initConfig(ConfigurationPtr_t(new core::Configuration_t(q_init)));
969


2
  pSolver.addGoalConfig(ConfigurationPtr_t(new core::Configuration_t(q_goal)));
970




2
  BOOST_CHECK_CLOSE(pSolver.robot()->mass(), 70., 1e-2);
971
2
  bool success = pSolver.prepareSolveStepByStep();
972



2
  BOOST_CHECK(success);
973
2
  pSolver.finishSolveStepByStep();
974


2
  BOOST_CHECK_EQUAL(pSolver.paths().size(), 1);
975



2
  BOOST_CHECK_CLOSE(pSolver.paths().back()->length(), 5.0502312883507487, 1e-6);
976
2
}
977
978
















4
BOOST_AUTO_TEST_CASE(nav_bauzil) {
979
  std::cout
980
2
      << "start nav_bauzil test case, this may take a couple of minutes ..."
981
2
      << std::endl;
982
  // this test case may take up to a minute to execute. Usually after ~5 minutes
983
  // it should be considered as a failure.
984
4
  hpp::pinocchio::RbPrmDevicePtr_t rbprmDevice = loadSimpleHumanoidAbsract();
985
2
  rbprmDevice->setDimensionExtraConfigSpace(6);
986
4
  BindShooter bShooter;
987
4
  std::vector<double> boundsSO3;
988
2
  boundsSO3.push_back(-4);
989
2
  boundsSO3.push_back(4);
990
2
  boundsSO3.push_back(-0.1);
991
2
  boundsSO3.push_back(0.1);
992
2
  boundsSO3.push_back(-0.1);
993
2
  boundsSO3.push_back(0.1);
994
2
  bShooter.so3Bounds_ = boundsSO3;
995
  hpp::core::ProblemSolverPtr_t ps =
996
2
      configureRbprmProblemSolverForSupportLimbs(rbprmDevice, bShooter);
997
2
  hpp::core::ProblemSolver& pSolver = *ps;
998

2
  loadObstacleWithAffordance(pSolver, std::string("hpp_environments"),
999
4
                             std::string("multicontact/floor_bauzil"),
1000
4
                             std::string("planning"));
1001
  // configure planner
1002

2
  pSolver.addPathOptimizer(std::string("RandomShortcutDynamic"));
1003

2
  pSolver.configurationShooterType(std::string("RbprmShooter"));
1004

2
  pSolver.pathValidationType(std::string("RbprmPathValidation"), 0.05);
1005

2
  pSolver.distanceType(std::string("Kinodynamic"));
1006

2
  pSolver.steeringMethodType(std::string("RBPRMKinodynamic"));
1007

2
  pSolver.pathPlannerType(std::string("DynamicPlanner"));
1008
1009
  // set problem parameters :
1010
2
  double aMax = 0.1;
1011
2
  double vMax = 0.3;
1012

4
  pSolver.problem()->setParameter(std::string("Kinodynamic/velocityBound"),
1013
4
                                  core::Parameter(vMax));
1014

4
  pSolver.problem()->setParameter(std::string("Kinodynamic/accelerationBound"),
1015
4
                                  core::Parameter(aMax));
1016

4
  pSolver.problem()->setParameter(std::string("DynamicPlanner/sizeFootX"),
1017
4
                                  core::Parameter(0.2));
1018

4
  pSolver.problem()->setParameter(std::string("DynamicPlanner/sizeFootY"),
1019
4
                                  core::Parameter(0.12));
1020

4
  pSolver.problem()->setParameter(std::string("DynamicPlanner/friction"),
1021
4
                                  core::Parameter(0.5));
1022
4
  pSolver.problem()->setParameter(
1023
4
      std::string("ConfigurationShooter/sampleExtraDOF"),
1024
4
      core::Parameter(false));
1025
4
  pSolver.problem()->setParameter(
1026
4
      std::string("PathOptimization/RandomShortcut/NumberOfLoops"),
1027
4
      core::Parameter((core::size_type)50));
1028
1029
6
  for (size_type i = 0; i < 2; ++i) {
1030
4
    rbprmDevice->extraConfigSpace().lower(i) = -vMax;
1031
4
    rbprmDevice->extraConfigSpace().upper(i) = vMax;
1032
  }
1033
2
  rbprmDevice->extraConfigSpace().lower(2) = 0.;
1034
2
  rbprmDevice->extraConfigSpace().upper(2) = 0.;
1035
6
  for (size_type i = 3; i < 5; ++i) {
1036
4
    rbprmDevice->extraConfigSpace().lower(i) = -aMax;
1037
4
    rbprmDevice->extraConfigSpace().upper(i) = aMax;
1038
  }
1039
2
  rbprmDevice->extraConfigSpace().lower(5) = 0.;
1040
2
  rbprmDevice->extraConfigSpace().upper(5) = 0.;
1041
1042
  // define the planning problem :
1043

4
  core::Configuration_t q_init(rbprmDevice->configSize());
1044






2
  q_init << -0.9, 1.5, 1., 0.0, 0.0, 0.0, 1.0, 0.07, 0, 0, 0.0, 0.0, 0.0;
1045

4
  core::Configuration_t q_goal(rbprmDevice->configSize());
1046






2
  q_goal << 2, 2.6, 1., 0.0, 0.0, 0.0, 1.0, 0.1, 0, 0, 0.0, 0.0, 0.0;
1047
1048


2
  pSolver.initConfig(ConfigurationPtr_t(new core::Configuration_t(q_init)));
1049


2
  pSolver.addGoalConfig(ConfigurationPtr_t(new core::Configuration_t(q_goal)));
1050




2
  BOOST_CHECK_CLOSE(pSolver.robot()->mass(), 70., 1e-2);
1051
1052
2
  pSolver.solve();
1053


2
  BOOST_CHECK_EQUAL(pSolver.paths().size(), 2);
1054
  std::cout
1055
2
      << "Solve complete, start optimization. This may take few minutes ..."
1056
2
      << std::endl;
1057



2
  BOOST_CHECK(checkPathVector(pSolver.paths().back()));
1058



2
  BOOST_CHECK(checkPath(pSolver.paths().back(), 0.5));
1059
22
  for (size_t i = 0; i < 10; ++i) {
1060
20
    pSolver.optimizePath(pSolver.paths().back());
1061


20
    BOOST_CHECK_EQUAL(pSolver.paths().size(), 3 + i);
1062



20
    BOOST_CHECK(checkPathVector(pSolver.paths().back()));
1063



20
    BOOST_CHECK(checkPath(pSolver.paths().back(), 0.5));
1064


20
    std::cout << "(" << i + 1 << "/10)  " << std::flush;
1065
  }
1066
2
  std::cout << std::endl;
1067
2
}
1068
1069
















4
BOOST_AUTO_TEST_CASE(nav_bauzil_oriented) {
1070
  std::cout << "start nav_bauzil_oriented test case, this may take a couple of "
1071
2
               "minutes ..."
1072
2
            << std::endl;
1073
  // this test case may take up to a minute to execute. Usually after ~5 minutes
1074
  // it should be considered as a failure.
1075
4
  hpp::pinocchio::RbPrmDevicePtr_t rbprmDevice = loadSimpleHumanoidAbsract();
1076
2
  rbprmDevice->setDimensionExtraConfigSpace(6);
1077
4
  BindShooter bShooter;
1078
4
  std::vector<double> boundsSO3;
1079
2
  boundsSO3.push_back(-4);
1080
2
  boundsSO3.push_back(4);
1081
2
  boundsSO3.push_back(-0.1);
1082
2
  boundsSO3.push_back(0.1);
1083
2
  boundsSO3.push_back(-0.1);
1084
2
  boundsSO3.push_back(0.1);
1085
2
  bShooter.so3Bounds_ = boundsSO3;
1086
  hpp::core::ProblemSolverPtr_t ps =
1087
2
      configureRbprmProblemSolverForSupportLimbs(rbprmDevice, bShooter);
1088
2
  hpp::core::ProblemSolver& pSolver = *ps;
1089

2
  loadObstacleWithAffordance(pSolver, std::string("hpp_environments"),
1090
4
                             std::string("multicontact/floor_bauzil"),
1091
4
                             std::string("planning"));
1092
  // configure planner
1093

2
  pSolver.addPathOptimizer(std::string("RandomShortcutDynamic"));
1094

2
  pSolver.configurationShooterType(std::string("RbprmShooter"));
1095

2
  pSolver.pathValidationType(std::string("RbprmPathValidation"), 0.05);
1096

2
  pSolver.distanceType(std::string("Kinodynamic"));
1097

2
  pSolver.steeringMethodType(std::string("RBPRMKinodynamic"));
1098

2
  pSolver.pathPlannerType(std::string("DynamicPlanner"));
1099
1100
  // set problem parameters :
1101
2
  double aMax = 0.1;
1102
2
  double vMax = 0.3;
1103

4
  pSolver.problem()->setParameter(std::string("Kinodynamic/velocityBound"),
1104
4
                                  core::Parameter(vMax));
1105

4
  pSolver.problem()->setParameter(std::string("Kinodynamic/accelerationBound"),
1106
4
                                  core::Parameter(aMax));
1107
4
  pSolver.problem()->setParameter(
1108

4
      std::string("Kinodynamic/forceAllOrientation"), core::Parameter(true));
1109

4
  pSolver.problem()->setParameter(std::string("DynamicPlanner/sizeFootX"),
1110
4
                                  core::Parameter(0.2));
1111

4
  pSolver.problem()->setParameter(std::string("DynamicPlanner/sizeFootY"),
1112
4
                                  core::Parameter(0.12));
1113

4
  pSolver.problem()->setParameter(std::string("DynamicPlanner/friction"),
1114
4
                                  core::Parameter(0.5));
1115
4
  pSolver.problem()->setParameter(
1116
4
      std::string("ConfigurationShooter/sampleExtraDOF"),
1117
4
      core::Parameter(false));
1118
4
  pSolver.problem()->setParameter(
1119
4
      std::string("PathOptimization/RandomShortcut/NumberOfLoops"),
1120
4
      core::Parameter((core::size_type)50));
1121
1122
6
  for (size_type i = 0; i < 2; ++i) {
1123
4
    rbprmDevice->extraConfigSpace().lower(i) = -vMax;
1124
4
    rbprmDevice->extraConfigSpace().upper(i) = vMax;
1125
  }
1126
2
  rbprmDevice->extraConfigSpace().lower(2) = 0.;
1127
2
  rbprmDevice->extraConfigSpace().upper(2) = 0.;
1128
6
  for (size_type i = 3; i < 5; ++i) {
1129
4
    rbprmDevice->extraConfigSpace().lower(i) = -aMax;
1130
4
    rbprmDevice->extraConfigSpace().upper(i) = aMax;
1131
  }
1132
2
  rbprmDevice->extraConfigSpace().lower(5) = 0.;
1133
2
  rbprmDevice->extraConfigSpace().upper(5) = 0.;
1134
1135
  // define the planning problem :
1136

4
  core::Configuration_t q_init(rbprmDevice->configSize());
1137






2
  q_init << -0.9, 1.5, 1., 0.0, 0.0, 0.0, 1.0, 0.07, 0, 0, 0.0, 0.0, 0.0;
1138

4
  core::Configuration_t q_goal(rbprmDevice->configSize());
1139






2
  q_goal << 2, 2.6, 1., 0.0, 0.0, 0.0, 1.0, 0.1, 0, 0, 0.0, 0.0, 0.0;
1140
1141


2
  pSolver.initConfig(ConfigurationPtr_t(new core::Configuration_t(q_init)));
1142


2
  pSolver.addGoalConfig(ConfigurationPtr_t(new core::Configuration_t(q_goal)));
1143




2
  BOOST_CHECK_CLOSE(pSolver.robot()->mass(), 70., 1e-2);
1144
1145
2
  pSolver.solve();
1146


2
  BOOST_CHECK_EQUAL(pSolver.paths().size(), 2);
1147
  std::cout
1148
2
      << "Solve complete, start optimization. This may take few minutes ..."
1149
2
      << std::endl;
1150



2
  BOOST_CHECK(checkPathVector(pSolver.paths().back()));
1151



2
  BOOST_CHECK(checkPath(pSolver.paths().back(), 0.5));
1152
22
  for (size_t i = 0; i < 10; ++i) {
1153
20
    pSolver.optimizePath(pSolver.paths().back());
1154


20
    BOOST_CHECK_EQUAL(pSolver.paths().size(), 3 + i);
1155



20
    BOOST_CHECK(checkPathVector(pSolver.paths().back()));
1156



20
    BOOST_CHECK(checkPath(pSolver.paths().back(), 0.5));
1157


20
    std::cout << "(" << i + 1 << "/10)  " << std::flush;
1158
  }
1159
2
  std::cout << std::endl;
1160
2
}
1161
1162
















4
BOOST_AUTO_TEST_CASE(nav_bauzil_oriented_kino) {
1163
  std::cout << "start nav_bauzil_oriented_kino test case, this may take a "
1164
2
               "couple of minutes ..."
1165
2
            << std::endl;
1166
  // this test case may take up to a minute to execute. Usually after ~5 minutes
1167
  // it should be considered as a failure.
1168
4
  hpp::pinocchio::RbPrmDevicePtr_t rbprmDevice = loadSimpleHumanoidAbsract();
1169
2
  rbprmDevice->setDimensionExtraConfigSpace(6);
1170
4
  BindShooter bShooter;
1171
4
  std::vector<double> boundsSO3;
1172
2
  boundsSO3.push_back(-4);
1173
2
  boundsSO3.push_back(4);
1174
2
  boundsSO3.push_back(-0.1);
1175
2
  boundsSO3.push_back(0.1);
1176
2
  boundsSO3.push_back(-0.1);
1177
2
  boundsSO3.push_back(0.1);
1178
2
  bShooter.so3Bounds_ = boundsSO3;
1179
  hpp::core::ProblemSolverPtr_t ps =
1180
2
      configureRbprmProblemSolverForSupportLimbs(rbprmDevice, bShooter);
1181
2
  hpp::core::ProblemSolver& pSolver = *ps;
1182

2
  loadObstacleWithAffordance(pSolver, std::string("hpp_environments"),
1183
4
                             std::string("multicontact/floor_bauzil"),
1184
4
                             std::string("planning"));
1185
  // configure planner
1186

2
  pSolver.addPathOptimizer(std::string("RandomShortcutDynamic"));
1187

2
  pSolver.configurationShooterType(std::string("RbprmShooter"));
1188

2
  pSolver.pathValidationType(std::string("RbprmPathValidation"), 0.05);
1189

2
  pSolver.distanceType(std::string("Kinodynamic"));
1190

2
  pSolver.steeringMethodType(std::string("RBPRMKinodynamic"));
1191

2
  pSolver.pathPlannerType(std::string("DynamicPlanner"));
1192
1193
  // set problem parameters :
1194
2
  double aMax = 0.1;
1195
2
  double vMax = 0.3;
1196

4
  pSolver.problem()->setParameter(std::string("Kinodynamic/velocityBound"),
1197
4
                                  core::Parameter(vMax));
1198

4
  pSolver.problem()->setParameter(std::string("Kinodynamic/accelerationBound"),
1199
4
                                  core::Parameter(aMax));
1200
4
  pSolver.problem()->setParameter(
1201

4
      std::string("Kinodynamic/forceAllOrientation"), core::Parameter(true));
1202

4
  pSolver.problem()->setParameter(std::string("DynamicPlanner/sizeFootX"),
1203
4
                                  core::Parameter(0.2));
1204

4
  pSolver.problem()->setParameter(std::string("DynamicPlanner/sizeFootY"),
1205
4
                                  core::Parameter(0.12));
1206

4
  pSolver.problem()->setParameter(std::string("DynamicPlanner/friction"),
1207
4
                                  core::Parameter(0.5));
1208
4
  pSolver.problem()->setParameter(
1209
4
      std::string("ConfigurationShooter/sampleExtraDOF"),
1210
4
      core::Parameter(true));
1211
4
  pSolver.problem()->setParameter(
1212
4
      std::string("PathOptimization/RandomShortcut/NumberOfLoops"),
1213
4
      core::Parameter((core::size_type)50));
1214
1215
6
  for (size_type i = 0; i < 2; ++i) {
1216
4
    rbprmDevice->extraConfigSpace().lower(i) = -vMax;
1217
4
    rbprmDevice->extraConfigSpace().upper(i) = vMax;
1218
  }
1219
2
  rbprmDevice->extraConfigSpace().lower(2) = 0.;
1220
2
  rbprmDevice->extraConfigSpace().upper(2) = 0.;
1221
6
  for (size_type i = 3; i < 5; ++i) {
1222
4
    rbprmDevice->extraConfigSpace().lower(i) = -aMax;
1223
4
    rbprmDevice->extraConfigSpace().upper(i) = aMax;
1224
  }
1225
2
  rbprmDevice->extraConfigSpace().lower(5) = 0.;
1226
2
  rbprmDevice->extraConfigSpace().upper(5) = 0.;
1227
1228
  // define the planning problem :
1229

4
  core::Configuration_t q_init(rbprmDevice->configSize());
1230






2
  q_init << -0.9, 1.5, 1., 0.0, 0.0, 0.0, 1.0, 0.07, 0, 0, 0.0, 0.0, 0.0;
1231

4
  core::Configuration_t q_goal(rbprmDevice->configSize());
1232






2
  q_goal << 2, 2.6, 1., 0.0, 0.0, 0.0, 1.0, 0.1, 0, 0, 0.0, 0.0, 0.0;
1233
1234


2
  pSolver.initConfig(ConfigurationPtr_t(new core::Configuration_t(q_init)));
1235


2
  pSolver.addGoalConfig(ConfigurationPtr_t(new core::Configuration_t(q_goal)));
1236




2
  BOOST_CHECK_CLOSE(pSolver.robot()->mass(), 70., 1e-2);
1237
1238
2
  pSolver.solve();
1239


2
  BOOST_CHECK_EQUAL(pSolver.paths().size(), 2);
1240
  std::cout
1241
2
      << "Solve complete, start optimization. This may take few minutes ..."
1242
2
      << std::endl;
1243



2
  BOOST_CHECK(checkPathVector(pSolver.paths().back()));
1244



2
  BOOST_CHECK(checkPath(pSolver.paths().back(), 0.5));
1245
22
  for (size_t i = 0; i < 10; ++i) {
1246
20
    pSolver.optimizePath(pSolver.paths().back());
1247


20
    BOOST_CHECK_EQUAL(pSolver.paths().size(), 3 + i);
1248



20
    BOOST_CHECK(checkPathVector(pSolver.paths().back()));
1249



20
    BOOST_CHECK(checkPath(pSolver.paths().back(), 0.5));
1250


20
    std::cout << "(" << i + 1 << "/10)  " << std::flush;
1251
  }
1252
2
  std::cout << std::endl;
1253
2
}
1254
1255
















4
BOOST_AUTO_TEST_CASE(nav_bauzil_hyq) {
1256
  std::cout
1257
2
      << "start nav_bauzil_hyq test case, this may take a couple of minutes ..."
1258
2
      << std::endl;
1259
  // this test case may take up to a minute to execute. Usually after ~5 minutes
1260
  // it should be considered as a failure.
1261
4
  hpp::pinocchio::RbPrmDevicePtr_t rbprmDevice = loadHyQAbsract();
1262

2
  rbprmDevice->rootJoint()->lowerBound(2, 0.62);
1263

2
  rbprmDevice->rootJoint()->upperBound(2, 0.62);
1264
2
  rbprmDevice->setDimensionExtraConfigSpace(6);
1265
4
  BindShooter bShooter;
1266
4
  std::vector<double> boundsSO3;
1267
2
  boundsSO3.push_back(-4);
1268
2
  boundsSO3.push_back(4);
1269
2
  boundsSO3.push_back(-0.1);
1270
2
  boundsSO3.push_back(0.1);
1271
2
  boundsSO3.push_back(-0.1);
1272
2
  boundsSO3.push_back(0.1);
1273
2
  bShooter.so3Bounds_ = boundsSO3;
1274
  hpp::core::ProblemSolverPtr_t ps =
1275
2
      configureRbprmProblemSolverForSupportLimbs(rbprmDevice, bShooter);
1276
2
  hpp::core::ProblemSolver& pSolver = *ps;
1277

2
  loadObstacleWithAffordance(pSolver, std::string("hpp_environments"),
1278
4
                             std::string("multicontact/floor_bauzil"),
1279
4
                             std::string("planning"));
1280
  // configure planner
1281

2
  pSolver.addPathOptimizer(std::string("RandomShortcutDynamic"));
1282

2
  pSolver.configurationShooterType(std::string("RbprmShooter"));
1283

2
  pSolver.pathValidationType(std::string("RbprmPathValidation"), 0.05);
1284

2
  pSolver.distanceType(std::string("Kinodynamic"));
1285

2
  pSolver.steeringMethodType(std::string("RBPRMKinodynamic"));
1286

2
  pSolver.pathPlannerType(std::string("DynamicPlanner"));
1287
1288
  // set problem parameters :
1289
2
  double aMax = 0.5;
1290
2
  double vMax = 0.3;
1291

4
  pSolver.problem()->setParameter(std::string("Kinodynamic/velocityBound"),
1292
4
                                  core::Parameter(vMax));
1293

4
  pSolver.problem()->setParameter(std::string("Kinodynamic/accelerationBound"),
1294
4
                                  core::Parameter(aMax));
1295

4
  pSolver.problem()->setParameter(std::string("DynamicPlanner/sizeFootX"),
1296
4
                                  core::Parameter(0.01));
1297

4
  pSolver.problem()->setParameter(std::string("DynamicPlanner/sizeFootY"),
1298
4
                                  core::Parameter(0.01));
1299

4
  pSolver.problem()->setParameter(std::string("DynamicPlanner/friction"),
1300
4
                                  core::Parameter(0.5));
1301
4
  pSolver.problem()->setParameter(
1302
4
      std::string("ConfigurationShooter/sampleExtraDOF"),
1303
4
      core::Parameter(false));
1304
4
  pSolver.problem()->setParameter(
1305
4
      std::string("PathOptimization/RandomShortcut/NumberOfLoops"),
1306
4
      core::Parameter((core::size_type)50));
1307
1308
6
  for (size_type i = 0; i < 2; ++i) {
1309
4
    rbprmDevice->extraConfigSpace().lower(i) = -vMax;
1310
4
    rbprmDevice->extraConfigSpace().upper(i) = vMax;
1311
  }
1312
2
  rbprmDevice->extraConfigSpace().lower(2) = 0.;
1313
2
  rbprmDevice->extraConfigSpace().upper(2) = 0.;
1314
6
  for (size_type i = 3; i < 5; ++i) {
1315
4
    rbprmDevice->extraConfigSpace().lower(i) = -aMax;
1316
4
    rbprmDevice->extraConfigSpace().upper(i) = aMax;
1317
  }
1318
2
  rbprmDevice->extraConfigSpace().lower(5) = 0.;
1319
2
  rbprmDevice->extraConfigSpace().upper(5) = 0.;
1320
1321
  // define the planning problem :
1322

4
  core::Configuration_t q_init(rbprmDevice->configSize());
1323






2
  q_init << -0.2, 1.9, 0.62, 0.0, 0.0, 0.0, 1.0, 0.05, 0, 0, 0.0, 0.0, 0.0;
1324

4
  core::Configuration_t q_goal(rbprmDevice->configSize());
1325






2
  q_goal << 3.7, 0., 0.62, 0, 0, -0.7071, 0.7071, 0., -0.1, 0, 0.0, 0.0, 0.0;
1326


2
  hpp::pinocchio::normalize(rbprmDevice, q_goal.head(rbprmDevice->model().nq));
1327
1328


2
  pSolver.initConfig(ConfigurationPtr_t(new core::Configuration_t(q_init)));
1329


2
  pSolver.addGoalConfig(ConfigurationPtr_t(new core::Configuration_t(q_goal)));
1330




2
  BOOST_CHECK_CLOSE(pSolver.robot()->mass(), 76.07, 1e-2);
1331
1332
2
  pSolver.solve();
1333


2
  BOOST_CHECK_EQUAL(pSolver.paths().size(), 2);
1334
  std::cout
1335
2
      << "Solve complete, start optimization. This may take few minutes ..."
1336
2
      << std::endl;
1337



2
  BOOST_CHECK(checkPathVector(pSolver.paths().back()));
1338



2
  BOOST_CHECK(checkPath(pSolver.paths().back(), 0.5));
1339
22
  for (size_t i = 0; i < 10; ++i) {
1340
20
    pSolver.optimizePath(pSolver.paths().back());
1341


20
    BOOST_CHECK_EQUAL(pSolver.paths().size(), 3 + i);
1342



20
    BOOST_CHECK(checkPathVector(pSolver.paths().back()));
1343



20
    BOOST_CHECK(checkPath(pSolver.paths().back(), 0.5));
1344


20
    std::cout << "(" << i + 1 << "/10)  " << std::flush;
1345
  }
1346
2
  std::cout << std::endl;
1347
2
}
1348
1349
















4
BOOST_AUTO_TEST_CASE(nav_bauzil_oriented_hyq) {
1350
  std::cout << "start nav_bauzil_oriented_hyq test case, this may take a "
1351
2
               "couple of minutes ..."
1352
2
            << std::endl;
1353
  // this test case may take up to a minute to execute. Usually after ~5 minutes
1354
  // it should be considered as a failure.
1355
4
  hpp::pinocchio::RbPrmDevicePtr_t rbprmDevice = loadHyQAbsract();
1356

2
  rbprmDevice->rootJoint()->lowerBound(2, 0.62);
1357

2
  rbprmDevice->rootJoint()->upperBound(2, 0.62);
1358
2
  rbprmDevice->setDimensionExtraConfigSpace(6);
1359
4
  BindShooter bShooter;
1360
4
  std::vector<double> boundsSO3;
1361
2
  boundsSO3.push_back(-4);
1362
2
  boundsSO3.push_back(4);
1363
2
  boundsSO3.push_back(-0.1);
1364
2
  boundsSO3.push_back(0.1);
1365
2
  boundsSO3.push_back(-0.1);
1366
2
  boundsSO3.push_back(0.1);
1367
2
  bShooter.so3Bounds_ = boundsSO3;
1368
  hpp::core::ProblemSolverPtr_t ps =
1369
2
      configureRbprmProblemSolverForSupportLimbs(rbprmDevice, bShooter);
1370
2
  hpp::core::ProblemSolver& pSolver = *ps;
1371

2
  loadObstacleWithAffordance(pSolver, std::string("hpp_environments"),
1372
4
                             std::string("multicontact/floor_bauzil"),
1373
4
                             std::string("planning"));
1374
  // configure planner
1375

2
  pSolver.addPathOptimizer(std::string("RandomShortcutDynamic"));
1376

2
  pSolver.configurationShooterType(std::string("RbprmShooter"));
1377

2
  pSolver.pathValidationType(std::string("RbprmPathValidation"), 0.05);
1378

2
  pSolver.distanceType(std::string("Kinodynamic"));
1379

2
  pSolver.steeringMethodType(std::string("RBPRMKinodynamic"));
1380

2
  pSolver.pathPlannerType(std::string("DynamicPlanner"));
1381
1382
  // set problem parameters :
1383
2
  double aMax = 0.5;
1384
2
  double vMax = 0.3;
1385

4
  pSolver.problem()->setParameter(std::string("Kinodynamic/velocityBound"),
1386
4
                                  core::Parameter(vMax));
1387

4
  pSolver.problem()->setParameter(std::string("Kinodynamic/accelerationBound"),
1388
4
                                  core::Parameter(aMax));
1389
4
  pSolver.problem()->setParameter(
1390

4
      std::string("Kinodynamic/forceAllOrientation"), core::Parameter(true));
1391

4
  pSolver.problem()->setParameter(std::string("DynamicPlanner/sizeFootX"),
1392
4
                                  core::Parameter(0.01));
1393

4
  pSolver.problem()->setParameter(std::string("DynamicPlanner/sizeFootY"),
1394
4
                                  core::Parameter(0.01));
1395

4
  pSolver.problem()->setParameter(std::string("DynamicPlanner/friction"),
1396
4
                                  core::Parameter(0.5));
1397
4
  pSolver.problem()->setParameter(
1398
4
      std::string("ConfigurationShooter/sampleExtraDOF"),
1399
4
      core::Parameter(false));
1400
4
  pSolver.problem()->setParameter(
1401
4
      std::string("PathOptimization/RandomShortcut/NumberOfLoops"),
1402
4
      core::Parameter((core::size_type)50));
1403
1404
6
  for (size_type i = 0; i < 2; ++i) {
1405
4
    rbprmDevice->extraConfigSpace().lower(i) = -vMax;
1406
4
    rbprmDevice->extraConfigSpace().upper(i) = vMax;
1407
  }
1408
2
  rbprmDevice->extraConfigSpace().lower(2) = 0.;
1409
2
  rbprmDevice->extraConfigSpace().upper(2) = 0.;
1410
6
  for (size_type i = 3; i < 5; ++i) {
1411
4
    rbprmDevice->extraConfigSpace().lower(i) = -aMax;
1412
4
    rbprmDevice->extraConfigSpace().upper(i) = aMax;
1413
  }
1414
2
  rbprmDevice->extraConfigSpace().lower(5) = 0.;
1415
2
  rbprmDevice->extraConfigSpace().upper(5) = 0.;
1416
1417
  // define the planning problem :
1418

4
  core::Configuration_t q_init(rbprmDevice->configSize());
1419






2
  q_init << -0.2, 1.9, 0.62, 0.0, 0.0, 0.0, 1.0, 0.05, 0, 0, 0.0, 0.0, 0.0;
1420

4
  core::Configuration_t q_goal(rbprmDevice->configSize());
1421






2
  q_goal << 3.7, 0., 0.62, 0, 0, -0.7071, 0.7071, 0., -0.1, 0, 0.0, 0.0, 0.0;
1422


2
  hpp::pinocchio::normalize(rbprmDevice, q_goal.head(rbprmDevice->model().nq));
1423
1424


2
  pSolver.initConfig(ConfigurationPtr_t(new core::Configuration_t(q_init)));
1425


2
  pSolver.addGoalConfig(ConfigurationPtr_t(new core::Configuration_t(q_goal)));
1426




2
  BOOST_CHECK_CLOSE(pSolver.robot()->mass(), 76.07, 1e-2);
1427
1428
2
  pSolver.solve();
1429


2
  BOOST_CHECK_EQUAL(pSolver.paths().size(), 2);
1430
  std::cout
1431
2
      << "Solve complete, start optimization. This may take few minutes ..."
1432
2
      << std::endl;
1433



2
  BOOST_CHECK(checkPathVector(pSolver.paths().back()));
1434



2
  BOOST_CHECK(checkPath(pSolver.paths().back(), 0.5));
1435
22
  for (size_t i = 0; i < 10; ++i) {
1436
20
    pSolver.optimizePath(pSolver.paths().back());
1437


20
    BOOST_CHECK_EQUAL(pSolver.paths().size(), 3 + i);
1438



20
    BOOST_CHECK(checkPathVector(pSolver.paths().back()));
1439



20
    BOOST_CHECK(checkPath(pSolver.paths().back(), 0.5));
1440


20
    std::cout << "(" << i + 1 << "/10)  " << std::flush;
1441
  }
1442
2
  std::cout << std::endl;
1443
2
}
1444
1445
/*
1446
// too slow to be added in the test suite ...
1447
BOOST_AUTO_TEST_CASE (nav_bauzil_hard) {
1448
    std::cout<<"start nav_bauzil_hard test case, this may take several minutes
1449
..."<<std::endl;
1450
  // this test case may take up to 5 minute to execute. Usually after ~10
1451
minutes it should be considered as a failure. hpp::pinocchio::RbPrmDevicePtr_t
1452
rbprmDevice = loadSimpleHumanoidAbsract();
1453
    rbprmDevice->rootJoint()->lowerBound(0, -2.3);
1454
    rbprmDevice->rootJoint()->lowerBound(1, -1.5);
1455
    rbprmDevice->rootJoint()->lowerBound(2, 0.98);
1456
    rbprmDevice->rootJoint()->upperBound(0,  4.6);
1457
    rbprmDevice->rootJoint()->upperBound(1,  3.3);
1458
    rbprmDevice->rootJoint()->upperBound(2,  0.98);
1459
    rbprmDevice->setDimensionExtraConfigSpace(6);
1460
    BindShooter bShooter;
1461
    std::vector<double> boundsSO3;
1462
    boundsSO3.push_back(-4);
1463
    boundsSO3.push_back(4);
1464
    boundsSO3.push_back(-0.1);
1465
    boundsSO3.push_back(0.1);
1466
    boundsSO3.push_back(-0.1);
1467
    boundsSO3.push_back(0.1);
1468
    bShooter.so3Bounds_ = boundsSO3;
1469
    hpp::core::ProblemSolverPtr_t  ps =
1470
configureRbprmProblemSolverForSupportLimbs(rbprmDevice, bShooter);
1471
    hpp::core::ProblemSolver& pSolver = *ps;
1472
    loadObstacleWithAffordance(pSolver, std::string("hpp_environments"),
1473
                               std::string("multicontact/floor_bauzil"),std::string("planning"));
1474
    // configure planner
1475
    pSolver.addPathOptimizer(std::string("RandomShortcutDynamic"));
1476
    pSolver.configurationShooterType(std::string("RbprmShooter"));
1477
    pSolver.pathValidationType(std::string("RbprmPathValidation"),0.05);
1478
    pSolver.distanceType(std::string("Kinodynamic"));
1479
    pSolver.steeringMethodType(std::string("RBPRMKinodynamic"));
1480
    pSolver.pathPlannerType(std::string("DynamicPlanner"));
1481
1482
    // set problem parameters :
1483
    double aMax = 0.1;
1484
    double vMax = 0.3;
1485
    pSolver.problem()->setParameter(std::string("Kinodynamic/velocityBound"),core::Parameter(vMax));
1486
    pSolver.problem()->setParameter(std::string("Kinodynamic/accelerationBound"),core::Parameter(aMax));
1487
    pSolver.problem()->setParameter(std::string("Kinodynamic/forceAllOrientation"),core::Parameter(true));
1488
    pSolver.problem()->setParameter(std::string("DynamicPlanner/sizeFootX"),core::Parameter(0.2));
1489
    pSolver.problem()->setParameter(std::string("DynamicPlanner/sizeFootY"),core::Parameter(0.12));
1490
    pSolver.problem()->setParameter(std::string("DynamicPlanner/friction"),core::Parameter(0.5));
1491
    pSolver.problem()->setParameter(std::string("ConfigurationShooter/sampleExtraDOF"),core::Parameter(false));
1492
    pSolver.problem()->setParameter(std::string("PathOptimization/RandomShortcut/NumberOfLoops"),core::Parameter((core::size_type)10));
1493
1494
1495
    for(size_type i = 0 ; i < 2 ; ++i){
1496
      rbprmDevice->extraConfigSpace().lower(i)=-vMax;
1497
      rbprmDevice->extraConfigSpace().upper(i)=vMax;
1498
    }
1499
    rbprmDevice->extraConfigSpace().lower(2)=0.;
1500
    rbprmDevice->extraConfigSpace().upper(2)=0.;
1501
    for(size_type i = 3 ; i < 5 ; ++i){
1502
      rbprmDevice->extraConfigSpace().lower(i)=-aMax;
1503
      rbprmDevice->extraConfigSpace().upper(i)=aMax;
1504
    }
1505
    rbprmDevice->extraConfigSpace().lower(5)=0.;
1506
    rbprmDevice->extraConfigSpace().upper(5)=0.;
1507
1508
    // define the planning problem :
1509
    core::Configuration_t q_init(rbprmDevice->configSize());
1510
    q_init << -0.7, 2., 0.98, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.07, 0, 0, 0.0,
1511
0.0, 0.0; core::Configuration_t q_goal(rbprmDevice->configSize()); q_goal << 0.,
1512
-1., 0.98, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.1, 0, 0, 0.0, 0.0, 0.0;
1513
1514
    pSolver.initConfig(ConfigurationPtr_t(new core::Configuration_t(q_init)));
1515
    pSolver.addGoalConfig(ConfigurationPtr_t(new
1516
core::Configuration_t(q_goal)));
1517
    BOOST_CHECK_CLOSE(pSolver.robot()->mass(),70.,1e-2);
1518
1519
    pSolver.solve();
1520
    BOOST_CHECK_EQUAL(pSolver.paths().size(),2);
1521
    std::cout<<"Solve complete, start optimization. This may take few minutes
1522
..."<<std::endl; BOOST_CHECK(checkPathVector(pSolver.paths().back()));
1523
    BOOST_CHECK(checkPath(pSolver.paths().back(),0.5));
1524
    for(size_t i = 0 ; i < 10 ; ++i){
1525
      pSolver.optimizePath(pSolver.paths().back());
1526
      BOOST_CHECK_EQUAL(pSolver.paths().size(),3+i);
1527
      BOOST_CHECK(checkPathVector(pSolver.paths().back()));
1528
      BOOST_CHECK(checkPath(pSolver.paths().back(),0.5));
1529
      std::cout<<"("<<i+1<<"/10)  "<<std::flush;
1530
    }
1531
    std::cout<<std::endl;
1532
}
1533
*/
1534
1535
BOOST_AUTO_TEST_SUITE_END()