00001
00002
00003 """
00004 brake script for Marvin -- Function to send the controller a command,
00005 then read its response with a 1-second timeout.
00006
00007 This program can be run as a shell script or imported as a module.
00008 Help is provided in each case:
00009
00010 as a script:
00011 --help describes the arguments and options
00012
00013 as a module:
00014 import roslib
00015 roslib.load_manifest('art_servo')
00016 import brake.robot_brake
00017 help(brake.robot_brake.commands)
00018
00019 """
00020
00021 import serial
00022 import time
00023 import types
00024 import sys
00025 import getopt
00026 import os
00027 from os.path import basename, splitext
00028
00029
00030 TTY="/dev/brake"
00031
00032 class commands:
00033 """ Class to connect and send commands to brake.
00034 """
00035
00036 def __init__(self, device=TTY):
00037 """ Constructor method.
00038 Takes serial port as input.
00039 """
00040 self.ser=serial.Serial(device, 38400, timeout=1)
00041 self.ser.open()
00042
00043 def baud(self):
00044 """ Set baud rate
00045 """
00046 print("setting brake baud rate")
00047 self.ser.setBaudrate(9600)
00048 self.ser.write("BAUD38400\r")
00049 time.sleep(3)
00050 self.ser.close()
00051 self.ser.setBaudrate(38400)
00052 self.ser.open()
00053 self.st()
00054
00055 def servo_cmd(self,cmd):
00056 """ Send command and wait for response
00057 """
00058
00059 print(cmd)
00060 cmd+=" RW\r"
00061
00062 self.ser.write(cmd)
00063 status=self.ser.readline()
00064 if status == '':
00065 print("Device not responding")
00066 else:
00067 lstatus=status.split('\r')
00068 for x in lstatus:
00069 if x:
00070 print("Device returns (0x%x)\n" % (int(x)))
00071 return status
00072
00073 def setup(self):
00074 """ Run brake setup routine
00075 """
00076
00077 print("initializing brake on " + TTY)
00078 self.servo_cmd("ZS")
00079 self.servo_cmd("UCI")
00080 self.servo_cmd("UDI")
00081 self.servo_cmd("F=0")
00082
00083 self.servo_cmd("MP D=0 G")
00084 self.servo_cmd("UAI")
00085 self.servo_cmd("O=0")
00086 self.servo_cmd("A=8*96")
00087 self.servo_cmd("V=32212*48")
00088
00089 self.servo_cmd("MT T=-125")
00090 time.sleep(4)
00091 self.servo_cmd("RP")
00092 self.servo_cmd("MT T=5")
00093 time.sleep(1)
00094 self.servo_cmd("MP D=0 G")
00095 self.servo_cmd("RP")
00096 self.servo_cmd("O=0")
00097
00098 self.servo_cmd("LIMD")
00099 self.servo_cmd("LIML")
00100
00101
00102 self.servo_cmd("UCP")
00103
00104
00105 self.servo_cmd("UDM")
00106
00107
00108 self.servo_cmd("F=1")
00109
00110 def off(self):
00111 """ Release brake
00112 """
00113
00114 print("disengaging brake")
00115 self.servo_cmd("Zr")
00116 self.servo_cmd("Zl")
00117 self.servo_cmd("MP P=0 G")
00118
00119
00120 def full(self):
00121 """ Engage brake fully
00122 """
00123 print("setting brake fully on")
00124 self.servo_cmd("MT T=200")
00125 self.servo_cmd("Zr")
00126 self.servo_cmd("Zl")
00127 time.sleep(1)
00128 self.servo_cmd("MP D=0 G")
00129 self.servo_cmd("RP")
00130 self.servo_cmd("c=UEA Rc")
00131
00132 def pos(self):
00133 """ Return brake position info
00134 """
00135 print("motor position:")
00136 self.servo_cmd("RP")
00137 print("potentiometer value:")
00138 self.servo_cmd("c=UEA Rc")
00139 print("brake pressure:")
00140 self.servo_cmd("c=UAA Rc")
00141 print("position error limit:")
00142 self.servo_cmd("c=E Rc")
00143
00144
00145 def st(self):
00146 """ Print status of motor
00147 """
00148 print("current status")
00149 self.servo_cmd("")
00150
00151 def usage(progname):
00152 """ print usage message
00153 """
00154 print("\n" + str(progname) + """[-h] command [ <serial-port> ]
00155
00156 -h, --help\tprint this message
00157
00158 command options:
00159 \tbaud\tset baud rate to 38400
00160 \tfull\tfully engage brake
00161 \toff\tfully release brake
00162 \tpos\treport current motor position and potentiometer reading
00163 \tsetup\tinitialize brake servo
00164 \tst\tprint current status
00165
00166 default serial-port: /dev/brake
00167 """)
00168
00169
00170 def main(argv=None):
00171 """ Main program. For either script or interactive use.
00172 """
00173 global TTY
00174
00175 if argv is None:
00176 argv = sys.argv
00177
00178
00179 progname = basename(argv[0])
00180 if progname is "":
00181 progname = "robot-brake.py"
00182
00183
00184 opts = {}
00185 try:
00186 o, params = getopt.gnu_getopt(argv[1:], 'h', ('help'))
00187
00188 except getopt.error, msg:
00189 print(msg)
00190 print("for help use --help")
00191 return 8
00192
00193 for k,v in o:
00194 opts[k] = v
00195 if '-h' in opts or '--help' in opts:
00196 usage(progname)
00197 return 9
00198 if len(params) < 1:
00199 usage(progname)
00200 print("no command provided")
00201 return 8
00202
00203 if len(params) == 2:
00204 TTY = params[1]
00205
00206 try:
00207 c = commands(TTY)
00208
00209 CMD=params[0]
00210 if CMD=="baud":
00211 c.baud()
00212 elif CMD=="pos":
00213 c.pos()
00214 elif CMD=="full":
00215 c.full()
00216 elif CMD=="off":
00217 c.off()
00218 elif CMD=="setup":
00219 c.setup()
00220 elif CMD=="st":
00221 c.st()
00222 else:
00223 usage(progname)
00224 print("invalid command provided")
00225 return 7
00226
00227 except serial.serialutil.SerialException, ioerror:
00228 print(ioerror)
00229 return 1
00230
00231
00232 if __name__ == "__main__":
00233
00234 sys.exit(main())