dubins_state_space.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 the Open Motion Planning Library
20 * (OMPL) V 1.3.1 (https://github.com/ompl/ompl).
21 * Copyright (c) 2010, Rice University, licensed under the BSD license,
22 * cf. 3rd-party-licenses.txt file in the root directory of this source
23 * tree.
24 **********************************************************************/
25 
26 /*********************************************************************
27 * Software License Agreement (BSD License)
28 *
29 * Copyright (c) 2010, Rice University
30 * All rights reserved.
31 *
32 * Redistribution and use in source and binary forms, with or without
33 * modification, are permitted provided that the following conditions
34 * are met:
35 *
36 * * Redistributions of source code must retain the above copyright
37 * notice, this list of conditions and the following disclaimer.
38 * * Redistributions in binary form must reproduce the above
39 * copyright notice, this list of conditions and the following
40 * disclaimer in the documentation and/or other materials provided
41 * with the distribution.
42 * * Neither the name of the Rice University nor the names of its
43 * contributors may be used to endorse or promote products derived
44 * from this software without specific prior written permission.
45 *
46 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
47 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
48 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
49 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
50 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
51 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
52 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
53 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
54 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
55 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
56 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
57 * POSSIBILITY OF SUCH DAMAGE.
58 *********************************************************************/
59 
60 #include <algorithm>
61 #include <cmath>
62 
65 
66 using namespace std;
67 
68 namespace steering
69 {
70 
71 namespace /* helper */
72 {
73 const double DUBINS_EPS = 1e-6;
74 const double DUBINS_ZERO = -1e-9;
75 
76 Dubins_State_Space::Dubins_Path dubinsLSL(double d, double alpha, double beta)
77 {
78  double ca = cos(alpha), sa = sin(alpha), cb = cos(beta), sb = sin(beta);
79  double tmp = 2. + d * d - 2. * (ca * cb + sa * sb - d * (sa - sb));
80  if (tmp >= DUBINS_ZERO)
81  {
82  double theta = atan2(cb - ca, d + sa - sb);
83  double t = twopify(-alpha + theta);
84  double p = sqrt(max(tmp, 0.));
85  double q = twopify(beta - theta);
86  assert(fabs(p * cos(alpha + t) - sa + sb - d) < DUBINS_EPS);
87  assert(fabs(p * sin(alpha + t) + ca - cb) < DUBINS_EPS);
88  assert(twopify(alpha + t + q - beta + .5 * DUBINS_EPS) < DUBINS_EPS);
89  return Dubins_State_Space::Dubins_Path(Dubins_State_Space::dubins_path_type[0], t, p, q);
90  }
91  return Dubins_State_Space::Dubins_Path();
92 }
93 
94 Dubins_State_Space::Dubins_Path dubinsRSR(double d, double alpha, double beta)
95 {
96  double ca = cos(alpha), sa = sin(alpha), cb = cos(beta), sb = sin(beta);
97  double tmp = 2. + d * d - 2. * (ca * cb + sa * sb - d * (sb - sa));
98  if (tmp >= DUBINS_ZERO)
99  {
100  double theta = atan2(ca - cb, d - sa + sb);
101  double t = twopify(alpha - theta);
102  double p = sqrt(max(tmp, 0.));
103  double q = twopify(-beta + theta);
104  assert(fabs(p * cos(alpha - t) + sa - sb - d) < DUBINS_EPS);
105  assert(fabs(p * sin(alpha - t) - ca + cb) < DUBINS_EPS);
106  assert(twopify(alpha - t - q - beta + .5 * DUBINS_EPS) < DUBINS_EPS);
107  return Dubins_State_Space::Dubins_Path(Dubins_State_Space::dubins_path_type[1], t, p, q);
108  }
109  return Dubins_State_Space::Dubins_Path();
110 }
111 
112 Dubins_State_Space::Dubins_Path dubinsRSL(double d, double alpha, double beta)
113 {
114  double ca = cos(alpha), sa = sin(alpha), cb = cos(beta), sb = sin(beta);
115  double tmp = d * d - 2. + 2. * (ca * cb + sa * sb - d * (sa + sb));
116  if (tmp >= DUBINS_ZERO)
117  {
118  double p = sqrt(max(tmp, 0.));
119  double theta = atan2(ca + cb, d - sa - sb) - atan2(2., p);
120  double t = twopify(alpha - theta);
121  double q = twopify(beta - theta);
122  assert(fabs(p * cos(alpha - t) - 2. * sin(alpha - t) + sa + sb - d) < DUBINS_EPS);
123  assert(fabs(p * sin(alpha - t) + 2. * cos(alpha - t) - ca - cb) < DUBINS_EPS);
124  assert(twopify(alpha - t + q - beta + .5 * DUBINS_EPS) < DUBINS_EPS);
125  return Dubins_State_Space::Dubins_Path(Dubins_State_Space::dubins_path_type[2], t, p, q);
126  }
127  return Dubins_State_Space::Dubins_Path();
128 }
129 
130 Dubins_State_Space::Dubins_Path dubinsLSR(double d, double alpha, double beta)
131 {
132  double ca = cos(alpha), sa = sin(alpha), cb = cos(beta), sb = sin(beta);
133  double tmp = -2. + d * d + 2. * (ca * cb + sa * sb + d * (sa + sb));
134  if (tmp >= DUBINS_ZERO)
135  {
136  double p = sqrt(max(tmp, 0.));
137  double theta = atan2(-ca - cb, d + sa + sb) - atan2(-2., p);
138  double t = twopify(-alpha + theta);
139  double q = twopify(-beta + theta);
140  assert(fabs(p * cos(alpha + t) + 2. * sin(alpha + t) - sa - sb - d) < DUBINS_EPS);
141  assert(fabs(p * sin(alpha + t) - 2. * cos(alpha + t) + ca + cb) < DUBINS_EPS);
142  assert(twopify(alpha + t - q - beta + .5 * DUBINS_EPS) < DUBINS_EPS);
143  return Dubins_State_Space::Dubins_Path(Dubins_State_Space::dubins_path_type[3], t, p, q);
144  }
145  return Dubins_State_Space::Dubins_Path();
146 }
147 
148 Dubins_State_Space::Dubins_Path dubinsRLR(double d, double alpha, double beta)
149 {
150  double ca = cos(alpha), sa = sin(alpha), cb = cos(beta), sb = sin(beta);
151  double tmp = .125 * (6. - d * d + 2. * (ca * cb + sa * sb + d * (sa - sb)));
152  if (fabs(tmp) < 1.)
153  {
154  double p = TWO_PI - acos(tmp);
155  double theta = atan2(ca - cb, d - sa + sb);
156  double t = twopify(alpha - theta + .5 * p);
157  double q = twopify(alpha - beta - t + p);
158  assert(fabs(2. * sin(alpha - t + p) - 2. * sin(alpha - t) - d + sa - sb) < DUBINS_EPS);
159  assert(fabs(-2. * cos(alpha - t + p) + 2. * cos(alpha - t) - ca + cb) < DUBINS_EPS);
160  assert(twopify(alpha - t + p - q - beta + .5 * DUBINS_EPS) < DUBINS_EPS);
161  return Dubins_State_Space::Dubins_Path(Dubins_State_Space::dubins_path_type[4], t, p, q);
162  }
163  return Dubins_State_Space::Dubins_Path();
164 }
165 
166 Dubins_State_Space::Dubins_Path dubinsLRL(double d, double alpha, double beta)
167 {
168  double ca = cos(alpha), sa = sin(alpha), cb = cos(beta), sb = sin(beta);
169  double tmp = .125 * (6. - d * d + 2. * (ca * cb + sa * sb - d * (sa - sb)));
170  if (fabs(tmp) < 1.)
171  {
172  double p = TWO_PI - acos(tmp);
173  double theta = atan2(-ca + cb, d + sa - sb);
174  double t = twopify(-alpha + theta + .5 * p);
175  double q = twopify(beta - alpha - t + p);
176  assert(fabs(-2. * sin(alpha + t - p) + 2. * sin(alpha + t) - d - sa + sb) < DUBINS_EPS);
177  assert(fabs(2. * cos(alpha + t - p) - 2. * cos(alpha + t) + ca - cb) < DUBINS_EPS);
178  assert(twopify(alpha + t - p + q - beta + .5 * DUBINS_EPS) < DUBINS_EPS);
179  return Dubins_State_Space::Dubins_Path(Dubins_State_Space::dubins_path_type[5], t, p, q);
180  }
181  return Dubins_State_Space::Dubins_Path();
182 }
183 
184 Dubins_State_Space::Dubins_Path dubins(double d, double alpha, double beta)
185 {
186  if (d < DUBINS_EPS && fabs(alpha - beta) < DUBINS_EPS)
187  return Dubins_State_Space::Dubins_Path(Dubins_State_Space::dubins_path_type[0], 0, d, 0);
188 
189  Dubins_State_Space::Dubins_Path path(dubinsLSL(d, alpha, beta)), tmp(dubinsRSR(d, alpha, beta));
190  double len, minLength = path.length();
191 
192  if ((len = tmp.length()) < minLength)
193  {
194  minLength = len;
195  path = tmp;
196  }
197  tmp = dubinsRSL(d, alpha, beta);
198  if ((len = tmp.length()) < minLength)
199  {
200  minLength = len;
201  path = tmp;
202  }
203  tmp = dubinsLSR(d, alpha, beta);
204  if ((len = tmp.length()) < minLength)
205  {
206  minLength = len;
207  path = tmp;
208  }
209  tmp = dubinsRLR(d, alpha, beta);
210  if ((len = tmp.length()) < minLength)
211  {
212  minLength = len;
213  path = tmp;
214  }
215  tmp = dubinsLRL(d, alpha, beta);
216  if ((tmp.length()) < minLength)
217  path = tmp;
218  return path;
219 }
220 } // namespace helper
221 
222 const Dubins_State_Space::Dubins_Path_Segment_Type Dubins_State_Space::dubins_path_type[6][3] = {
223  { DUBINS_LEFT, DUBINS_STRAIGHT, DUBINS_LEFT }, { DUBINS_RIGHT, DUBINS_STRAIGHT, DUBINS_RIGHT },
224  { DUBINS_RIGHT, DUBINS_STRAIGHT, DUBINS_LEFT }, { DUBINS_LEFT, DUBINS_STRAIGHT, DUBINS_RIGHT },
225  { DUBINS_RIGHT, DUBINS_LEFT, DUBINS_RIGHT }, { DUBINS_LEFT, DUBINS_RIGHT, DUBINS_LEFT }
226 };
227 
228 Dubins_State_Space::Dubins_Path Dubins_State_Space::dubins(const State &state1, const State &state2) const
229 {
230  double dx = state2.x - state1.x, dy = state2.y - state1.y, th = atan2(dy, dx), d = sqrt(dx * dx + dy * dy) * kappa_;
231  double alpha = twopify(state1.theta - th), beta = twopify(state2.theta - th);
232  return steering::dubins(d, alpha, beta);
233 }
234 
235 void Dubins_State_Space::set_filter_parameters(const Motion_Noise &motion_noise,
236  const Measurement_Noise &measurement_noise, const Controller &controller)
237 {
238  ekf_.set_parameters(motion_noise, measurement_noise, controller);
239 }
240 
241 double Dubins_State_Space::get_distance(const State &state1, const State &state2) const
242 {
243  if (forwards_)
244  return kappa_inv_ * this->dubins(state1, state2).length();
245  else
246  return kappa_inv_ * this->dubins(state2, state1).length();
247 }
248 
249 vector<Control> Dubins_State_Space::get_controls(const State &state1, const State &state2) const
250 {
251  vector<Control> dubins_controls;
252  dubins_controls.reserve(3);
254  if (forwards_)
255  path = this->dubins(state1, state2);
256  else
257  path = this->dubins(state2, state1);
258  for (unsigned int i = 0; i < 3; ++i)
259  {
260  Control control;
261  switch (path.type_[i])
262  {
263  case DUBINS_LEFT:
264  control.delta_s = kappa_inv_ * path.length_[i];
265  control.kappa = kappa_;
266  control.sigma = 0.0;
267  break;
268  case DUBINS_STRAIGHT:
269  control.delta_s = kappa_inv_ * path.length_[i];
270  control.kappa = 0.0;
271  control.sigma = 0.0;
272  break;
273  case DUBINS_RIGHT:
274  control.delta_s = kappa_inv_ * path.length_[i];
275  control.kappa = -kappa_;
276  control.sigma = 0.0;
277  break;
278  }
279  dubins_controls.push_back(control);
280  }
281  // reverse controls
282  if (!forwards_)
283  {
284  reverse(dubins_controls.begin(), dubins_controls.end());
285  for (auto &control : dubins_controls)
286  control.delta_s = -control.delta_s;
287  }
288  return dubins_controls;
289 }
290 
291 vector<State> Dubins_State_Space::get_path(const State &state1, const State &state2) const
292 {
293  vector<Control> dubins_controls = get_controls(state1, state2);
294  return integrate(state1, dubins_controls);
295 }
296 
297 vector<State_With_Covariance> Dubins_State_Space::get_path_with_covariance(const State_With_Covariance &state1,
298  const State &state2) const
299 {
300  vector<Control> controls = get_controls(state1.state, state2);
301  return integrate_with_covariance(state1, controls);
302 }
303 
304 vector<State> Dubins_State_Space::integrate(const State &state, const vector<Control> &controls) const
305 {
306  vector<State> path;
307  State state_curr, state_next;
308  // reserve capacity of path
309  int n_states(0);
310  for (const auto &control : controls)
311  {
312  double abs_delta_s(fabs(control.delta_s));
313  n_states += ceil(abs_delta_s / discretization_);
314  }
315  path.reserve(n_states + 3);
316  // get first state
317  state_curr.x = state.x;
318  state_curr.y = state.y;
319  state_curr.theta = state.theta;
320 
321  for (const auto &control : controls)
322  {
323  double delta_s(control.delta_s);
324  double abs_delta_s(fabs(delta_s));
325  double s_seg(0.0);
326  double integration_step(0.0);
327  // push_back current state
328  state_curr.kappa = control.kappa;
329  state_curr.d = sgn(delta_s);
330  path.push_back(state_curr);
331 
332  for (int i = 0, n = ceil(abs_delta_s / discretization_); i < n; ++i)
333  {
334  // get integration step
335  s_seg += discretization_;
336  if (s_seg > abs_delta_s)
337  {
338  integration_step = discretization_ - (s_seg - abs_delta_s);
339  s_seg = abs_delta_s;
340  }
341  else
342  {
343  integration_step = discretization_;
344  }
345  state_next = integrate_ODE(state_curr, control, integration_step);
346  path.push_back(state_next);
347  state_curr = state_next;
348  }
349  }
350  return path;
351 }
352 
353 vector<State_With_Covariance> Dubins_State_Space::integrate_with_covariance(const State_With_Covariance &state,
354  const vector<Control> &controls) const
355 {
356  vector<State_With_Covariance> path_with_covariance;
357  State_With_Covariance state_curr, state_pred, state_next;
358  // reserve capacity of path
359  int n_states(0);
360  for (const auto &control : controls)
361  {
362  double abs_delta_s(fabs(control.delta_s));
363  n_states += ceil(abs_delta_s / discretization_);
364  }
365  path_with_covariance.reserve(n_states + 3);
366  // get first state
367  state_curr.state.x = state.state.x;
368  state_curr.state.y = state.state.y;
369  state_curr.state.theta = state.state.theta;
370  for (int i = 0; i < 16; i++)
371  {
372  state_curr.Sigma[i] = state.Sigma[i];
373  state_curr.Lambda[i] = state.Lambda[i];
374  state_curr.covariance[i] = state.covariance[i];
375  }
376 
377  for (const auto &control : controls)
378  {
379  double delta_s(control.delta_s);
380  double abs_delta_s(fabs(delta_s));
381  double s_seg(0.0);
382  double integration_step(0.0);
383  // push_back current state
384  state_curr.state.kappa = control.kappa;
385  state_curr.state.d = sgn(delta_s);
386  path_with_covariance.push_back(state_curr);
387 
388  for (int i = 0, n = ceil(abs_delta_s / discretization_); i < n; ++i)
389  {
390  // get integration step
391  s_seg += discretization_;
392  if (s_seg > abs_delta_s)
393  {
394  integration_step = discretization_ - (s_seg - abs_delta_s);
395  s_seg = abs_delta_s;
396  }
397  else
398  {
399  integration_step = discretization_;
400  }
401  // predict
402  state_pred.state = integrate_ODE(state_curr.state, control, integration_step);
403  ekf_.predict(state_curr, control, integration_step, state_pred);
404  // update
405  state_next.state = state_pred.state;
406  ekf_.update(state_pred, state_next);
407 
408  path_with_covariance.push_back(state_next);
409  state_curr.state = state_next.state;
410  for (int i = 0; i < 16; i++)
411  {
412  state_curr.Sigma[i] = state_next.Sigma[i];
413  state_curr.Lambda[i] = state_next.Lambda[i];
414  state_curr.covariance[i] = state_next.covariance[i];
415  }
416  }
417  }
418  return path_with_covariance;
419 }
420 
421 State Dubins_State_Space::interpolate(const State &state, const vector<Control> &controls, double t) const
422 {
423  State state_curr, state_next;
424  // get first state
425  state_curr.x = state.x;
426  state_curr.y = state.y;
427  state_curr.theta = state.theta;
428  // get arc length at t
429  double s_path(0.0);
430  double s_inter(0.0);
431  for (const auto &control : controls)
432  {
433  s_path += fabs(control.delta_s);
434  }
435  if (t <= 0.0)
436  return state_curr;
437  else if (t > 1.0)
438  s_inter = s_path;
439  else
440  s_inter = t * s_path;
441 
442  double s(0.0);
443  bool interpolated = false;
444  for (const auto &control : controls)
445  {
446  if (interpolated)
447  break;
448 
449  double delta_s(control.delta_s);
450  double abs_delta_s(fabs(delta_s));
451  double s_seg(0.0);
452  double integration_step(0.0);
453  // update current state
454  state_curr.kappa = control.kappa;
455  state_curr.d = sgn(delta_s);
456 
457  s += abs_delta_s;
458  if (s > s_inter)
459  {
460  abs_delta_s = abs_delta_s - (s - s_inter);
461  interpolated = true;
462  }
463 
464  for (int i = 0, n = ceil(abs_delta_s / discretization_); i < n; ++i)
465  {
466  // get integration step
467  s_seg += discretization_;
468  if (s_seg > abs_delta_s)
469  {
470  integration_step = discretization_ - (s_seg - abs_delta_s);
471  s_seg = abs_delta_s;
472  }
473  else
474  {
475  integration_step = discretization_;
476  }
477  state_next = integrate_ODE(state_curr, control, integration_step);
478  state_curr = state_next;
479  }
480  }
481  return state_curr;
482 }
483 
484 inline State Dubins_State_Space::integrate_ODE(const State &state, const Control &control,
485  double integration_step) const
486 {
487  State state_next;
488  double d(sgn(control.delta_s));
489  if (fabs(state.kappa) > get_epsilon())
490  {
491  end_of_circular_arc(state.x, state.y, state.theta, state.kappa, d, integration_step, &state_next.x, &state_next.y,
492  &state_next.theta);
493  state_next.kappa = state.kappa;
494  state_next.d = d;
495  }
496  else
497  {
498  end_of_straight_line(state.x, state.y, state.theta, d, integration_step, &state_next.x, &state_next.y);
499  state_next.theta = state.theta;
500  state_next.kappa = state.kappa;
501  state_next.d = d;
502  }
503  return state_next;
504 }
505 
506 } // namespace steering
steering::State_With_Covariance::state
State state
Expected state of the robot.
Definition: steering_functions.hpp:66
steering::State_With_Covariance::covariance
double covariance[16]
Covariance of the state given by Sigma + Lambda: (x_x x_y x_theta x_kappa y_x y_y y_theta y_kappa the...
Definition: steering_functions.hpp:78
plot_states.alpha
alpha
Definition: plot_states.py:107
steering::State
Description of a kinematic car's state.
Definition: steering_functions.hpp:44
plot_states.path
path
Definition: plot_states.py:88
steering::Control::sigma
double sigma
Sharpness (derivative of curvature with respect to arc length) of a segment.
Definition: steering_functions.hpp:91
s
XmlRpcServer s
TWO_PI
#define TWO_PI
Definition: utilities.hpp:33
integrate_ODE
State integrate_ODE(const State &state, const Control &control, double integration_step)
Definition: jacobian_test.cpp:64
steering::State::theta
double theta
Orientation of the robot.
Definition: steering_functions.hpp:70
steering::State_With_Covariance::Sigma
double Sigma[16]
Covariance of the state estimation due to motion and measurement noise.
Definition: steering_functions.hpp:69
get_path_with_covariance
vector< Statistic > get_path_with_covariance(const string &id, const vector< State_With_Covariance > &starts, const vector< State > &goals)
Definition: timing_test.cpp:366
steering::State::kappa
double kappa
Curvature at position (x,y)
Definition: steering_functions.hpp:73
steering::end_of_straight_line
void end_of_straight_line(double x_i, double y_i, double theta, double direction, double length, double *x_f, double *y_f)
Computation of the end point on a straight line x_i, y_i: initial configuration theta: angle of strai...
Definition: utilities.cpp:216
steering::State::y
double y
Position in y of the robot.
Definition: steering_functions.hpp:67
steering::Control::kappa
double kappa
Curvature at the beginning of a segment.
Definition: steering_functions.hpp:88
steering::Control
Description of a path segment with its corresponding control inputs.
Definition: steering_functions.hpp:82
steering::Dubins_State_Space::Dubins_Path
Complete description of a Dubins path.
Definition: dubins_state_space.hpp:211
get_distance
double get_distance(const State &state1, const State &state2)
Definition: hc_cc_circle_test.cpp:98
steering::Motion_Noise
Parameters of the motion noise model according to the book: Probabilistic Robotics,...
Definition: steering_functions.hpp:96
steering::end_of_circular_arc
void end_of_circular_arc(double x_i, double y_i, double theta_i, double kappa, double direction, double length, double *x_f, double *y_f, double *theta_f)
Computation of the end point on a circular arc x_i, y_i, theta_i: initial configuration kappa: curvat...
Definition: utilities.cpp:208
steering::State::x
double x
Position in x of the robot.
Definition: steering_functions.hpp:64
get_path
vector< Statistic > get_path(const string &id, const vector< State > &starts, const vector< State > &goals)
Definition: timing_test.cpp:271
steering::Control::delta_s
double delta_s
Signed arc length of a segment.
Definition: steering_functions.hpp:85
steering::State_With_Covariance::Lambda
double Lambda[16]
Covariance of the state estimate due to the absence of measurements.
Definition: steering_functions.hpp:72
get_controls
vector< Statistic > get_controls(const string &id, const vector< State > &starts, const vector< State > &goals)
Definition: timing_test.cpp:146
steering::get_epsilon
double get_epsilon()
Return value of epsilon.
Definition: utilities.cpp:57
plot_states.d
d
Definition: plot_states.py:107
std
steering::State_With_Covariance
Description of a kinematic car's state with covariance.
Definition: steering_functions.hpp:63
steering::Controller
Parameters of the feedback controller.
Definition: steering_functions.hpp:121
steering
Definition: dubins_state_space.hpp:70
steering::sgn
double sgn(double x)
Return sign of a number.
Definition: utilities.cpp:62
steering::State::d
double d
Definition: steering_functions.hpp:76
dubins_state_space.hpp
steering::twopify
double twopify(double alpha)
Conversion of arbitrary angle given in [rad] to [0, 2*pi[.
Definition: utilities.cpp:78
t
geometry_msgs::TransformStamped t
utilities.hpp
steering::Measurement_Noise
Parameters of the measurement noise.
Definition: steering_functions.hpp:108


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