Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 PKG_NAME = 'ackermann_hks'
00011
00012
00013 import roslib;
00014 roslib.load_manifest(PKG_NAME)
00015 import rospy
00016
00017
00018 from ackermann_msgs.msg import AckermannDrive
00019 from ackermann_msgs.msg import AckermannDriveStamped
00020
00021
00022
00023
00024
00025 def clamp(minimum, value, maximum):
00026 "constrain value to the range [minimum .. maximum]"
00027 return max(minimum, min(value, maximum))
00028
00029 class PilotCommand():
00030 "Ackermann steering command interface."
00031
00032 def __init__(self, limit_forward=6.0, limit_reverse=3.0):
00033 "PilotCommand constructor"
00034 self.reconfigure(limit_forward, limit_reverse)
00035 self.pstate = PilotState()
00036 self.car_ctl = AckermannDrive()
00037 self.car_msg = AckermannDriveStamped()
00038 self.pub = rospy.Publisher('ackermann_cmd', AckermannDriveStamped)
00039
00040
00041
00042 def accelerate(self, dv):
00043 "accelerate dv meters/second^2"
00044 rospy.logdebug('acceleration: ' + str(dv))
00045
00046 self.car_ctl.acceleration = abs(dv)
00047
00048
00049 dv *= 0.05
00050 vabs = abs(self.car_ctl.speed)
00051
00052
00053 if -dv > vabs:
00054 vabs = 0.0
00055 else:
00056 vabs += dv
00057
00058
00059 if self.car_ctl.gear.value == Gear.Drive:
00060 if vabs > self.limit_forward:
00061 vabs = self.limit_forward
00062 elif self.car_ctl.gear.value == Gear.Reverse:
00063 if vabs > self.limit_reverse:
00064 vabs = self.limit_reverse
00065 else:
00066 vabs = 0.0
00067 self.car_ctl.acceleration = 0.0
00068
00069 self.car_ctl.speed = vabs
00070
00071 def halt(self):
00072 "halt car immediately"
00073 self.car_ctl.speed = 0.0
00074 self.car_ctl.acceleration = 0.0
00075
00076 def is_running(self):
00077 "return True if pilot node is RUNNING"
00078
00079 return (self.pstate.pilot.state == DriverState.RUNNING)
00080
00081 def is_stopped(self):
00082 "return True if vehicle is stopped"
00083 return (abs(self.car_ctl.speed) < Epsilon.speed)
00084
00085 def pilotCallback(self, pstate):
00086 "handle pilot state message"
00087 self.pstate = pstate
00088
00089 self.car_ctl = pstate.current
00090
00091 def publish(self):
00092 "publish pilot command message"
00093 self.car_msg.header.stamp = rospy.Time.now()
00094 self.car_msg.control = self.car_ctl
00095 self.pub.publish(self.car_msg)
00096
00097 def reconfigure(self, limit_forward, limit_reverse):
00098 "reconfigure forward and reverse speed limits"
00099 self.limit_forward = limit_forward
00100 self.limit_reverse = abs(limit_reverse)
00101
00102 def shift(self, gear):
00103 "set gear request (only if stopped)"
00104 if self.is_stopped():
00105 self.car_ctl.gear.value = gear
00106
00107 def steer(self, angle):
00108 "set wheel angle (radians)"
00109
00110 self.car_ctl.steering_angle = clamp(self.config.min_steering,
00111 angle,
00112 self.config.max_steering)
00113
00114
00115
00116 if __name__ == '__main__':
00117
00118 rospy.init_node('pilot_cmd')
00119
00120
00121 pilot = PilotCommand()
00122
00123
00124 try:
00125 rospy.spin()
00126 except rospy.ROSInterruptException: pass