@@ -38,14 +38,15 @@ def generate_trajectory(s, km, kf, k0):
38
38
# plt.show()
39
39
40
40
state = State ()
41
- x , y = [state .x ], [state .y ]
41
+ x , y , yaw = [state .x ], [state .y ], [ state . yaw ]
42
42
43
43
for ikp in kp :
44
44
state = update (state , v , ikp , dt , L )
45
45
x .append (state .x )
46
46
y .append (state .y )
47
+ yaw .append (state .yaw )
47
48
48
- return x , y
49
+ return x , y , yaw
49
50
50
51
51
52
def update (state , v , delta , dt , L ):
@@ -69,6 +70,101 @@ def pi_2_pi(angle):
69
70
return angle
70
71
71
72
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
+
72
168
def test_trajectory_generate ():
73
169
s = 5.0 # [m]
74
170
k0 = 0.0
@@ -89,7 +185,8 @@ def test_trajectory_generate():
89
185
90
186
def main ():
91
187
print (__file__ + " start!!" )
92
- test_trajectory_generate ()
188
+ # test_trajectory_generate()
189
+ test_optimize_trajectory ()
93
190
94
191
95
192
if __name__ == '__main__' :
0 commit comments