88from ..interface .gem import GEMVehicleCommand
99from ..component import Component
1010import numpy as np
11+ import rospy
12+ from ackermann_msgs .msg import AckermannDrive
13+
1114
1215class PurePursuit (object ):
1316 """Implements a pure pursuit controller on a second-order Dubins vehicle."""
@@ -39,6 +42,7 @@ def __init__(self, lookahead = None, lookahead_scale = None, crosstrack_gain = N
3942 self .current_traj_parameter = 0.0
4043 self .t_last = None
4144
45+
4246 def set_path (self , path : Path ):
4347 if path == self .path_arg :
4448 return
@@ -91,8 +95,8 @@ def compute(self, state : VehicleState, component : Component = None):
9195 #(rather than just advancing the parameter)
9296 des_parameter = closest_parameter + self .look_ahead + self .look_ahead_scale * speed
9397 print ("Closest parameter: " + str (closest_parameter ),"distance to path" ,closest_dist )
94- if closest_dist > 0.1 :
95- print ( "Closest point" , self .path .eval (closest_parameter ), "vs" , (curr_x ,curr_y ))
98+ # if closest_dist > 0.1:
99+ rospy . loginfo ( f "Closest point { self .path .eval (closest_parameter )} vs , { (curr_x ,curr_y )} " )
96100 if des_parameter >= self .path .domain ()[1 ]:
97101 #we're at the end of the path, calculate desired point by extrapolating from the end of the path
98102 end_pt = self .path .points [- 1 ]
@@ -106,7 +110,7 @@ def compute(self, state : VehicleState, component : Component = None):
106110 desired_x ,desired_y = self .path .eval (des_parameter )
107111 desired_yaw = np .arctan2 (desired_y - curr_y ,desired_x - curr_x )
108112 #print("Desired point",(desired_x,desired_y)," with lookahead distance",self.look_ahead + self.look_ahead_scale * speed)
109- # print("Current yaw",curr_yaw,"desired yaw",desired_yaw)
113+ print ("Current yaw" ,curr_yaw ,"desired yaw" ,desired_yaw )
110114
111115 # distance between the desired point and the vehicle
112116 L = transforms .vector2_dist ((desired_x ,desired_y ),(curr_x ,curr_y ))
@@ -127,8 +131,8 @@ def compute(self, state : VehicleState, component : Component = None):
127131 #print("Closest point distance: " + str(L))
128132 print ("Forward velocity: " + str (speed ))
129133 ct_error = np .sin (alpha ) * L
130- print ("Crosstrack Error: " + str (round (ct_error ,3 )))
131- print ("Front wheel angle: " + str (round (np .degrees (f_delta ),2 )) + " degrees" )
134+ # print("Crosstrack Error: " + str(round(ct_error,3)))
135+ # print("Front wheel angle: " + str(round(np.degrees(f_delta),2)) + " degrees")
132136 steering_angle = np .clip (front2steer (f_delta ), self .steering_angle_range [0 ], self .steering_angle_range [1 ])
133137 print ("Steering wheel angle: " + str (round (np .degrees (steering_angle ),2 )) + " degrees" )
134138
@@ -194,6 +198,7 @@ class PurePursuitTrajectoryTracker(Component):
194198 def __init__ (self ,vehicle_interface = None , ** args ):
195199 self .pure_pursuit = PurePursuit (** args )
196200 self .vehicle_interface = vehicle_interface
201+ self .ackermann_pub = rospy .Publisher ("ackermann_cmd" , AckermannDrive , queue_size = 1 )
197202
198203 def rate (self ):
199204 return 50.0
@@ -207,10 +212,20 @@ def state_outputs(self):
207212 def update (self , vehicle : VehicleState , trajectory : Trajectory ):
208213 self .pure_pursuit .set_path (trajectory )
209214 accel ,wheel_angle = self .pure_pursuit .compute (vehicle , self )
210- # print("Desired wheel angle",wheel_angle)
215+ print ("Desired wheel angle" ,wheel_angle )
211216 steering_angle = np .clip (front2steer (wheel_angle ), self .pure_pursuit .steering_angle_range [0 ], self .pure_pursuit .steering_angle_range [1 ])
212217 #print("Desired steering angle",steering_angle)
213- self .vehicle_interface .send_command (self .vehicle_interface .simple_command (accel ,steering_angle , vehicle ))
218+ #rospy.loginfo(f"accel from pure pursuit {wheel_angle}")
219+
220+ msg = AckermannDrive ()
221+ msg .acceleration = accel
222+ msg .speed = 3 #float('inf') if accel >0 else 0 #acceleration * self.dt
223+ msg .steering_angle = wheel_angle
224+ #msg.steering_angle_velocity = steering_angle_rate
225+
226+ self .ackermann_pub .publish (msg )
227+
228+ #self.vehicle_interface.send_command(self.vehicle_interface.simple_command(accel,steering_angle, vehicle))
214229
215230 def healthy (self ):
216231 return self .pure_pursuit .path is not None
0 commit comments