pilot_cmd.py
Go to the documentation of this file.
00001 #!/usr/bin/python
00002 #
00003 #  send pilot commands and update state
00004 #
00005 #   Copyright (C) 2011 Austin Robot Technology
00006 #   License: Modified BSD Software License Agreement
00007 #
00008 # $Id$
00009 
00010 PKG_NAME = 'ackermann_hks'
00011 
00012 # ROS node setup
00013 import roslib;
00014 roslib.load_manifest(PKG_NAME)
00015 import rospy
00016 
00017 # ROS messages
00018 from ackermann_msgs.msg import AckermannDrive
00019 from ackermann_msgs.msg import AckermannDriveStamped
00020 #from art_msgs.msg import DriverState
00021 #from art_msgs.msg import Epsilon
00022 #from art_msgs.msg import Gear
00023 #from art_msgs.msg import PilotState
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         #self.sub = rospy.Subscriber('pilot/state', PilotState,
00040         #                            self.pilotCallback)
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         # update speed
00049         dv *= 0.05                      # scale by cycle duration (dt)
00050         vabs = abs(self.car_ctl.speed)
00051 
00052         # never shift gears via acceleration, stop at zero
00053         if -dv > vabs:
00054             vabs = 0.0
00055         else:
00056             vabs += dv
00057 
00058         # never exceeded forward or reverse speed limits
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:                   # do nothing in Park or Neutral
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         # TODO check that time stamp is not too old
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         # Base future commands on current state, not target.
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         # ensure maximum wheel angle never exceeded
00110         self.car_ctl.steering_angle = clamp(self.config.min_steering,
00111                                             angle,
00112                                             self.config.max_steering)
00113 
00114 
00115 # standalone test of package
00116 if __name__ == '__main__':
00117 
00118     rospy.init_node('pilot_cmd')
00119 
00120     # make an instance
00121     pilot = PilotCommand()
00122 
00123     # run the program
00124     try:
00125         rospy.spin()
00126     except rospy.ROSInterruptException: pass


ackermann_hks
Author(s): Jack O'Quin, Joshua Bennett
autogenerated on Wed Aug 26 2015 10:39:36