paths.cpp
Go to the documentation of this file.
1 /*********************************************************************
2 * Copyright (c) 2017 - for information on the respective copyright
3 * owner see the NOTICE file and/or the repository
4 *
5 * https://github.com/hbanzhaf/steering_functions.git
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
16 * implied. See the License for the specific language governing
17 * permissions and limitations under the License.
18 
19 * This source code is derived from Continuous Curvature (CC) Steer.
20 * Copyright (c) 2016, Thierry Fraichard and Institut national de
21 * recherche en informatique et en automatique (Inria), licensed under
22 * the BSD license, cf. 3rd-party-licenses.txt file in the root
23 * directory of this source tree.
24 **********************************************************************/
25 
26 #include <cassert>
27 #include <cmath>
28 #include <iostream>
29 #include <limits>
30 
33 
34 using namespace std;
35 
36 namespace steering
37 {
38 
39 Path::Path(const Configuration &_start, const Configuration &_end, double _kappa, double _sigma, double _length)
40 {
41  start = _start;
42  end = _end;
43  kappa = _kappa;
44  sigma = _sigma;
45  length = _length;
46 }
47 
48 CC_Dubins_Path::CC_Dubins_Path(const Configuration &_start, const Configuration &_end, cc_dubins::path_type _type,
49  double _kappa, double _sigma, Configuration *_qi1, Configuration *_qi2,
50  Configuration *_qi3, Configuration *_qi4, HC_CC_Circle *_cstart, HC_CC_Circle *_cend,
51  HC_CC_Circle *_ci1, HC_CC_Circle *_ci2, double _length)
52  : Path(_start, _end, _kappa, _sigma, _length)
53 {
54  type = _type;
55  qi1 = _qi1;
56  qi2 = _qi2;
57  qi3 = _qi3;
58  qi4 = _qi4;
59  cstart = _cstart;
60  cend = _cend;
61  ci1 = _ci1;
62  ci2 = _ci2;
63 }
64 
66 {
67  delete qi1;
68  delete qi2;
69  delete qi3;
70  delete qi4;
71  delete cstart;
72  delete cend;
73  delete ci1;
74  delete ci2;
75 }
76 
77 void CC_Dubins_Path::print(bool eol) const
78 {
79  cout << "CC_Dubins_Path: type ";
80  switch (type)
81  {
82  case cc_dubins::E:
83  cout << "E";
84  break;
85  case cc_dubins::S:
86  cout << "S";
87  break;
88  case cc_dubins::T:
89  cout << "T";
90  break;
91  case cc_dubins::TT:
92  cout << "TT";
93  break;
94  // Dubins families:
95  case cc_dubins::TST:
96  cout << "TST";
97  break;
98  case cc_dubins::TTT:
99  cout << "TTT";
100  break;
101  // #####################
102  case cc_dubins::TTTT:
103  cout << "TTTT";
104  break;
105  default:
106  cout << "?";
107  break;
108  }
109  cout << ", length " << length << ", configurations ";
110  start.print(false);
111  cout << " -> ";
112  if (qi1)
113  {
114  qi1->print(false);
115  cout << " -> ";
116  }
117  if (qi2)
118  {
119  qi2->print(false);
120  cout << " -> ";
121  }
122  if (qi3)
123  {
124  qi3->print(false);
125  cout << " -> ";
126  }
127  if (qi4)
128  {
129  qi4->print(false);
130  cout << " -> ";
131  }
132  end.print(false);
133  if (eol)
134  {
135  cout << endl;
136  }
137 }
138 
140  double _kappa, double _sigma, Configuration *_qi1, Configuration *_qi2,
141  Configuration *_qi3, Configuration *_qi4, HC_CC_Circle *_cstart, HC_CC_Circle *_cend,
142  HC_CC_Circle *_ci1, HC_CC_Circle *_ci2, double _length)
143  : Path(_start, _end, _kappa, _sigma, _length)
144 {
145  type = _type;
146  qi1 = _qi1;
147  qi2 = _qi2;
148  qi3 = _qi3;
149  qi4 = _qi4;
150  cstart = _cstart;
151  cend = _cend;
152  ci1 = _ci1;
153  ci2 = _ci2;
154 }
155 
157 {
158  delete qi1;
159  delete qi2;
160  delete qi3;
161  delete qi4;
162  delete cstart;
163  delete ci1;
164  delete ci2;
165  delete cend;
166 }
167 
168 void HC_CC_RS_Path::print(bool eol) const
169 {
170  cout << "HC_CC_RS_Path: type ";
171  switch (type)
172  {
173  case hc_cc_rs::E:
174  cout << "E";
175  break;
176  case hc_cc_rs::S:
177  cout << "S";
178  break;
179  case hc_cc_rs::T:
180  cout << "T";
181  break;
182  case hc_cc_rs::TT:
183  cout << "TT";
184  break;
185  case hc_cc_rs::TcT:
186  cout << "TcT";
187  break;
188  // Reeds-Shepp families:
189  case hc_cc_rs::TcTcT:
190  cout << "TcTcT";
191  break;
192  case hc_cc_rs::TcTT:
193  cout << "TcTT";
194  break;
195  case hc_cc_rs::TTcT:
196  cout << "TTcT";
197  break;
198  case hc_cc_rs::TST:
199  cout << "TST";
200  break;
201  case hc_cc_rs::TSTcT:
202  cout << "TSTcT";
203  break;
204  case hc_cc_rs::TcTST:
205  cout << "TcTST";
206  break;
207  case hc_cc_rs::TcTSTcT:
208  cout << "TcTSTcT";
209  break;
210  case hc_cc_rs::TTcTT:
211  cout << "TTcTT";
212  break;
213  case hc_cc_rs::TcTTcT:
214  cout << "TcTTcT";
215  break;
216  // #####################
217  case hc_cc_rs::TTT:
218  cout << "TTT";
219  break;
220  case hc_cc_rs::TcST:
221  cout << "TcST";
222  break;
223  case hc_cc_rs::TScT:
224  cout << "TScT";
225  break;
226  case hc_cc_rs::TcScT:
227  cout << "TcScT";
228  break;
229  default:
230  cout << "?";
231  break;
232  }
233  cout << ", length " << length << ", configurations ";
234  start.print(false);
235  cout << " -> ";
236  if (qi1)
237  {
238  qi1->print(false);
239  cout << " -> ";
240  }
241  if (qi2)
242  {
243  qi2->print(false);
244  cout << " -> ";
245  }
246  if (qi3)
247  {
248  qi3->print(false);
249  cout << " -> ";
250  }
251  if (qi4)
252  {
253  qi4->print(false);
254  cout << " -> ";
255  }
256  end.print(false);
257  if (eol)
258  {
259  cout << endl;
260  }
261 }
262 
263 bool state_equal(const State &state1, const State &state2)
264 {
265  if (fabs(state2.kappa - state1.kappa) > get_epsilon())
266  return false;
267  if (fabs(twopify(state2.theta) - twopify(state1.theta)) > get_epsilon())
268  return false;
269  if (point_distance(state1.x, state1.y, state2.x, state2.y) > get_epsilon())
270  return false;
271  return true;
272 }
273 
274 void reverse_control(Control &control)
275 {
276  control.delta_s = -control.delta_s;
277  control.kappa = control.kappa + fabs(control.delta_s) * control.sigma;
278  control.sigma = -control.sigma;
279 }
280 
281 Control subtract_control(const Control &control1, const Control &control2)
282 {
283  assert(sgn(control1.delta_s) * control1.sigma == sgn(control2.delta_s) * control2.sigma);
284  Control control;
285  control.delta_s = control1.delta_s - control2.delta_s;
286  control.kappa = control1.kappa;
287  control.sigma = control1.sigma;
288  return control;
289 }
290 
291 void empty_controls(vector<Control> &controls)
292 {
293  Control control;
294  control.delta_s = 0.0;
295  control.kappa = 0.0;
296  control.sigma = 0.0;
297  controls.push_back(control);
298 }
299 
300 void straight_controls(const Configuration &q1, const Configuration &q2, vector<Control> &controls)
301 {
302  double length = point_distance(q1.x, q1.y, q2.x, q2.y);
303  double dot_product = cos(q1.theta) * (q2.x - q1.x) + sin(q1.theta) * (q2.y - q1.y);
304  int d = sgn(dot_product);
305  Control control;
306  control.delta_s = d * length;
307  control.kappa = 0.0;
308  control.sigma = 0.0;
309  controls.push_back(control);
310 }
311 
312 int direction(bool forward, bool order)
313 {
314  if ((forward && order) || (!forward && !order))
315  return 1;
316  else
317  return -1;
318 }
319 
320 void rs_turn_controls(const HC_CC_Circle &c, const Configuration &q, bool order, vector<Control> &controls)
321 {
322  assert(fabs(fabs(c.kappa) - fabs(q.kappa)) < get_epsilon() &&
323  fabs(fabs(c.sigma) - numeric_limits<double>::max()) < get_epsilon());
324  double delta = c.deflection(q);
325  double length_arc = fabs(c.kappa_inv) * c.rs_circular_deflection(delta);
326  int d = direction(c.forward, order);
327 
328  Control arc;
329  arc.delta_s = d * length_arc;
330  arc.kappa = c.kappa;
331  arc.sigma = 0.0;
332  controls.push_back(arc);
333  return;
334 }
335 
336 void hc_turn_controls(const HC_CC_Circle &c, const Configuration &q, bool order, vector<Control> &controls)
337 {
338  assert(fabs(fabs(c.kappa) - fabs(q.kappa)) < get_epsilon());
339  double delta = c.deflection(q);
340  double length_min = fabs(c.kappa / c.sigma);
341  double length_arc = fabs(c.kappa_inv) * c.hc_circular_deflection(delta);
342  int d = direction(c.forward, order);
343 
344  Control clothoid, arc;
345  if (order)
346  {
347  clothoid.delta_s = d * length_min;
348  clothoid.kappa = 0.0;
349  clothoid.sigma = c.sigma;
350  controls.push_back(clothoid);
351  }
352 
353  arc.delta_s = d * length_arc;
354  arc.kappa = c.kappa;
355  arc.sigma = 0.0;
356  controls.push_back(arc);
357 
358  if (!order)
359  {
360  clothoid.delta_s = d * length_min;
361  clothoid.kappa = c.kappa;
362  clothoid.sigma = -c.sigma;
363  controls.push_back(clothoid);
364  }
365  return;
366 }
367 
368 bool cc_elementary_controls(const HC_CC_Circle &c, const Configuration &q, double delta, bool order,
369  vector<Control> &controls)
370 {
371  double sigma0;
372  if (c.cc_elementary_sharpness(q, delta, sigma0))
373  {
374  double length = sqrt(delta / fabs(sigma0));
375  int d = direction(c.forward, order);
376 
377  Control clothoid1, clothoid2;
378  clothoid1.delta_s = d * length;
379  clothoid1.kappa = 0.0;
380  clothoid1.sigma = sigma0;
381  controls.push_back(clothoid1);
382 
383  clothoid2.delta_s = d * length;
384  clothoid2.kappa = sigma0 * length;
385  clothoid2.sigma = -sigma0;
386  controls.push_back(clothoid2);
387  return true;
388  }
389  return false;
390 }
391 
392 void cc_default_controls(const HC_CC_Circle &c, const Configuration &q, double delta, bool order,
393  vector<Control> &controls)
394 {
395  double length_min = fabs(c.kappa / c.sigma);
396  double length_arc = fabs(c.kappa_inv) * c.cc_circular_deflection(delta);
397  int d = direction(c.forward, order);
398 
399  Control clothoid1, arc, clothoid2;
400  clothoid1.delta_s = d * length_min;
401  clothoid1.kappa = 0.0;
402  clothoid1.sigma = c.sigma;
403  controls.push_back(clothoid1);
404 
405  arc.delta_s = d * length_arc;
406  arc.kappa = c.kappa;
407  arc.sigma = 0.0;
408  controls.push_back(arc);
409 
410  clothoid2.delta_s = d * length_min;
411  clothoid2.kappa = c.kappa;
412  clothoid2.sigma = -c.sigma;
413  controls.push_back(clothoid2);
414  return;
415 }
416 
417 void cc_turn_controls(const HC_CC_Circle &c, const Configuration &q, bool order, vector<Control> &controls)
418 {
419  assert(fabs(q.kappa) < get_epsilon());
420  double delta = c.deflection(q);
421  // delta = 0
422  if (delta < get_epsilon())
423  {
424  if (order)
425  straight_controls(c.start, q, controls);
426  else
427  straight_controls(q, c.start, controls);
428  return;
429  }
430  // 0 < delta < 2 * delta_min
431  else if (delta < 2 * c.delta_min)
432  {
433  vector<Control> controls_elementary, controls_default;
434  if (cc_elementary_controls(c, q, delta, order, controls_elementary))
435  {
436  cc_default_controls(c, q, delta, order, controls_default);
437  double length_elementary =
438  accumulate(controls_elementary.begin(), controls_elementary.end(), 0.0,
439  [](double sum, const Control &control) { return sum + fabs(control.delta_s); });
440  double length_default =
441  accumulate(controls_default.begin(), controls_default.end(), 0.0,
442  [](double sum, const Control &control) { return sum + fabs(control.delta_s); });
443  (length_elementary < length_default) ?
444  controls.insert(controls.end(), controls_elementary.begin(), controls_elementary.end()) :
445  controls.insert(controls.end(), controls_default.begin(), controls_default.end());
446  return;
447  }
448  else
449  {
450  cc_default_controls(c, q, delta, order, controls);
451  return;
452  }
453  }
454  // delta >= 2 * delta_min
455  else
456  {
457  cc_default_controls(c, q, delta, order, controls);
458  return;
459  }
460 }
461 
462 } // namespace steering
steering::cc_dubins::TST
@ TST
Definition: paths.hpp:88
steering::hc_cc_rs::TTcT
@ TTcT
Definition: paths.hpp:133
steering::rs_turn_controls
void rs_turn_controls(const HC_CC_Circle &c, const Configuration &q, bool order, std::vector< Control > &controls)
Appends controls with a rs-turn.
steering::Path::length
double length
Path length.
Definition: paths.hpp:98
steering::hc_cc_rs::TcScT
@ TcScT
Definition: paths.hpp:144
steering::cc_dubins::TT
@ TT
Definition: paths.hpp:86
steering::State
Description of a kinematic car's state.
Definition: steering_functions.hpp:44
steering::HC_CC_Circle::cc_elementary_sharpness
bool cc_elementary_sharpness(const Configuration &q, double delta, double &sigma0) const
Computation of an elementary path's sharpness.
Definition: hc_cc_circle.cpp:192
steering::point_distance
double point_distance(double x1, double y1, double x2, double y2)
Cartesian distance between two points.
Definition: utilities.cpp:67
steering::HC_CC_Circle::cc_circular_deflection
double cc_circular_deflection(double delta) const
Computation of a cc-turn's circular deflection.
Definition: hc_cc_circle.cpp:209
steering::HC_CC_RS_Path::type
hc_cc_rs::path_type type
Path type.
Definition: paths.hpp:164
steering::CC_Dubins_Path::cstart
HC_CC_Circle * cstart
Start, end and intermediate circles.
Definition: paths.hpp:117
steering::hc_cc_rs::TcTT
@ TcTT
Definition: paths.hpp:132
steering::Control::sigma
double sigma
Sharpness (derivative of curvature with respect to arc length) of a segment.
Definition: steering_functions.hpp:91
steering::hc_cc_rs::S
@ S
Definition: paths.hpp:126
steering::cc_dubins::path_type
path_type
Definition: paths.hpp:81
steering::State::theta
double theta
Orientation of the robot.
Definition: steering_functions.hpp:70
steering::HC_CC_RS_Path::cend
HC_CC_Circle * cend
Definition: paths.hpp:170
steering::empty_controls
void empty_controls(std::vector< Control > &controls)
Appends controls with 0 input.
steering::State::kappa
double kappa
Curvature at position (x,y)
Definition: steering_functions.hpp:73
steering::HC_CC_Circle_Param::delta_min
double delta_min
Minimal deflection.
Definition: hc_cc_circle.hpp:100
steering::CC_Dubins_Path::~CC_Dubins_Path
~CC_Dubins_Path()
Destructor.
Definition: paths.cpp:65
steering::hc_cc_rs::TcTTcT
@ TcTTcT
Definition: paths.hpp:139
steering::hc_cc_rs::TT
@ TT
Definition: paths.hpp:128
steering::HC_CC_Circle
Definition: hc_cc_circle.hpp:80
steering::Configuration::print
void print(bool eol) const
Alphanumeric display.
Definition: configuration.cpp:45
steering::State::y
double y
Position in y of the robot.
Definition: steering_functions.hpp:67
steering::hc_cc_rs::TScT
@ TScT
Definition: paths.hpp:143
steering::Control::kappa
double kappa
Curvature at the beginning of a segment.
Definition: steering_functions.hpp:88
steering::CC_Dubins_Path::print
void print(bool eol) const
Alphanumeric display.
Definition: paths.cpp:77
paths.hpp
steering::cc_dubins::S
@ S
Definition: paths.hpp:84
steering::Control
Description of a path segment with its corresponding control inputs.
Definition: steering_functions.hpp:82
steering::CC_Dubins_Path::qi3
Configuration * qi3
Definition: paths.hpp:114
steering::hc_cc_rs::TST
@ TST
Definition: paths.hpp:134
steering::HC_CC_Circle_Param::kappa_inv
double kappa_inv
Definition: hc_cc_circle.hpp:88
steering::cc_dubins::TTT
@ TTT
Definition: paths.hpp:89
steering::state_equal
bool state_equal(const State &state1, const State &state2)
Checks whether two states are equal.
Definition: paths.cpp:263
steering::HC_CC_RS_Path::HC_CC_RS_Path
HC_CC_RS_Path(const Configuration &_start, const Configuration &_end, hc_cc_rs::path_type _type, double _kappa, double _sigma, Configuration *_qi1, Configuration *_qi2, Configuration *_qi3, Configuration *_qi4, HC_CC_Circle *_cstart, HC_CC_Circle *_cend, HC_CC_Circle *_ci1, HC_CC_Circle *_ci2, double _length)
Constructor.
Definition: paths.cpp:139
steering::HC_CC_Circle::deflection
double deflection(const Configuration &q) const
Computation of deflection (angle between start configuration of circle and configuration q)
Definition: hc_cc_circle.cpp:116
steering::Configuration::kappa
double kappa
Curvature.
Definition: configuration.hpp:94
steering::HC_CC_Circle::rs_circular_deflection
double rs_circular_deflection(double delta) const
Computation of a rs-turn's circular deflection.
Definition: hc_cc_circle.cpp:138
steering::hc_cc_rs::TcTcT
@ TcTcT
Definition: paths.hpp:131
steering::cc_dubins::E
@ E
Definition: paths.hpp:83
steering::HC_CC_Circle::forward
bool forward
Driving direction: forwards/backwards.
Definition: hc_cc_circle.hpp:126
steering::hc_turn_controls
void hc_turn_controls(const HC_CC_Circle &c, const Configuration &q, bool order, std::vector< Control > &controls)
Appends controls with a hc-turn.
steering::reverse_control
void reverse_control(Control &control)
Reverses a control.
Definition: paths.cpp:274
steering::HC_CC_RS_Path::qi1
Configuration * qi1
Intermediate configurations.
Definition: paths.hpp:167
steering::direction
int direction(bool forward, bool order)
Definition: paths.cpp:312
steering::HC_CC_Circle_Param::sigma
double sigma
Definition: hc_cc_circle.hpp:88
steering::State::x
double x
Position in x of the robot.
Definition: steering_functions.hpp:64
steering::hc_cc_rs::TTcTT
@ TTcTT
Definition: paths.hpp:138
steering::Path
Definition: paths.hpp:62
steering::HC_CC_RS_Path::ci1
HC_CC_Circle * ci1
Definition: paths.hpp:170
steering::CC_Dubins_Path::ci1
HC_CC_Circle * ci1
Definition: paths.hpp:117
steering::straight_controls
void straight_controls(const Configuration &q1, const Configuration &q2, std::vector< Control > &controls)
Appends controls with a straight line.
steering::hc_cc_rs::TcTSTcT
@ TcTSTcT
Definition: paths.hpp:137
steering::cc_default_controls
void cc_default_controls(const HC_CC_Circle &c, const Configuration &q, double delta, bool order, std::vector< Control > &controls)
Appends controls with a default cc-turn consisting of two clothoids and a circular arc.
steering::Control::delta_s
double delta_s
Signed arc length of a segment.
Definition: steering_functions.hpp:85
steering::HC_CC_Circle::hc_circular_deflection
double hc_circular_deflection(double delta) const
Computation of a hc-turn's circular deflection.
Definition: hc_cc_circle.cpp:156
steering::cc_elementary_controls
bool cc_elementary_controls(const HC_CC_Circle &c, const Configuration &q, double delta, bool order, std::vector< Control > &controls)
Appends controls with an elementary path if one exists.
steering::Configuration
Definition: configuration.hpp:55
start
ROSCPP_DECL void start()
steering::HC_CC_RS_Path::qi3
Configuration * qi3
Definition: paths.hpp:167
steering::HC_CC_RS_Path::ci2
HC_CC_Circle * ci2
Definition: paths.hpp:170
steering::get_epsilon
double get_epsilon()
Return value of epsilon.
Definition: utilities.cpp:57
plot_states.d
d
Definition: plot_states.py:107
steering::HC_CC_RS_Path::~HC_CC_RS_Path
~HC_CC_RS_Path()
Destructor.
Definition: paths.cpp:156
std
steering::HC_CC_Circle_Param::kappa
double kappa
Max. curvature, inverse of max. curvature, max. sharpness.
Definition: hc_cc_circle.hpp:88
length
TFSIMD_FORCE_INLINE tfScalar length(const Quaternion &q)
plot_states.kappa
kappa
Definition: plot_states.py:106
steering::CC_Dubins_Path::qi1
Configuration * qi1
Intermediate configurations.
Definition: paths.hpp:114
steering::hc_cc_rs::TcT
@ TcT
Definition: paths.hpp:129
steering::hc_cc_rs::TcTST
@ TcTST
Definition: paths.hpp:136
steering::hc_cc_rs::TTT
@ TTT
Definition: paths.hpp:141
steering::hc_cc_rs::E
@ E
Definition: paths.hpp:125
steering::CC_Dubins_Path::qi2
Configuration * qi2
Definition: paths.hpp:114
steering
Definition: dubins_state_space.hpp:70
steering::HC_CC_RS_Path::cstart
HC_CC_Circle * cstart
Start, end and intermediate circles.
Definition: paths.hpp:170
steering::cc_turn_controls
void cc_turn_controls(const HC_CC_Circle &c, const Configuration &q, bool order, std::vector< Control > &controls)
Appends controls with a cc-turn.
steering::HC_CC_RS_Path::qi4
Configuration * qi4
Definition: paths.hpp:167
steering::cc_dubins::TTTT
@ TTTT
Definition: paths.hpp:91
steering::hc_cc_rs::path_type
path_type
Definition: paths.hpp:123
steering::sgn
double sgn(double x)
Return sign of a number.
Definition: utilities.cpp:62
steering::CC_Dubins_Path::type
cc_dubins::path_type type
Path type.
Definition: paths.hpp:111
steering::CC_Dubins_Path::cend
HC_CC_Circle * cend
Definition: paths.hpp:117
steering::HC_CC_RS_Path::print
void print(bool eol) const
Alphanumeric display.
Definition: paths.cpp:168
steering::CC_Dubins_Path::ci2
HC_CC_Circle * ci2
Definition: paths.hpp:117
steering::Configuration::y
double y
Definition: configuration.hpp:88
steering::subtract_control
Control subtract_control(const Control &control1, const Control &control2)
Subtracts control2 from control1.
Definition: paths.cpp:281
steering::hc_cc_rs::TcST
@ TcST
Definition: paths.hpp:142
steering::twopify
double twopify(double alpha)
Conversion of arbitrary angle given in [rad] to [0, 2*pi[.
Definition: utilities.cpp:78
steering::cc_dubins::T
@ T
Definition: paths.hpp:85
steering::Path::start
Configuration start
Start and end configuration.
Definition: paths.hpp:92
steering::Path::end
Configuration end
Definition: paths.hpp:92
steering::CC_Dubins_Path::qi4
Configuration * qi4
Definition: paths.hpp:114
steering::HC_CC_Circle::start
Configuration start
Start configuration.
Definition: hc_cc_circle.hpp:120
steering::Configuration::x
double x
Position.
Definition: configuration.hpp:88
utilities.hpp
steering::hc_cc_rs::T
@ T
Definition: paths.hpp:127
steering::Configuration::theta
double theta
Orientation in rad between [0, 2*pi[.
Definition: configuration.hpp:91
steering::HC_CC_RS_Path::qi2
Configuration * qi2
Definition: paths.hpp:167
steering::hc_cc_rs::TSTcT
@ TSTcT
Definition: paths.hpp:135


steering_functions
Author(s): Holger Banzhaf
autogenerated on Mon Dec 11 2023 03:27:43