Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 import roslib
00039 from diagnostic_msgs.msg import DiagnosticArray, DiagnosticStatus
00040
00041 from nao_msgs.msg import BodyPoseAction, BodyPoseGoal
00042 import actionlib
00043
00044 import rospy
00045 from rosgraph import rosenv
00046
00047 from .status_control import StatusControl
00048 from .power_state_control import PowerStateControl
00049 from .motors import Motors
00050 from .avahi import AvahiWidget
00051
00052 from rqt_robot_dashboard.dashboard import Dashboard
00053 from rqt_robot_dashboard.monitor_dash_widget import MonitorDashWidget
00054 from rqt_robot_dashboard.console_dash_widget import ConsoleDashWidget
00055
00056 class NAODashboard(Dashboard):
00057
00058 def setup(self, context):
00059 self.name = 'NAO Dashboard (%s)'%rosenv.get_master_uri()
00060
00061 self._robot_combobox = AvahiWidget()
00062
00063
00064 self._monitor = MonitorDashWidget(self.context)
00065
00066
00067 self._console = ConsoleDashWidget(self.context, minimal=False)
00068
00069
00070 self._temp_joint_button = StatusControl('Joint temperature', 'temperature_joints')
00071
00072
00073 self._temp_head_button = StatusControl('CPU temperature', 'temperature_head')
00074
00075
00076 self._motors_button = Motors(self.context)
00077
00078
00079 self._power_state_ctrl = PowerStateControl('NAO Battery')
00080
00081 self._agg_sub = rospy.Subscriber('diagnostics_agg', DiagnosticArray, self.new_diagnostic_message)
00082
00083 def get_widgets(self):
00084 return [ [self._robot_combobox],
00085 [self._monitor, self._console, self._temp_joint_button, self._temp_head_button,
00086 self._motors_button],
00087 [self._power_state_ctrl]
00088 ]
00089
00090 def shutdown_dashboard(self):
00091 self._agg_sub.unregister()
00092
00093 def new_diagnostic_message(self, msg):
00094 """
00095 callback to process dashboard_agg messages
00096
00097 :param msg: dashboard_agg DashboardState message
00098 :type msg: pr2_msgs.msg.DashboardState
00099 """
00100 self._dashboard_message = msg
00101 for status in msg.status:
00102 if status.name == '/Nao/Joints':
00103 highestTemp = ""
00104 lowestStiff = -1.0
00105 highestStiff = -1.0
00106 hotJoints = ""
00107 for kv in status.values:
00108 if kv.key == 'Highest Temperature':
00109 highestTemp = " (" + kv.value + "deg C)"
00110 elif kv.key == 'Highest Stiffness':
00111 highestStiff = float(kv.value)
00112 elif kv.key == 'Lowest Stiffness without Hands':
00113 lowestStiff = float(kv.value)
00114 elif kv.key == 'Hot Joints':
00115 hotJoints = str(kv.value)
00116 self.set_buttonStatus(self._temp_joint_button, status, "Joints: ", "%s %s"%(highestTemp, hotJoints))
00117 if(lowestStiff < 0.0 or highestStiff < 0.0):
00118 self._motors_button.set_stale()
00119 elif(lowestStiff > 0.9):
00120 self._motors_button.set_error()
00121 elif(highestStiff < 0.05):
00122 self._motors_button.set_ok()
00123 else:
00124 self._motors_button.set_warn()
00125 elif status.name == '/Nao/CPU':
00126 self.set_buttonStatus(self._temp_head_button, status, "CPU temperature: ")
00127 elif status.name == '/Nao/Battery/Battery':
00128 if status.level == 3:
00129 self._power_state_ctrl.set_stale()
00130 else:
00131 self._power_state_ctrl.set_power_state(status.values)
00132
00133 def set_buttonStatus(self, button, status, statusPrefix = "", statusSuffix = ""):
00134 statusString = "Unknown"
00135 if status.level == DiagnosticStatus.OK:
00136 button.update_state(0)
00137 statusString = "OK"
00138 elif status.level == DiagnosticStatus.WARN:
00139 button.update_state(1)
00140 statusString = "Warn"
00141 elif status.level == DiagnosticStatus.ERROR:
00142 button.update_state(2)
00143 statusString = "Error"
00144 elif status.level == 3:
00145 button.update_state(3)
00146 statusString = "Stale"
00147 button.setToolTip(statusPrefix + statusString + statusSuffix)
00148
00149 def save_settings(self, plugin_settings, instance_settings):
00150 self._console.save_settings(plugin_settings, instance_settings)
00151 self._monitor.save_settings(plugin_settings, instance_settings)
00152
00153 def restore_settings(self, plugin_settings, instance_settings):
00154 self._console.restore_settings(plugin_settings, instance_settings)
00155 self._monitor.restore_settings(plugin_settings, instance_settings)