54 from Tkconstants
import *
55 from tkFileDialog
import *
58 from PIL
import Image, ImageTk
69 "/prj/pkg/Hekateros/share/images",
70 "/usr/local/share/Hekateros/images",
71 "/prj/pkg/appkit/share/images",
72 "/usr/local/share/appkit/images" 76 hekScriptPath =
"/prj/pkg/Hekateros/docs/factory/dynamixel" 78 hekProducts = [
'4S',
'4L',
'5S',
'5L']
83 'shoulder_m':
'shoulder_m.scr',
84 'shoulder_s':
'shoulder_s.scr',
86 'wrist_pitch':
'wrist_pitch.scr',
87 'wrist_rot':
'wrist_rot.scr',
88 'gripper':
'gripper.scr' 92 'shoulder_m':
'shoulder_m.scr',
93 'shoulder_s':
'shoulder_s.scr',
95 'wrist_pitch':
'wrist_pitch.scr',
96 'wrist_rot':
'wrist_rot.scr',
97 'gripper':
'gripper.scr' 100 {
'base_rot':
'base_rot.scr',
101 'shoulder_m':
'shoulder_m.scr',
102 'shoulder_s':
'shoulder_s.scr',
103 'elbow':
'elbow.scr',
104 'wrist_pitch':
'wrist_pitch.scr',
105 'wrist_rot':
'wrist_rot.scr',
106 'gripper':
'gripper.scr' 109 {
'base_rot':
'base_rot.scr',
110 'shoulder_m':
'shoulder_m.scr',
111 'shoulder_s':
'shoulder_s.scr',
112 'elbow':
'elbow.scr',
113 'wrist_pitch':
'wrist_pitch.scr',
114 'wrist_rot':
'wrist_rot.scr',
115 'gripper':
'gripper.scr' 119 hekBaudRates = [9600, 19200, 57600, 115200, 200000, 400000, 500000, 1000000]
126 'warning':
'#aa6600',
141 def loadIcon(filename):
143 if filename
is None or len(filename) == 0:
146 if filename[0] == os.path.sep:
148 return ImageTk.PhotoImage(Image.open(filename))
152 for path
in imagePath:
153 fqname = path + os.path.sep + filename
155 return ImageTk.PhotoImage(Image.open(fqname))
164 return math.floor((x + 0.005) * 100.0) / 100.0
170 return math.floor((x + 0.05) * 10.0) / 10.0
176 return deg / 180.0 * math.pi
182 return rad / math.pi * 180.0
205 Frame.__init__(self, master=master, cnf=cnf, **kw)
206 self.master.title(
"Hekateros Factory Servo Configuration")
207 self.grid(row=0, column=0, padx=5, pady=5)
225 self.
m_uri =
'/dev/ttyUSB0' 230 if kw.has_key(
'debug'):
233 if kw.has_key(
'arm'):
236 if kw.has_key(
'joint'):
239 if kw.has_key(
'uri'):
240 self.
m_uri = kw[
'uri']
242 if kw.has_key(
'baudrate'):
260 wframe = Frame(parent)
261 wframe[
'borderwidth'] = 2
262 wframe[
'relief'] =
'ridge' 263 wframe.grid(row=row, column=col, padx=1, pady=3, sticky=N+W+E)
268 self.
m_icons[
'rn_logo'] = loadIcon(
"RNLogo48.png");
270 w[
'image'] = self.
m_icons[
'rn_logo']
275 w.grid(row=0, column=0, sticky=W)
279 w[
'font'] = (
'Helvetica', 16)
280 w[
'text'] =
'Hekateros Factory Servo Configuration' 283 w.grid(row=0, column=1, sticky=E+W)
287 self.
m_icons[
'hek_logo'] = loadIcon(
"icons/icon_hek_logo.png");
289 w[
'image'] = self.
m_icons[
'hek_logo']
295 w.grid(row=0, column=2, sticky=E)
303 wframe = Frame(parent)
304 wframe[
'borderwidth'] = 2
305 wframe[
'relief'] =
'ridge' 306 wframe.grid(row=row, column=col, padx=1, pady=3, sticky=N+W+E)
311 w[
'font'] =(
'Helvetica', 12)
312 w[
'text'] =
'Servo Configuration' 314 w.grid(row=0, column=0, columnspan=10, sticky=E+W)
323 for text
in [
' ',
'Target',
'Current',
'Current',
' ']:
324 w = Label(wframe, width=width, padx=padx, pady=pady, anchor=CENTER,
326 w.grid(row=row, column=col, pady=0, sticky=W+E)
333 for text
in [
'Joint Servo',
'Servo Id',
'Servo Id',
'Baudrate',
335 w = Label(wframe, width=width, padx=padx, pady=0, anchor=CENTER,
337 w.grid(row=row, column=col, sticky=W+E)
345 wframe[
'borderwidth'] = 2
346 wframe[
'relief'] =
'ridge' 347 wframe.grid(row=2, column=0, columnspan=3, padx=1, pady=3, sticky=N+E+W+S)
350 self.m_varStatus.set(
"Calibration required.")
357 self.m_wStatusBar.grid(row=0, column=0, padx=3, pady=3, sticky=N+E+W+S)
381 print "%s: %s" % (self.
_Argv0, emsg)
383 print "%s: error" % (self.
_Argv0)
384 print "Try '%s --help' for more information." % (self.
_Argv0)
390 usage: %s [OPTIONS] <arm> <joint> 393 Options and arguments: 394 -u, --uri=<device_uri> : Dynamixel serial device uri. 395 SYNTAX: [botsense://[hostname][:port]]/device 396 DEFAULT: /dev/ttyUSB0 397 -b, --baudrate=<baud> : Dynamixel serial device baud rate. 399 -h, --help : Display this help and exit. 401 <arm> : Hekateros product id. One of: 4S 4L 5S 5L 402 <joint> : Hekateros joint servo. One of: 403 base_rot shoulder_m shoulder_s elbow 404 wrist_pitch wrist_rot gripper 416 self.
_Argv0 = kwargs.get(
'argv0', __file__)
420 kwargs[
'uri'] =
'/dev/ttyUSB0' 421 kwargs[
'baudrate'] = 1000000
425 opts, args = getopt.getopt(argv[1:],
"?hu:b:",
426 [
'help',
'uri=',
'baudrate='])
427 except getopt.error, msg:
429 for opt, optarg
in opts:
430 if opt
in (
'-h',
'--help',
'-?'):
433 elif opt
in (
'-u',
'--uri'):
434 kwargs[
'uri'] = optarg
435 elif opt
in (
'-b',
'--baudrate'):
436 kwargs[
'baudrate'] = optarg
442 kwargs[
'arm'] = args[0]
448 kwargs[
'joint'] = args[1]
456 def run(self, argv=None, **kwargs):
461 if hekDynaScripts.has_key(kwargs[
'arm']):
462 scripts = hekDynaScripts[kwargs[
'arm']]
464 self.
printUsageErr(
"%s: Unknown hekateros product key." % (kwargs[
'arm']))
467 if scripts.has_key(kwargs[
'joint']):
468 cfg_script = scripts[kwargs[
'joint']]
479 root.protocol(
'WM_DELETE_WINDOW', root.destroy)
482 self.m_win.mainloop()
486 fqscript = hekScriptPath + os.path.sep + cfg_script
488 cmd =
"dynashell --uri=%s --baudrate=%s --script=%s" % \
489 (kwargs[
'uri'], kwargs[
'baudrate'], fqscript)
499 if __name__ ==
'__main__':
501 sys.exit( app.run() );
Configure Hekateros servo.
def run(self, argv=None, kwargs)
Run application.
Window class supporting application.
def createHeading(self, parent, row, col)
Create top gui heading.
def __init__(self)
Unit test constructor.
def initData(self, kw)
Initialize class state data.
def createStatusBar(self, parent, row, col)
Create gui status bar at bottom of gui window.
def printUsage(self)
Print Command-Line Usage Message.
def getOptions(self, argv=None, kwargs)
Get command-line options.
def createWidgets(self)
Create gui widgets with supporting data and show.
def printUsageErr(self, emsg)
Print usage error.
def __init__(self, master=None, cnf={}, kw)
Constructor.
def createCfgPanel(self, parent, row, col)
Create joint state lower center panel headers.