1+ """
2+ Move to specified pose
3+ Author: Daniel Ingram (daniel-s-ingram)
4+
5+ P. I. Corke, "Robotics, Vision & Control", Springer 2017, ISBN 978-3-319-54413-7
6+ """
7+
8+ from __future__ import print_function , division
9+
10+ import matplotlib .pyplot as plt
11+ import numpy as np
12+
13+ from math import cos , sin , sqrt , atan2 , pi
14+ from random import random
15+
16+ Kp_rho = 3
17+ Kp_alpha = 5
18+ Kp_beta = - 2
19+ dt = 0.01
20+
21+ #Corners of triangular vehicle when pointing to the right (0 radians)
22+ p1_i = np .array ([0.5 , 0 , 1 ]).T
23+ p2_i = np .array ([- 0.5 , 0.25 , 1 ]).T
24+ p3_i = np .array ([- 0.5 , - 0.25 , 1 ]).T
25+
26+ x_traj = []
27+ y_traj = []
28+
29+ plt .ion ()
30+
31+ def move_to_pose (x_start , y_start , theta_start , x_goal , y_goal , theta_goal ):
32+ """
33+ rho is the distance between the robot and the goal position
34+ alpha is the angle to the goal relative to the heading of the robot
35+ beta is the angle between the robot's position and the goal position plus the goal angle
36+
37+ Kp_rho*rho and Kp_alpha*alpha drive the robot along a line towards the goal
38+ Kp*beta*beta rotates the line so that it is parallel to the goal angle
39+ """
40+ x = x_start
41+ y = y_start
42+ theta = theta_start
43+ while True :
44+ x_diff = x_goal - x
45+ y_diff = y_goal - y
46+
47+ rho = sqrt (x_diff ** 2 + y_diff ** 2 )
48+ alpha = atan2 (y_diff , x_diff ) - theta
49+ beta = theta_goal - theta - alpha
50+
51+ v = Kp_rho * rho
52+ w = Kp_alpha * alpha + Kp_beta * beta
53+
54+ if alpha > pi / 2 or alpha < - pi / 2 :
55+ v = - v
56+
57+ theta = theta + w * dt
58+ x = x + v * cos (theta )* dt
59+ y = y + v * sin (theta )* dt
60+ x_traj .append (x )
61+ y_traj .append (y )
62+
63+ plot_vehicle (x , y , theta , x_start , y_start , x_goal , y_goal , x_traj , y_traj )
64+
65+
66+ def plot_vehicle (x , y , theta , x_start , y_start , x_goal , y_goal , x_traj , y_traj ):
67+ T = transformation_matrix (x , y , theta )
68+ p1 = np .matmul (T , p1_i )
69+ p2 = np .matmul (T , p2_i )
70+ p3 = np .matmul (T , p3_i )
71+ plt .cla ()
72+ plt .plot ([p1 [0 ], p2 [0 ]], [p1 [1 ], p2 [1 ]], 'k-' )
73+ plt .plot ([p2 [0 ], p3 [0 ]], [p2 [1 ], p3 [1 ]], 'k-' )
74+ plt .plot ([p3 [0 ], p1 [0 ]], [p3 [1 ], p1 [1 ]], 'k-' )
75+ plt .plot (x_start , y_start , 'r*' )
76+ plt .plot (x_goal , y_goal , 'g*' )
77+ plt .plot (x_traj , y_traj , 'b--' )
78+ plt .xlim (0 , 20 )
79+ plt .ylim (0 , 20 )
80+ plt .show ()
81+ plt .pause (dt / 10 )
82+
83+ def transformation_matrix (x , y , theta ):
84+ return np .array ([
85+ [cos (theta ), - sin (theta ), x ],
86+ [sin (theta ), cos (theta ), y ],
87+ [0 , 0 , 1 ]
88+ ])
89+
90+ if __name__ == '__main__' :
91+ x_start = 4 #20*random()
92+ y_start = 15 #20*random()
93+ theta_start = pi / 2 #2*pi*random() - pi
94+ x_goal = 13 #20*random()
95+ y_goal = 3 #20*random()
96+ theta_goal = - pi / 2 #2*pi*random() - pi
97+ print ("Initial x: %.2f m\n Initial y: %.2f m\n Initial theta: %.2f rad\n " % (x_start , y_start , theta_start ))
98+ print ("Goal x: %.2f m\n Goal y: %.2f m\n Goal theta: %.2f rad\n " % (x_goal , y_goal , theta_goal ))
99+ move_to_pose (x_start , y_start , theta_start , x_goal , y_goal , theta_goal )
0 commit comments