@@ -49,15 +49,15 @@ def mod2pi(x):
4949    return  v 
5050
5151
52- def  SLS (x , y , phi ):
52+ def  straight_left_straight (x , y , phi ):
5353    phi  =  mod2pi (phi )
54-     if  y  >  0.0  and  phi   >   0.0  and  phi  <  math .pi  *  0.99 :
54+     if  y  >  0.0  and  0.0  <  phi  <  math .pi  *  0.99 :
5555        xd  =  -  y  /  math .tan (phi ) +  x 
5656        t  =  xd  -  math .tan (phi  /  2.0 )
5757        u  =  phi 
5858        v  =  math .sqrt ((x  -  xd ) **  2  +  y  **  2 ) -  math .tan (phi  /  2.0 )
5959        return  True , t , u , v 
60-     elif  y  <  0.0  and   phi   >   0.0   and  phi  <  math .pi  *  0.99 :
60+     elif  y  <  0.0  <  phi  <  math .pi  *  0.99 :
6161        xd  =  -  y  /  math .tan (phi ) +  x 
6262        t  =  xd  -  math .tan (phi  /  2.0 )
6363        u  =  phi 
@@ -68,7 +68,6 @@ def SLS(x, y, phi):
6868
6969
7070def  set_path (paths , lengths , ctypes ):
71- 
7271    path  =  Path ()
7372    path .ctypes  =  ctypes 
7473    path .lengths  =  lengths 
@@ -89,12 +88,12 @@ def set_path(paths, lengths, ctypes):
8988    return  paths 
9089
9190
92- def  SCS (x , y , phi , paths ):
93-     flag , t , u , v  =  SLS (x , y , phi )
91+ def  straight_curve_straight (x , y , phi , paths ):
92+     flag , t , u , v  =  straight_left_straight (x , y , phi )
9493    if  flag :
9594        paths  =  set_path (paths , [t , u , v ], ["S" , "L" , "S" ])
9695
97-     flag , t , u , v  =  SLS (x , - y , - phi )
96+     flag , t , u , v  =  straight_left_straight (x , - y , - phi )
9897    if  flag :
9998        paths  =  set_path (paths , [t , u , v ], ["S" , "R" , "S" ])
10099
@@ -107,7 +106,7 @@ def polar(x, y):
107106    return  r , theta 
108107
109108
110- def  LSL (x , y , phi ):
109+ def  left_straight_left (x , y , phi ):
111110    u , t  =  polar (x  -  math .sin (phi ), y  -  1.0  +  math .cos (phi ))
112111    if  t  >=  0.0 :
113112        v  =  mod2pi (phi  -  t )
@@ -117,99 +116,97 @@ def LSL(x, y, phi):
117116    return  False , 0.0 , 0.0 , 0.0 
118117
119118
120- def  LRL (x , y , phi ):
119+ def  left_right_left (x , y , phi ):
121120    u1 , t1  =  polar (x  -  math .sin (phi ), y  -  1.0  +  math .cos (phi ))
122121
123122    if  u1  <=  4.0 :
124123        u  =  - 2.0  *  math .asin (0.25  *  u1 )
125124        t  =  mod2pi (t1  +  0.5  *  u  +  math .pi )
126125        v  =  mod2pi (phi  -  t  +  u )
127126
128-         if  t  >=  0.0  and   u   <=   0.0 :
127+         if  t  >=  0.0  >=   u :
129128            return  True , t , u , v 
130129
131130    return  False , 0.0 , 0.0 , 0.0 
132131
133132
134- def  CCC (x , y , phi , paths ):
135- 
136-     flag , t , u , v  =  LRL (x , y , phi )
133+ def  curve_curve_curve (x , y , phi , paths ):
134+     flag , t , u , v  =  left_right_left (x , y , phi )
137135    if  flag :
138136        paths  =  set_path (paths , [t , u , v ], ["L" , "R" , "L" ])
139137
140-     flag , t , u , v  =  LRL (- x , y , - phi )
138+     flag , t , u , v  =  left_right_left (- x , y , - phi )
141139    if  flag :
142140        paths  =  set_path (paths , [- t , - u , - v ], ["L" , "R" , "L" ])
143141
144-     flag , t , u , v  =  LRL (x , - y , - phi )
142+     flag , t , u , v  =  left_right_left (x , - y , - phi )
145143    if  flag :
146144        paths  =  set_path (paths , [t , u , v ], ["R" , "L" , "R" ])
147145
148-     flag , t , u , v  =  LRL (- x , - y , phi )
146+     flag , t , u , v  =  left_right_left (- x , - y , phi )
149147    if  flag :
150148        paths  =  set_path (paths , [- t , - u , - v ], ["R" , "L" , "R" ])
151149
152150    # backwards 
153151    xb  =  x  *  math .cos (phi ) +  y  *  math .sin (phi )
154152    yb  =  x  *  math .sin (phi ) -  y  *  math .cos (phi )
155-     # println(xb, ",", yb,",",x,",",y) 
156153
157-     flag , t , u , v  =  LRL (xb , yb , phi )
154+     flag , t , u , v  =  left_right_left (xb , yb , phi )
158155    if  flag :
159156        paths  =  set_path (paths , [v , u , t ], ["L" , "R" , "L" ])
160157
161-     flag , t , u , v  =  LRL (- xb , yb , - phi )
158+     flag , t , u , v  =  left_right_left (- xb , yb , - phi )
162159    if  flag :
163160        paths  =  set_path (paths , [- v , - u , - t ], ["L" , "R" , "L" ])
164161
165-     flag , t , u , v  =  LRL (xb , - yb , - phi )
162+     flag , t , u , v  =  left_right_left (xb , - yb , - phi )
166163    if  flag :
167164        paths  =  set_path (paths , [v , u , t ], ["R" , "L" , "R" ])
168165
169-     flag , t , u , v  =  LRL (- xb , - yb , phi )
166+     flag , t , u , v  =  left_right_left (- xb , - yb , phi )
170167    if  flag :
171168        paths  =  set_path (paths , [- v , - u , - t ], ["R" , "L" , "R" ])
172169
173170    return  paths 
174171
175172
176- def  CSC (x , y , phi , paths ):
177-     flag , t , u , v  =  LSL (x , y , phi )
173+ def  curve_straight_curve (x , y , phi , paths ):
174+     flag , t , u , v  =  left_straight_left (x , y , phi )
178175    if  flag :
179176        paths  =  set_path (paths , [t , u , v ], ["L" , "S" , "L" ])
180177
181-     flag , t , u , v  =  LSL (- x , y , - phi )
178+     flag , t , u , v  =  left_straight_left (- x , y , - phi )
182179    if  flag :
183180        paths  =  set_path (paths , [- t , - u , - v ], ["L" , "S" , "L" ])
184181
185-     flag , t , u , v  =  LSL (x , - y , - phi )
182+     flag , t , u , v  =  left_straight_left (x , - y , - phi )
186183    if  flag :
187184        paths  =  set_path (paths , [t , u , v ], ["R" , "S" , "R" ])
188185
189-     flag , t , u , v  =  LSL (- x , - y , phi )
186+     flag , t , u , v  =  left_straight_left (- x , - y , phi )
190187    if  flag :
191188        paths  =  set_path (paths , [- t , - u , - v ], ["R" , "S" , "R" ])
192189
193-     flag , t , u , v  =  LSR (x , y , phi )
190+     flag , t , u , v  =  left_straight_right (x , y , phi )
194191    if  flag :
195192        paths  =  set_path (paths , [t , u , v ], ["L" , "S" , "R" ])
196193
197-     flag , t , u , v  =  LSR (- x , y , - phi )
194+     flag , t , u , v  =  left_straight_right (- x , y , - phi )
198195    if  flag :
199196        paths  =  set_path (paths , [- t , - u , - v ], ["L" , "S" , "R" ])
200197
201-     flag , t , u , v  =  LSR (x , - y , - phi )
198+     flag , t , u , v  =  left_straight_right (x , - y , - phi )
202199    if  flag :
203200        paths  =  set_path (paths , [t , u , v ], ["R" , "S" , "L" ])
204201
205-     flag , t , u , v  =  LSR (- x , - y , phi )
202+     flag , t , u , v  =  left_straight_right (- x , - y , phi )
206203    if  flag :
207204        paths  =  set_path (paths , [- t , - u , - v ], ["R" , "S" , "L" ])
208205
209206    return  paths 
210207
211208
212- def  LSR (x , y , phi ):
209+ def  left_straight_right (x , y , phi ):
213210    u1 , t1  =  polar (x  +  math .sin (phi ), y  -  1.0  -  math .cos (phi ))
214211    u1  =  u1  **  2 
215212    if  u1  >=  4.0 :
@@ -224,60 +221,60 @@ def LSR(x, y, phi):
224221    return  False , 0.0 , 0.0 , 0.0 
225222
226223
227- def  generate_path (q0 , q1 , maxc ):
224+ def  generate_path (q0 , q1 , max_curvature ):
228225    dx  =  q1 [0 ] -  q0 [0 ]
229226    dy  =  q1 [1 ] -  q0 [1 ]
230227    dth  =  q1 [2 ] -  q0 [2 ]
231228    c  =  math .cos (q0 [2 ])
232229    s  =  math .sin (q0 [2 ])
233-     x  =  (c  *  dx  +  s  *  dy ) *  maxc 
234-     y  =  (- s  *  dx  +  c  *  dy ) *  maxc 
230+     x  =  (c  *  dx  +  s  *  dy ) *  max_curvature 
231+     y  =  (- s  *  dx  +  c  *  dy ) *  max_curvature 
235232
236233    paths  =  []
237-     paths  =  SCS (x , y , dth , paths )
238-     paths  =  CSC (x , y , dth , paths )
239-     paths  =  CCC (x , y , dth , paths )
234+     paths  =  straight_curve_straight (x , y , dth , paths )
235+     paths  =  curve_straight_curve (x , y , dth , paths )
236+     paths  =  curve_curve_curve (x , y , dth , paths )
240237
241238    return  paths 
242239
243240
244- def  interpolate (ind , l , m , maxc , ox , oy , oyaw , px , py , pyaw , directions ):
245- 
246-     if  m  ==  "S" :
247-         px [ind ] =  ox  +  l  /  maxc  *  math .cos (oyaw )
248-         py [ind ] =  oy  +  l  /  maxc  *  math .sin (oyaw )
249-         pyaw [ind ] =  oyaw 
241+ def  interpolate (ind , length , mode , max_curvature , origin_x , origin_y , origin_yaw , path_x , path_y , path_yaw , directions ):
242+     if  mode  ==  "S" :
243+         path_x [ind ] =  origin_x  +  length  /  max_curvature  *  math .cos (origin_yaw )
244+         path_y [ind ] =  origin_y  +  length  /  max_curvature  *  math .sin (origin_yaw )
245+         path_yaw [ind ] =  origin_yaw 
250246    else :  # curve 
251-         ldx  =  math .sin (l ) /  maxc 
252-         if  m  ==  "L" :  # left turn 
253-             ldy  =  (1.0  -  math .cos (l )) /  maxc 
254-         elif  m  ==  "R" :  # right turn 
255-             ldy  =  (1.0  -  math .cos (l )) /  - maxc 
256-         gdx  =  math .cos (- oyaw ) *  ldx  +  math .sin (- oyaw ) *  ldy 
257-         gdy  =  - math .sin (- oyaw ) *  ldx  +  math .cos (- oyaw ) *  ldy 
258-         px [ind ] =  ox  +  gdx 
259-         py [ind ] =  oy  +  gdy 
260- 
261-     if  m  ==  "L" :  # left turn 
262-         pyaw [ind ] =  oyaw  +  l 
263-     elif  m  ==  "R" :  # right turn 
264-         pyaw [ind ] =  oyaw  -  l 
265- 
266-     if  l  >  0.0 :
247+         ldx  =  math .sin (length ) /  max_curvature 
248+         ldy  =  0.0 
249+         if  mode  ==  "L" :  # left turn 
250+             ldy  =  (1.0  -  math .cos (length )) /  max_curvature 
251+         elif  mode  ==  "R" :  # right turn 
252+             ldy  =  (1.0  -  math .cos (length )) /  - max_curvature 
253+         gdx  =  math .cos (- origin_yaw ) *  ldx  +  math .sin (- origin_yaw ) *  ldy 
254+         gdy  =  - math .sin (- origin_yaw ) *  ldx  +  math .cos (- origin_yaw ) *  ldy 
255+         path_x [ind ] =  origin_x  +  gdx 
256+         path_y [ind ] =  origin_y  +  gdy 
257+ 
258+     if  mode  ==  "L" :  # left turn 
259+         path_yaw [ind ] =  origin_yaw  +  length 
260+     elif  mode  ==  "R" :  # right turn 
261+         path_yaw [ind ] =  origin_yaw  -  length 
262+ 
263+     if  length  >  0.0 :
267264        directions [ind ] =  1 
268265    else :
269266        directions [ind ] =  - 1 
270267
271-     return  px ,  py ,  pyaw , directions 
268+     return  path_x ,  path_y ,  path_yaw , directions 
272269
273270
274- def  generate_local_course (L , lengths , mode , maxc , step_size ):
275-     npoint  =  math .trunc (L  /  step_size ) +  len (lengths ) +  4 
271+ def  generate_local_course (total_length , lengths , mode , max_curvature , step_size ):
272+     n_point  =  math .trunc (total_length  /  step_size ) +  len (lengths ) +  4 
276273
277-     px  =  [0.0  for  i  in  range (npoint )]
278-     py  =  [0.0  for  i  in  range (npoint )]
279-     pyaw  =  [0.0  for  i  in  range (npoint )]
280-     directions  =  [0.0  for  i  in  range (npoint )]
274+     px  =  [0.0  for  _  in  range (n_point )]
275+     py  =  [0.0  for  _  in  range (n_point )]
276+     pyaw  =  [0.0  for  _  in  range (n_point )]
277+     directions  =  [0.0  for  _  in  range (n_point )]
281278    ind  =  1 
282279
283280    if  lengths [0 ] >  0.0 :
@@ -305,14 +302,14 @@ def generate_local_course(L, lengths, mode, maxc, step_size):
305302        while  abs (pd ) <=  abs (l ):
306303            ind  +=  1 
307304            px , py , pyaw , directions  =  interpolate (
308-                 ind , pd , m , maxc , ox , oy , oyaw , px , py , pyaw , directions )
305+                 ind , pd , m , max_curvature , ox , oy , oyaw , px , py , pyaw , directions )
309306            pd  +=  d 
310307
311308        ll  =  l  -  pd  -  d   # calc remain length 
312309
313310        ind  +=  1 
314311        px , py , pyaw , directions  =  interpolate (
315-             ind , l , m , maxc , ox , oy , oyaw , px , py , pyaw , directions )
312+             ind , l , m , max_curvature , ox , oy , oyaw , px , py , pyaw , directions )
316313
317314    # remove unused data 
318315    while  px [- 1 ] ==  0.0 :
@@ -344,22 +341,17 @@ def calc_paths(sx, sy, syaw, gx, gy, gyaw, maxc, step_size):
344341                  *  iy  +  q0 [1 ] for  (ix , iy ) in  zip (x , y )]
345342        path .yaw  =  [pi_2_pi (iyaw  +  q0 [2 ]) for  iyaw  in  yaw ]
346343        path .directions  =  directions 
347-         path .lengths  =  [l  /  maxc  for  l  in  path .lengths ]
344+         path .lengths  =  [length  /  maxc  for  length  in  path .lengths ]
348345        path .L  =  path .L  /  maxc 
349346
350-     #  print(paths) 
351- 
352347    return  paths 
353348
354349
355350def  reeds_shepp_path_planning (sx , sy , syaw ,
356351                              gx , gy , gyaw , maxc , step_size = 0.2 ):
357- 
358352    paths  =  calc_paths (sx , sy , syaw , gx , gy , gyaw , maxc , step_size )
359353
360354    if  not  paths :
361-         #  print("No path") 
362-         #  print(sx, sy, syaw, gx, gy, gyaw) 
363355        return  None , None , None , None , None 
364356
365357    minL  =  float ("Inf" )
@@ -374,48 +366,6 @@ def reeds_shepp_path_planning(sx, sy, syaw,
374366    return  bpath .x , bpath .y , bpath .yaw , bpath .ctypes , bpath .lengths 
375367
376368
377- def  test ():
378- 
379-     NTEST  =  5 
380- 
381-     for  i  in  range (NTEST ):
382-         start_x  =  (np .random .rand () -  0.5 ) *  10.0   # [m] 
383-         start_y  =  (np .random .rand () -  0.5 ) *  10.0   # [m] 
384-         start_yaw  =  np .deg2rad ((np .random .rand () -  0.5 ) *  180.0 )  # [rad] 
385- 
386-         end_x  =  (np .random .rand () -  0.5 ) *  10.0   # [m] 
387-         end_y  =  (np .random .rand () -  0.5 ) *  10.0   # [m] 
388-         end_yaw  =  np .deg2rad ((np .random .rand () -  0.5 ) *  180.0 )  # [rad] 
389- 
390-         curvature  =  1.0  /  (np .random .rand () *  20.0 )
391-         step_size  =  0.1 
392- 
393-         px , py , pyaw , mode , clen  =  reeds_shepp_path_planning (
394-             start_x , start_y , start_yaw , end_x , end_y , end_yaw , curvature , step_size )
395- 
396-         if  show_animation :  # pragma: no cover 
397-             plt .cla ()
398-             # for stopping simulation with the esc key. 
399-             plt .gcf ().canvas .mpl_connect ('key_release_event' ,
400-                     lambda  event : [exit (0 ) if  event .key  ==  'escape'  else  None ])
401-             plt .plot (px , py , label = "final course "  +  str (mode ))
402- 
403-             #  plotting 
404-             plot_arrow (start_x , start_y , start_yaw )
405-             plot_arrow (end_x , end_y , end_yaw )
406- 
407-             plt .legend ()
408-             plt .grid (True )
409-             plt .axis ("equal" )
410-             plt .xlim (- 10 , 10 )
411-             plt .ylim (- 10 , 10 )
412-             plt .pause (1.0 )
413- 
414-             #  plt.show() 
415- 
416-     print ("Test done" )
417- 
418- 
419369def  main ():
420370    print ("Reeds Shepp path planner sample start!!" )
421371
@@ -451,5 +401,4 @@ def main():
451401
452402
453403if  __name__  ==  '__main__' :
454-     test ()
455404    main ()
0 commit comments