Skip to content

Commit b59987e

Browse files
committed
add trajectory optimizer
1 parent 2090361 commit b59987e

File tree

1 file changed

+100
-3
lines changed

1 file changed

+100
-3
lines changed

PathPlanning/LatticePlanner/model_predictive_trajectory_generator.py

Lines changed: 100 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,15 @@ def generate_trajectory(s, km, kf, k0):
3838
# plt.show()
3939

4040
state = State()
41-
x, y = [state.x], [state.y]
41+
x, y, yaw = [state.x], [state.y], [state.yaw]
4242

4343
for ikp in kp:
4444
state = update(state, v, ikp, dt, L)
4545
x.append(state.x)
4646
y.append(state.y)
47+
yaw.append(state.yaw)
4748

48-
return x, y
49+
return x, y, yaw
4950

5051

5152
def update(state, v, delta, dt, L):
@@ -69,6 +70,101 @@ def pi_2_pi(angle):
6970
return angle
7071

7172

73+
def plot_arrow(x, y, yaw, length=1.0, width=0.5, fc="r", ec="k"):
74+
u"""
75+
Plot arrow
76+
"""
77+
plt.arrow(x, y, length * math.cos(yaw), length * math.sin(yaw),
78+
fc=fc, ec=ec, head_width=width, head_length=width)
79+
plt.plot(x, y)
80+
plt.plot(0, 0)
81+
82+
83+
def calc_diff(target, x, y, yaw):
84+
d = np.array([x[-1] - target.x, y[-1] - target.y, yaw[-1] - target.yaw])
85+
return d
86+
87+
88+
def calc_J(target, p, h, k0):
89+
xp, yp, yawp = generate_trajectory(p[0, 0] + h[0, 0], p[1, 0], p[2, 0], k0)
90+
dp = calc_diff(target, xp, yp, yawp)
91+
d1 = np.matrix(dp / h[0, 0]).T
92+
93+
xp, yp, yawp = generate_trajectory(p[0, 0], p[1, 0] + h[1, 0], p[2, 0], k0)
94+
dp = calc_diff(target, xp, yp, yawp)
95+
# xn, yn, yawn = generate_trajectory(p[0, 0], p[1, 0] - h[1, 0], p[2, 0], k0)
96+
# dn = calc_diff(target, xn, yn, yawn)
97+
# d2 = np.matrix((dp - dn) / 2.0 * h[1, 0]).T
98+
d2 = np.matrix(dp / h[1, 0]).T
99+
100+
xp, yp, yawp = generate_trajectory(p[0, 0], p[1, 0], p[2, 0] + h[2, 0], k0)
101+
dp = calc_diff(target, xp, yp, yawp)
102+
# xn, yn, yawn = generate_trajectory(p[0, 0], p[1, 0], p[2, 0] - h[2, 0], k0)
103+
# dn = calc_diff(target, xn, yn, yawn)
104+
# d3 = np.matrix((dp - dn) / 2.0 * h[2, 0]).T
105+
d3 = np.matrix(dp / h[2, 0]).T
106+
# print(d1, d2, d3)
107+
108+
J = np.hstack((d1, d2, d3))
109+
# print(J)
110+
111+
return J
112+
113+
114+
def optimize_trajectory(target, k0):
115+
116+
p = np.matrix([5.0, 0.0, 0.0]).T
117+
h = np.matrix([0.1, 0.003, 0.003]).T
118+
119+
for i in range(1000):
120+
xc, yc, yawc = generate_trajectory(p[0], p[1], p[2], k0)
121+
dc = np.matrix(calc_diff(target, xc, yc, yawc)).T
122+
123+
if np.linalg.norm(dc) <= 0.1:
124+
break
125+
126+
J = calc_J(target, p, h, k0)
127+
128+
dp = - np.linalg.inv(J) * dc
129+
130+
p += np.array(dp)
131+
132+
# print(p)
133+
# plt.clf()
134+
# plot_arrow(target.x, target.y, target.yaw)
135+
# plt.plot(xc, yc, "-r")
136+
# plt.axis("equal")
137+
# plt.grid(True)
138+
# # plt.show()
139+
# plt.pause(0.1)
140+
141+
plot_arrow(target.x, target.y, target.yaw)
142+
plt.plot(xc, yc, "-r")
143+
plt.axis("equal")
144+
plt.grid(True)
145+
146+
print("done")
147+
148+
149+
def test_optimize_trajectory():
150+
151+
target = State(x=5.0, y=2.0, yaw=math.radians(00.0))
152+
k0 = 0.0
153+
# s = 5.0 # [m]
154+
# km = math.radians(30.0)
155+
# kf = math.radians(-30.0)
156+
157+
optimize_trajectory(target, k0)
158+
159+
# x, y = generate_trajectory(s, km, kf, k0)
160+
161+
# plt.plot(x, y, "-r")
162+
plot_arrow(target.x, target.y, target.yaw)
163+
plt.axis("equal")
164+
plt.grid(True)
165+
plt.show()
166+
167+
72168
def test_trajectory_generate():
73169
s = 5.0 # [m]
74170
k0 = 0.0
@@ -89,7 +185,8 @@ def test_trajectory_generate():
89185

90186
def main():
91187
print(__file__ + " start!!")
92-
test_trajectory_generate()
188+
# test_trajectory_generate()
189+
test_optimize_trajectory()
93190

94191

95192
if __name__ == '__main__':

0 commit comments

Comments
 (0)