00001
00002
00003
00004
00005 import roslib; roslib.load_manifest('camera_pose_toolkits')
00006 import rospy
00007 import rosservice
00008 import socket
00009 import wx
00010 from camera_pose_toolkits.srv import *
00011 from std_msgs.msg import String
00012 from calibration_msgs.msg import *
00013
00014
00015 class MainWindow(wx.Frame):
00016 def __init__(self, output_ns):
00017
00018
00019
00020
00021 title = '[' + output_ns + ']' + ' dispatcher gui on %s' % socket.gethostname()
00022 self.output_ns = output_ns
00023
00024 wx.Frame.__init__(self, None, wx.ID_ANY, title, pos=(200, 200), size=(400, 100))
00025
00026
00027 self.menubar = wx.MenuBar()
00028 self.filemenu = wx.Menu()
00029 self.filemenu.Append(wx.ID_EXIT, 'E&xit', 'Exit the program')
00030 wx.EVT_MENU(self, wx.ID_EXIT, self.on_exit)
00031 self.menubar.Append(self.filemenu, '&File')
00032 self.SetMenuBar(self.menubar)
00033
00034 camera_ns_list = ['zero', 'one', 'two', 'three', 'four', 'five','six', 'seven', 'eight']
00035 self.combobox = wx.ComboBox(self, wx.ID_ANY, choices=camera_ns_list, style=wx.CB_READONLY)
00036
00037 self.statusbar = self.CreateStatusBar()
00038 self.statusbar.SetStatusText('[' + self.output_ns + ']' +' now relays: ')
00039
00040 self.sub = rospy.Subscriber(self.output_ns+"/selected", String, self.cb_func)
00041 self.features_sub = rospy.Subscriber(self.output_ns+'/features', CalibrationPattern, self.features_cb)
00042 self.cb_in_sight = 0
00043
00044 self.Bind(wx.EVT_COMBOBOX, self.on_combobox)
00045
00046 self.sizer = wx.BoxSizer(wx.VERTICAL)
00047 self.sizer.Add(self.combobox, 0, wx.EXPAND)
00048 self.SetSizer(self.sizer)
00049
00050
00051
00052 self.timer1 = wx.Timer(self, wx.ID_ANY)
00053 self.Bind(wx.EVT_TIMER, self.on_timer1, self.timer1)
00054 self.timer1.Start(500, False)
00055
00056
00057
00058 self.timer2 = wx.Timer(self, wx.ID_ANY)
00059 self.Bind(wx.EVT_TIMER, self.on_timer2, self.timer2)
00060 self.timer2.Start(1000, False)
00061
00062 self.selected_cam_ns = ""
00063
00064
00065
00066 def cb_func(self, msg):
00067 self.selected_cam_ns = msg.data
00068
00069 def features_cb(self, msg):
00070 self.cb_in_sight = msg.success
00071
00072 def on_timer2(self, event):
00073
00074 if rospy.is_shutdown():
00075 self.Close(True)
00076 self.Refresh()
00077
00078 def on_timer1(self, event):
00079
00080
00081 topic_list=[ tn_tt[0] for tn_tt in rospy.client.get_published_topics()]
00082 self.camera_ns_list = [ tn[:-len('/image_rect')] for tn in topic_list if tn.endswith('/image_rect')]
00083 self.camera_ns_list = [ ns for ns in self.camera_ns_list if not ( ns.startswith(self.output_ns) or ns.startswith('/'+self.output_ns) ) ]
00084 self.combobox.SetItems(self.camera_ns_list)
00085
00086 for cam_ns in self.camera_ns_list:
00087 if cam_ns == self.selected_cam_ns:
00088
00089 self.statusbar.SetStatusText('[' + self.output_ns + ']' + ' now relays: ' + self.selected_cam_ns)
00090 break
00091 else:
00092 self.statusbar.SetStatusText('[' + self.output_ns + ']' + ' now relays: ')
00093
00094
00095
00096 print self.camera_ns_list
00097 print self.output_ns
00098 print self.selected_cam_ns
00099
00100
00101 def on_timer(self, event):
00102 if rospy.is_shutdown():
00103 self.Close(True)
00104 self.Refresh()
00105
00106 def on_exit(self, e):
00107 self.Close(True)
00108 self.Refresh()
00109
00110 def on_error(self):
00111 self.Raise()
00112
00113 def on_combobox(self, event):
00114 print 'combobox event'
00115
00116 if self.cb_in_sight == 0 :
00117 print str(self.combobox.GetValue())
00118
00119 for s in rosservice.get_service_list():
00120 if s.endswith(self.output_ns+ '/switch'):
00121 switch_cam = rospy.ServiceProxy(self.output_ns+ '/switch', Switch)
00122 resp = switch_cam ( str(self.combobox.GetValue()))
00123 break
00124 else:
00125 wx.MessageBox('Service not ready. Try again later.', 'Info!')
00126 else:
00127 wx.MessageBox('Remove checkerboard from '+ self.output_ns +'\' field of view before switching camera', 'Info!')
00128
00129
00130
00131
00132
00133
00134
00135 if __name__ == '__main__':
00136 argv = rospy.myargv()
00137 if len(argv) <2:
00138 print 'Usage: '
00139 exit(1)
00140
00141 print argv[0]
00142 print argv[1]
00143
00144
00145
00146 app = wx.PySimpleApp(clearSigInt=False)
00147 rospy.init_node('dispatcher_gui', anonymous=True)
00148
00149 frame = MainWindow(argv[1])
00150 frame.Show()
00151
00152 print 'dispatcher_gui started'
00153
00154 try:
00155 app.MainLoop()
00156 except KeyboardInterrupt, e:
00157 pass
00158 print 'exiting'