dbw_mkz_gui.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 
3 import rospy
4 import os
5 import rospkg
6 
7 from qt_gui.plugin import Plugin
8 from python_qt_binding.QtGui import QWidget
9 from python_qt_binding import loadUi
10 from rospy.topics import Publisher, Subscriber
11 from rospy.timer import Timer
12 from PyQt4.Qt import QTimer, QGraphicsScene, QBrush, QImage, QPixmap, QPalette, QColor
13 from std_msgs.msg import Float64, Bool, Empty
14 from dbw_mkz_msgs.msg import ThrottleCmd, ThrottleReport, BrakeCmd, BrakeReport, SteeringCmd, SteeringReport, GearCmd, GearReport
15 import std_msgs
16 from dbw_mkz_msgs.msg._Misc1Report import Misc1Report
17 from dbw_mkz_msgs.msg._TirePressureReport import TirePressureReport
18 from dbw_mkz_msgs.msg._FuelLevelReport import FuelLevelReport
19 from sensor_msgs.msg._NavSatFix import NavSatFix
20 import math
21 from sensor_msgs.msg._Imu import Imu
22 
23 class MkzGui(Plugin):
24 
25  package_name = 'dbw_mkz_gui' # Name of ROS package
26  ui_filename = 'dbw_mkz_gui.ui' # filename of the QT gui resource
27  gui_object_name = 'MkzGui' # runtime name of the GUI plugin
28  update_period = 100 # GUI update period in ms
29 
30  def __init__(self, context):
31  self.initVariables()
32  self.setupWidget(context)
33  self.initGraphics()
34  self.bindCallbacks()
35  self.subscribeTopics()
36  self.advertiseTopics()
37 
38  def initVariables(self):
39  self.rad_to_deg = 57.295779515
40 
41  # DBW reported values
43  self.reported_brake = 0
44  self.reported_boo = False
46  self.reported_gear = '--'
47 
48  # DBW commands
49  self.throttle_cmd = 0
50  self.brake_cmd = 0
51  self.steering_cmd = 0
52 
53  # Steering wheel button states
54  self.on_off_btn = False
55  self.res_cncl_btn = False
56  self.set_inc_btn = False
57  self.set_dec_btn = False
58  self.gap_inc_btn = False
59  self.gap_dec_btn = False
60  self.la_on_off_btn = False
61 
62  # Message RX status
63  self.throttle_stamp = rospy.Time()
64  self.brake_stamp = rospy.Time()
65  self.steering_stamp = rospy.Time()
66  self.gear_stamp = rospy.Time()
67  self.misc_stamp = rospy.Time()
68 
69  # Vehicle data labels
70  self.gps_lat = 0
71  self.gps_lon = 0
72  self.speed = 0
73  self.fl_tire = 0
74  self.fr_tire = 0
75  self.rl_tire = 0
76  self.rr_tire = 0
77  self.yaw_rate = 0
78  self.roll_rate = 0
79  self.fuel = 0
80 
81  # Report gear name map
82  self.gear_map = []
83  self.gear_map.append('None')
84  self.gear_map.append('Park')
85  self.gear_map.append('Reverse')
86  self.gear_map.append('Neutral')
87  self.gear_map.append('Drive')
88  self.gear_map.append('Low')
89 
90  # Throttle faults
91  self.throttle_driver = False
92  self.throttle_flt1 = False
93  self.throttle_flt2 = False
94  self.throttle_fltcon = False
95 
96  # Brake faults
97  self.brake_driver = False
98  self.brake_flt1 = False
99  self.brake_flt2 = False
100  self.brake_fltboo = False
101  self.brake_fltcon = False
102 
103  # Steering faults
104  self.steering_driver = False
105  self.steering_flt1 = False
106  self.steering_flt2 = False
107  self.steering_fltcon = False
108 
109  # Gear faults
110  self.gear_driver = False
111  self.gear_fltbus = False
112 
113  def updateGuiCallback(self):
114  current_time = rospy.Time.now()
115 
116  # DBW system commands and reports
117  self._widget.throttle_report_lbl.setText(str(self.reported_throttle))
118  self._widget.brake_report_lbl.setText(str(self.reported_brake))
119  self._widget.steering_report_lbl.setText(str(self.reported_steering))
120  self._widget.gear_report_lbl.setText(self.reported_gear)
121 
122  self._widget.throttle_cmd_lbl.setText(str(self.throttle_cmd))
123  self._widget.brake_cmd_lbl.setText(str(self.brake_cmd))
124  self._widget.steering_cmd_lbl.setText(str(self.steering_cmd))
125 
126  # Steering wheel buttons
127  if (current_time - self.misc_stamp) < rospy.Duration(0.25):
128  if self.res_cncl_btn:
129  self._widget.res_cncl_led.setPalette(self.green_palette)
130  else:
131  self._widget.res_cncl_led.setPalette(self.red_palette)
132 
133  if self.on_off_btn:
134  self._widget.on_off_led.setPalette(self.green_palette)
135  else:
136  self._widget.on_off_led.setPalette(self.red_palette)
137 
138  if self.set_inc_btn:
139  self._widget.set_inc_led.setPalette(self.green_palette)
140  else:
141  self._widget.set_inc_led.setPalette(self.red_palette)
142 
143  if self.set_dec_btn:
144  self._widget.set_dec_led.setPalette(self.green_palette)
145  else:
146  self._widget.set_dec_led.setPalette(self.red_palette)
147 
148  if self.gap_inc_btn:
149  self._widget.gap_inc_led.setPalette(self.green_palette)
150  else:
151  self._widget.gap_inc_led.setPalette(self.red_palette)
152 
153  if self.gap_dec_btn:
154  self._widget.gap_dec_led.setPalette(self.green_palette)
155  else:
156  self._widget.gap_dec_led.setPalette(self.red_palette)
157 
158  if self.la_on_off_btn:
159  self._widget.la_on_off_led.setPalette(self.green_palette)
160  else:
161  self._widget.la_on_off_led.setPalette(self.red_palette)
162  else:
163  self._widget.on_off_led.setPalette(self.gray_palette)
164  self._widget.res_cncl_led.setPalette(self.gray_palette)
165  self._widget.set_inc_led.setPalette(self.gray_palette)
166  self._widget.set_dec_led.setPalette(self.gray_palette)
167  self._widget.gap_inc_led.setPalette(self.gray_palette)
168  self._widget.gap_dec_led.setPalette(self.gray_palette)
169  self._widget.la_on_off_led.setPalette(self.gray_palette)
170 
171  # Report RX status LEDs
172  if (current_time - self.throttle_stamp) < rospy.Duration(0.25):
173  self._widget.throttle_led.setPalette(self.green_palette)
174  else:
175  self._widget.throttle_led.setPalette(self.red_palette)
176 
177  if (current_time - self.brake_stamp) < rospy.Duration(0.25):
178  self._widget.brake_led.setPalette(self.green_palette)
179  else:
180  self._widget.brake_led.setPalette(self.red_palette)
181 
182  if (current_time - self.steering_stamp) < rospy.Duration(0.25):
183  self._widget.steering_led.setPalette(self.green_palette)
184  else:
185  self._widget.steering_led.setPalette(self.red_palette)
186 
187  if (current_time - self.gear_stamp) < rospy.Duration(0.25):
188  self._widget.gear_led.setPalette(self.green_palette)
189  else:
190  self._widget.gear_led.setPalette(self.red_palette)
191 
192  # Throttle faults
193  if (current_time - self.throttle_stamp) < rospy.Duration(0.25):
194  if self.throttle_driver:
195  self._widget.throttle_driver_led.setPalette(self.yellow_palette)
196  else:
197  self._widget.throttle_driver_led.setPalette(self.green_palette)
198 
199  if self.throttle_flt1:
200  self._widget.throttle_flt1_led.setPalette(self.red_palette)
201  else:
202  self._widget.throttle_flt1_led.setPalette(self.green_palette)
203 
204  if self.throttle_flt2:
205  self._widget.throttle_flt2_led.setPalette(self.red_palette)
206  else:
207  self._widget.throttle_flt2_led.setPalette(self.green_palette)
208 
209  if self.throttle_fltcon:
210  self._widget.throttle_fltcon_led.setPalette(self.red_palette)
211  else:
212  self._widget.throttle_fltcon_led.setPalette(self.green_palette)
213  else:
214  self._widget.throttle_driver_led.setPalette(self.gray_palette)
215  self._widget.throttle_flt1_led.setPalette(self.gray_palette)
216  self._widget.throttle_flt2_led.setPalette(self.gray_palette)
217  self._widget.throttle_fltcon_led.setPalette(self.gray_palette)
218 
219  # Brake faults
220  if (current_time - self.brake_stamp) < rospy.Duration(0.25):
221  if self.brake_driver:
222  self._widget.brake_driver_led.setPalette(self.yellow_palette)
223  else:
224  self._widget.brake_driver_led.setPalette(self.green_palette)
225 
226  if self.brake_flt1:
227  self._widget.brake_flt1_led.setPalette(self.red_palette)
228  else:
229  self._widget.brake_flt1_led.setPalette(self.green_palette)
230 
231  if self.brake_flt2:
232  self._widget.brake_flt2_led.setPalette(self.red_palette)
233  else:
234  self._widget.brake_flt2_led.setPalette(self.green_palette)
235 
236  if self.brake_fltcon:
237  self._widget.brake_fltcon_led.setPalette(self.red_palette)
238  else:
239  self._widget.brake_fltcon_led.setPalette(self.green_palette)
240 
241  if self.brake_fltboo:
242  self._widget.brake_fltb_led.setPalette(self.red_palette)
243  else:
244  self._widget.brake_fltb_led.setPalette(self.green_palette)
245  else:
246  self._widget.brake_driver_led.setPalette(self.gray_palette)
247  self._widget.brake_flt1_led.setPalette(self.gray_palette)
248  self._widget.brake_flt2_led.setPalette(self.gray_palette)
249  self._widget.brake_fltcon_led.setPalette(self.gray_palette)
250  self._widget.brake_fltb_led.setPalette(self.gray_palette)
251 
252  # Steering faults
253  if (current_time - self.steering_stamp) < rospy.Duration(0.25):
254  if self.steering_driver:
255  self._widget.steering_driver_led.setPalette(self.yellow_palette)
256  else:
257  self._widget.steering_driver_led.setPalette(self.green_palette)
258 
259  if self.steering_flt1:
260  self._widget.steering_flt1_led.setPalette(self.red_palette)
261  else:
262  self._widget.steering_flt1_led.setPalette(self.green_palette)
263 
264  if self.steering_flt2:
265  self._widget.steering_flt2_led.setPalette(self.red_palette)
266  else:
267  self._widget.steering_flt2_led.setPalette(self.green_palette)
268 
269  if self.steering_fltcon:
270  self._widget.steering_fltcon_led.setPalette(self.red_palette)
271  else:
272  self._widget.steering_flt2_led.setPalette(self.green_palette)
273  else:
274  self._widget.steering_driver_led.setPalette(self.gray_palette)
275  self._widget.steering_flt1_led.setPalette(self.gray_palette)
276  self._widget.steering_flt2_led.setPalette(self.gray_palette)
277  self._widget.steering_fltcon_led.setPalette(self.gray_palette)
278 
279  # Gear faults
280  if (current_time - self.gear_stamp) < rospy.Duration(0.25):
281  if self.gear_driver:
282  self._widget.gear_driver_led.setPalette(self.yellow_palette)
283  else:
284  self._widget.gear_driver_led.setPalette(self.green_palette)
285 
286  if self.gear_fltbus:
287  self._widget.gear_fltbus_led.setPalette(self.red_palette)
288  else:
289  self._widget.gear_fltbus_led.setPalette(self.green_palette)
290  else:
291  self._widget.gear_driver_led.setPalette(self.gray_palette)
292  self._widget.gear_fltbus_led.setPalette(self.gray_palette)
293 
294  # Vehicle data labels
295  self._widget.lat_lbl.setText(str(self.gps_lat))
296  self._widget.lon_lbl.setText(str(self.gps_lon))
297  self._widget.speed_lbl.setText(str(self.speed) + ' m/s')
298  self._widget.fl_pressure_lbl.setText(str(self.fl_tire))
299  self._widget.fr_pressure_lbl.setText(str(self.fr_tire))
300  self._widget.rl_pressure_lbl.setText(str(self.rl_tire))
301  self._widget.rr_pressure_lbl.setText(str(self.rr_tire))
302  self._widget.yaw_rate_lbl.setText(str(self.yaw_rate) + ' rad/s')
303  self._widget.roll_rate_lbl.setText(str(self.roll_rate) + ' rad/s')
304  self._widget.fuel_lbl.setText(str(self.fuel) + ' %')
305 
306  if self.reported_boo:
307  self._widget.boo_led.setPalette(self.red_palette)
308  else:
309  self._widget.boo_led.setPalette(self.gray_palette)
310 
311  # Steering wheel buttons
312  if self.on_off_btn:
313  self._widget.on_off_led.setPalette(self.green_palette)
314  else:
315  self._widget.on_off_led.setPalette(self.gray_palette)
316 
317  if self.res_cncl_btn:
318  self._widget.res_cncl_led.setPalette(self.green_palette)
319  else:
320  self._widget.res_cncl_led.setPalette(self.gray_palette)
321 
322  if self.set_inc_btn:
323  self._widget.set_inc_led.setPalette(self.green_palette)
324  else:
325  self._widget.set_inc_led.setPalette(self.gray_palette)
326 
327  if self.set_dec_btn:
328  self._widget.set_dec_led.setPalette(self.green_palette)
329  else:
330  self._widget.set_dec_led.setPalette(self.gray_palette)
331 
332  if self.gap_inc_btn:
333  self._widget.gap_inc_led.setPalette(self.green_palette)
334  else:
335  self._widget.gap_inc_led.setPalette(self.gray_palette)
336 
337  if self.gap_dec_btn:
338  self._widget.gap_dec_led.setPalette(self.green_palette)
339  else:
340  self._widget.gap_dec_led.setPalette(self.gray_palette)
341 
342  if self.la_on_off_btn:
343  self._widget.la_on_off_led.setPalette(self.green_palette)
344  else:
345  self._widget.la_on_off_led.setPalette(self.gray_palette)
346 
347  def initGraphics(self):
348 
349  # LED color palettes
350  self.green_palette = QPalette()
351  self.green_palette.setColor(QPalette.Window, QColor(0,255,0))
352 
353  self.red_palette = QPalette()
354  self.red_palette.setColor(QPalette.Window, QColor(255,0,0))
355 
356  self.yellow_palette = QPalette()
357  self.yellow_palette.setColor(QPalette.Window, QColor(200, 200, 50))
358 
359  self.gray_palette = QPalette()
360  self.gray_palette.setColor(QPalette.Window, QColor(80, 80, 80))
361 
362  # CAN RX LEDs
363  self._widget.throttle_led.setText('')
364  self._widget.throttle_led.setPalette(self.red_palette)
365  self._widget.brake_led.setText('')
366  self._widget.brake_led.setPalette(self.red_palette)
367  self._widget.steering_led.setText('')
368  self._widget.steering_led.setPalette(self.red_palette)
369  self._widget.gear_led.setText('')
370  self._widget.gear_led.setPalette(self.red_palette)
371 
372  # BOO LED
373  self._widget.boo_led.setText('')
374  self._widget.boo_led.setPalette(self.gray_palette)
375 
376  # Fault and driver override LEDs
377  self._widget.throttle_driver_led.setText('')
378  self._widget.throttle_driver_led.setPalette(self.gray_palette)
379  self._widget.throttle_flt1_led.setText('')
380  self._widget.throttle_flt1_led.setPalette(self.gray_palette)
381  self._widget.throttle_flt2_led.setText('')
382  self._widget.throttle_flt2_led.setPalette(self.gray_palette)
383  self._widget.throttle_fltcon_led.setText('')
384  self._widget.throttle_fltcon_led.setPalette(self.gray_palette)
385 
386  self._widget.brake_driver_led.setText('')
387  self._widget.brake_driver_led.setPalette(self.gray_palette)
388  self._widget.brake_flt1_led.setText('')
389  self._widget.brake_flt1_led.setPalette(self.gray_palette)
390  self._widget.brake_flt2_led.setText('')
391  self._widget.brake_flt2_led.setPalette(self.gray_palette)
392  self._widget.brake_fltcon_led.setText('')
393  self._widget.brake_fltcon_led.setPalette(self.gray_palette)
394  self._widget.brake_fltb_led.setText('')
395  self._widget.brake_fltb_led.setPalette(self.gray_palette)
396 
397  self._widget.steering_driver_led.setText('')
398  self._widget.steering_flt1_led.setText('')
399  self._widget.steering_flt2_led.setText('')
400  self._widget.steering_fltcon_led.setText('')
401 
402  self._widget.gear_driver_led.setText('')
403  self._widget.gear_fltbus_led.setText('')
404 
405  # Steering wheel buttons
406  self._widget.on_off_led.setText('')
407  self._widget.on_off_led.setPalette(self.gray_palette)
408  self._widget.res_cncl_led.setText('')
409  self._widget.res_cncl_led.setPalette(self.gray_palette)
410  self._widget.set_inc_led.setText('')
411  self._widget.set_inc_led.setPalette(self.gray_palette)
412  self._widget.set_dec_led.setText('')
413  self._widget.set_dec_led.setPalette(self.gray_palette)
414  self._widget.gap_inc_led.setText('')
415  self._widget.gap_inc_led.setPalette(self.gray_palette)
416  self._widget.gap_dec_led.setText('')
417  self._widget.gap_dec_led.setPalette(self.gray_palette)
418  self._widget.la_on_off_led.setText('')
419  self._widget.la_on_off_led.setPalette(self.gray_palette)
420 
421  def bindCallbacks(self):
422  pass
423 
424  def subscribeTopics(self):
425  rospy.Subscriber('vehicle/throttle_report', ThrottleReport, self.recvThrottleReport)
426  rospy.Subscriber('vehicle/brake_report', BrakeReport, self.recvBrakeReport)
427  rospy.Subscriber('vehicle/steering_report', SteeringReport, self.recvSteeringReport)
428  rospy.Subscriber('vehicle/gear_report', GearReport, self.recvGearReport)
429  rospy.Subscriber('vehicle/misc1_report', Misc1Report, self.recvMisc1Report)
430  rospy.Subscriber('vehicle/tire_pressure_report', TirePressureReport, self.recvTirePressure)
431  rospy.Subscriber('vehicle/fuel_level_report', FuelLevelReport, self.recvFuelLevel)
432  rospy.Subscriber('vehicle/gps/fix', NavSatFix, self.recvGps)
433  rospy.Subscriber('vehicle/imu/data_raw', Imu, self.recvImu)
434 
435  def recvImu(self, msg):
436  self.yaw_rate = 1e-2 * math.floor(1e2 * msg.angular_velocity.z)
437  self.roll_rate = 1e-2 * math.floor(1e2 * msg.angular_velocity.x)
438 
439  def recvGps(self, msg):
440  self.gps_lat = 1e-6 * math.floor(1e6 * msg.latitude)
441  self.gps_lon = 1e-6 * math.floor(1e6 * msg.longitude)
442 
443  def recvThrottleReport(self, msg):
444  self.throttle_stamp = rospy.Time.now()
445  self.reported_throttle = int(math.floor(100 * msg.pedal_output))
446  self.throttle_cmd = int(math.floor(100 * msg.pedal_cmd))
447 
448  self.throttle_driver = msg.driver
449  self.throttle_flt1 = msg.fault_ch1
450  self.throttle_flt2 = msg.fault_ch2
451  self.throttle_fltcon = msg.fault_connector
452 
453  def recvBrakeReport(self, msg):
454  self.brake_stamp = rospy.Time.now()
455  self.reported_brake = int(math.floor(100 * msg.pedal_output))
456  self.brake_cmd = int(math.floor(100 * msg.pedal_cmd))
457  self.reported_boo = msg.boo_output
458 
459  self.brake_driver = msg.driver
460  self.brake_flt1 = msg.fault_ch1
461  self.brake_flt2 = msg.fault_ch2
462  self.brake_fltboo = msg.fault_boo
463  self.brake_fltcon = msg.fault_connector
464 
465  def recvSteeringReport(self, msg):
466  self.steering_stamp = rospy.Time.now()
467  self.speed = 0.1 * math.floor(10 * msg.speed)
468  self.reported_steering = 0.1 * math.floor(self.rad_to_deg * 10 * msg.steering_wheel_angle)
469  self.steering_cmd = 0.1 * math.floor(self.rad_to_deg * 10 * msg.steering_wheel_angle_cmd)
470 
471  self.steering_driver = msg.driver
472  self.steering_flt1 = msg.fault_bus1
473  self.steering_flt2 = msg.fault_bus2
474  self.steering_fltcon = msg.fault_connector
475 
476  def recvGearReport(self, msg):
477  self.gear_stamp = rospy.Time.now()
478  self.reported_gear = self.gear_map[msg.state.gear]
479 
480  self.gear_driver = msg.driver
481  self.gear_fltbus = msg.fault_bus
482 
483  def recvMisc1Report(self, msg):
484  self.on_off_btn = msg.btn_cc_on_off
485  self.res_cncl_btn = msg.btn_cc_res_cncl
486  self.set_inc_btn = msg.btn_cc_set_inc
487  self.set_inc_btn = msg.btn_cc_set_dec
488  self.set_inc_btn = msg.btn_cc_gap_inc
489  self.set_inc_btn = msg.btn_cc_gap_dec
490  self.set_inc_btn = msg.btn_la_on_off
491 
492  def advertiseTopics(self):
493  pass
494 
495  def recvTirePressure(self, msg):
496  self.fl_tire = msg.front_left
497  self.fr_tire = msg.front_right
498  self.rl_tire = msg.rear_left
499  self.rr_tire = msg.rear_right
500 
501  def recvFuelLevel(self, msg):
502  self.fuel = 0.1 * math.floor(10 * msg.fuel_level)
503 
504  def setupWidget(self, context):
505  super(MkzGui, self).__init__(context)
506  # Give QObjects reasonable names
507  self.setObjectName(self.gui_object_name)
508 
509  # Create QWidget
510  self._widget = QWidget()
511 
512  # Get path to UI file which should be in the "resource" folder of this package
513  ui_file = os.path.join(rospkg.RosPack().get_path(self.package_name), 'resource', self.ui_filename)
514  # Extend the widget with all attributes and children from UI file
515  loadUi(ui_file, self._widget)
516  # Give QObjects reasonable names
517  self._widget.setObjectName(self.gui_object_name)
518  # Add widget to the user interface
519  context.add_widget(self._widget)
520 
521  # Set up a timer to update the GUI
522  update_timer = QTimer(self._widget)
523  update_timer.setInterval(self.update_period);
524  update_timer.setSingleShot(False);
525  update_timer.timeout.connect(lambda: self.updateGuiCallback())
526  update_timer.start()
527 
528  def shutdown_plugin(self):
529  pass
530 
def __init__(self, context)
Definition: dbw_mkz_gui.py:30
def recvSteeringReport(self, msg)
Definition: dbw_mkz_gui.py:465
def setupWidget(self, context)
Definition: dbw_mkz_gui.py:504
def recvThrottleReport(self, msg)
Definition: dbw_mkz_gui.py:443


dbw_mkz_gui
Author(s):
autogenerated on Thu Mar 23 2017 03:47:45