@@ -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
5152def 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+
72168def test_trajectory_generate ():
73169 s = 5.0 # [m]
74170 k0 = 0.0
@@ -89,7 +185,8 @@ def test_trajectory_generate():
89185
90186def main ():
91187 print (__file__ + " start!!" )
92- test_trajectory_generate ()
188+ # test_trajectory_generate()
189+ test_optimize_trajectory ()
93190
94191
95192if __name__ == '__main__' :
0 commit comments