2 This file is part of I am car.
4 I am car is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
9 I am car is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with I am car. If not, see <http://www.gnu.org/licenses/>.
20 #include "reeds_shepp.h"
28 #define ST2WHEELBASE 2.450
29 #define ST2TURNINGRADI 10.82
30 #define ST2MAXSTEERING atan(ST2WHEELBASE / ST2TURNINGRADI)
37 std::vector<RRTNode *> st1(RRTNode *init, RRTNode *goal)
43 std::vector<RRTNode *> nodes;
45 for (i = 1; i < ST1COUNT + 1; i++) {
46 angl = atan2(goal->y() - init->y(), goal->x() - init->x());
47 new_x = init->x() + i * ST1STEP * cos(angl);
48 new_y = init->y() + i * ST1STEP * sin(angl);
50 nodes.push_back(new RRTNode(new_x, new_y, new_h));
55 std::vector<RRTNode *> st2(RRTNode *init, RRTNode *goal)
59 float steer; // steering angle
65 std::vector<RRTNode *> nodes;
67 for (i = 1; i < ST2COUNT + 1; i++) {
69 angl = atan2(goal->y() - init->y(), goal->x() - init->x());
70 steer = angl - init->h(); // steering angle
71 co = cos(angl - init->h());
72 si = sin(angl - init->h());
81 if (steer > ST2MAXSTEERING)
82 steer = ST2MAXSTEERING;
83 if (steer < -ST2MAXSTEERING)
84 steer = -ST2MAXSTEERING;
85 new_h = init->h() + (speed / ST2WHEELBASE) * tan(steer);
86 new_x = init->x() + speed * cos(new_h);
87 new_y = init->y() + speed * sin(new_h);
88 nodes.push_back(new RRTNode(new_x, new_y, new_h));
93 int cb_st3(double q[3], void *user_data)
95 std::vector<RRTNode *> *nodes = (std::vector<RRTNode *> *) user_data;
96 nodes->push_back(new RRTNode(q[0], q[1], q[2]));
100 std::vector<RRTNode *> st3(RRTNode *init, RRTNode *goal)
102 std::vector<RRTNode *> nodes;
103 double q0[] = {init->x(), init->y(), init->h()};
104 double q1[] = {goal->x(), goal->y(), goal->h()};
105 ReedsSheppStateSpace rsss(10.82); // TODO const param
106 rsss.sample(q0, q1, 1, cb_st3, &nodes); // TODO const
110 std::vector<RRTNode *> st4(RRTNode *init, RRTNode *goal)
112 std::vector<RRTNode *> nodes;
113 BicycleCar bc(init->x(), init->y(), init->h());
115 float angl = atan2(goal->y() - init->y(), goal->x() - init->x());
116 float co = cos(angl - init->h());
117 //float si = sin(angl - init->h());
119 float speed = 1; // desired
120 float gx = goal->x();
121 float gy = goal->y();
126 float rx = 0; // recomputed goal x
127 float ry = 0; // recomputed goal y
130 for (i = 0; i < ST4COUNT; i++) {
132 cerr = speed - bc.speed();
133 bc.speed(ST4KP * cerr + ST4KI * lerr);
136 rx = (gx - bc.x()) * cos(-bc.h()) -
137 (gy - bc.y()) * sin(-bc.h());
138 ry = (gx - bc.x()) * sin(-bc.h()) -
139 (gy - bc.y()) * cos(-bc.h());
141 r = pow(rx, 2) + pow(ry, 2) / (2 * ry);
146 nodes.push_back(new RRTNode(bc.x(), bc.y(), bc.h()));