diff --git a/software/ros_packages/ground_station/src/Framework/MapSystems/RoverMap.py b/software/ros_packages/ground_station/src/Framework/MapSystems/RoverMap.py index eca806f..d3b4975 100644 --- a/software/ros_packages/ground_station/src/Framework/MapSystems/RoverMap.py +++ b/software/ros_packages/ground_station/src/Framework/MapSystems/RoverMap.py @@ -349,6 +349,7 @@ class OverlayImage(object): self.height = height self.big_image = None self.display_image = None + self.indicator = None self.helper = MapHelper.MapHelper() x, y = self._get_cartesian(latitude, longitude) @@ -370,6 +371,7 @@ class OverlayImage(object): True) self.display_image = self.helper.new_image(self.width, self.height, True) + self.generate_dot_and_hat() def _get_cartesian(self, lat, lon): """ @@ -403,30 +405,38 @@ class OverlayImage(object): return int(x), int(y) - def update_new_location(self, latitude, longitude, compass): - self._draw_rover(latitude, longitude, 10, compass) + def update_new_location(self, latitude, longitude, + compass, navigation_list, landmark_list): + size = 5 + draw = PIL.ImageDraw.Draw(self.big_image) + for element in navigation_list: + x, y = self._get_cartesian(element[1], element[2]) + draw.ellipsis((x-size, y-size, x+size, y+size), fill="red") + for element in navigation_list: + x, y = self._get_cartesian(element[1], element[2]) + draw.ellipsis((x-size, y-size, x+size, y+size), fill="blue") + self._draw_rover(latitude, longitude, compass) self.update() return self.display_image - def _draw_rover(self, lat, lon, size, scaler): + def generate_dot_and_hat(self): + self.indicator = self.helper.new_image(100, 100, True) + draw = PIL.ImageDraw.Draw(self.indicator) + draw.ellipse((50-12, 50-12, 50+12, 50+12), fill="red") + draw.line((25, 40, 50, 12), fill="red", width=7) + draw.line((50, 12, 75, 40), fill="red", width=7) + + def _draw_rover(self, lat, lon, angle=0): x, y = self._get_cartesian(lat, lon) - draw = PIL.ImageDraw.Draw(self.big_image) - draw.ellipse((x-size, y-size, x+size, y+size), fill="red") - point_1 = tuple((math.cos(x-2*size * scaler), math.sin(y * scaler))) - point_2 = tuple((math.cos(x * scaler), math.sin(y+2*size * scaler))) - point_3 = (math.cos(x+2*size * scaler), math.sin(y * scaler)) - draw.line( - (point_1, - point_2), - fill="red", - width=600) - draw.line( - (point_2, - point_3), - fill="red", - width=600) - self.display_image.save("Something.png") + # Center of the circle on the indicator is (12.5, 37.5) + x = x - 50 + y = y - 50 + rotated = self.indicator.copy() + rotated = rotated.rotate(angle, expand=True) + self.display_image.paste(self.indicator, (x, y)) + # self.display_image.save("Something.png") def update(self): self.display_image.paste(self.big_image, (-self.left_x, -self.upper_y)) + diff --git a/software/ros_packages/ground_station/src/Framework/MapSystems/RoverMapCoordinator.py b/software/ros_packages/ground_station/src/Framework/MapSystems/RoverMapCoordinator.py index f6e52a2..54ea45d 100644 --- a/software/ros_packages/ground_station/src/Framework/MapSystems/RoverMapCoordinator.py +++ b/software/ros_packages/ground_station/src/Framework/MapSystems/RoverMapCoordinator.py @@ -21,6 +21,7 @@ import RoverMap class RoverMapCoordinator(QtCore.QThread): pixmap_ready_signal = QtCore.pyqtSignal() + change_waypoint_signal = QtCore.pyqtSignal() def __init__(self, shared_objects): super(RoverMapCoordinator, self).__init__() @@ -28,6 +29,8 @@ class RoverMapCoordinator(QtCore.QThread): self.shared_objects = shared_objects self.left_screen = self.shared_objects["screens"]["left_screen"] self.mapping_label = self.left_screen.mapping_label + self.navigation_label = self.left_screen.tableWidget + self.landmark_label = self.left_screen.tableWidget_2 self.setings = QtCore.QSettings() @@ -84,9 +87,18 @@ class RoverMapCoordinator(QtCore.QThread): def _get_map_image(self): while self.map_image is None: self.map_image = self.google_maps_object.display_image - self.overlay_image_object.update_new_location(44.567161,-123.278432, .7) - self.map_image.paste(self.overlay_image_object.display_image, (0,0), self.overlay_image_object.display_image) - # self.map_image = Image.alpha_composite(self.google_maps_object.display_image, self.overlay_image_object.display_image) + # self.overlay_image_object.update_new_location(44.567161, + # -123.278432, + # .7, + # [], + # []) + self.update_overlay() + self.map_image.paste(self.overlay_image_object.display_image, + (0, 0), + self.overlay_image_object.display_image) + # self.map_image = Image.alpha_composite( + # self.google_maps_object.display_image, + # self.overlay_image_object.display_image) # get overlay here qim = ImageQt(self.map_image) self.map_pixmap = QtGui.QPixmap.fromImage(qim) @@ -94,6 +106,7 @@ class RoverMapCoordinator(QtCore.QThread): def connect_signals_and_slots(self): self.pixmap_ready_signal.connect(self.pixmap_ready__slot) + self.change_waypoint_signal.connect(self.update_overlay) def on_kill_threads_requested_slot(self): self.run_thread_flag = False @@ -106,3 +119,23 @@ class RoverMapCoordinator(QtCore.QThread): def pixmap_ready__slot(self): self.mapping_label.setPixmap(self.map_pixmap) + + def _get_table_elements(self, UI_element): + temp_list = [] + count = UI_element.rowCount() + for row in range(0, count): + num = UI_element.item(row, 0) + lat = UI_element.cellWidget(row, 1) + lng = UI_element.cellWidget(row, 2) + temp_tuple = (num, lat, lng) + temp_list.append(temp_tuple) + return temp_list + + def update_overlay(self): + navigation_list = self._get_table_elements(self.navigation_label) + landmark_list = self._get_table_elements(self.landmark_label) + self.overlay_image_object.update_new_location(self.latitude, + self.longitude, + 70, + navigation_list, + landmark_list) diff --git a/software/ros_packages/ground_station/src/Framework/StatusSystems/StatusCore.py b/software/ros_packages/ground_station/src/Framework/StatusSystems/StatusCore.py index 38e65ac..579676f 100644 --- a/software/ros_packages/ground_station/src/Framework/StatusSystems/StatusCore.py +++ b/software/ros_packages/ground_station/src/Framework/StatusSystems/StatusCore.py @@ -17,8 +17,29 @@ MISC_TOPIC_NAME = "/rover_status/misc_status" class SensorCore(QtCore.QThread): + # ########## create signals for slots ########## jetson_cpu_update_ready__signal = QtCore.pyqtSignal(str) jetson_cpu_stylesheet_change_ready__signal = QtCore.pyqtSignal(str) + jetson_emmc_update_ready__signal = QtCore.pyqtSignal(str) + jetson_emmc_stylesheet_change_ready__signal = QtCore.pyqtSignal(str) + jetson_gpu_temp_update_ready__signal = QtCore.pyqtSignal(str) + jetson_gpu_temp_stylesheet_change_ready__signal = QtCore.pyqtSignal(str) + jetson_ram_update_ready__signal = QtCore.pyqtSignal(str) + jetson_ram_stylesheet_change_ready__signal = QtCore.pyqtSignal(str) + + bogie_connection_1_stylesheet_change_ready__signal = QtCore.pyqtSignal(str) + bogie_connection_2_stylesheet_change_ready__signal = QtCore.pyqtSignal(str) + bogie_connection_3_stylesheet_change_ready__signal = QtCore.pyqtSignal(str) + + camera_zed_stylesheet_change_ready__signal = QtCore.pyqtSignal(str) + camera_under_stylesheet_change_ready__signal = QtCore.pyqtSignal(str) + camera_chassis_stylesheet_change_ready__signal = QtCore.pyqtSignal(str) + camera_main_stylesheet_change_ready__signal = QtCore.pyqtSignal(str) + + gps_stylesheet_change_ready__signal = QtCore.pyqtSignal(str) + + frsky_stylesheet_change_ready__signal = QtCore.pyqtSignal(str) + def __init__(self, shared_objects): super(SensorCore, self).__init__() @@ -32,6 +53,7 @@ class SensorCore(QtCore.QThread): self.cpu_read = self.screen_main_window.lineEdit # type: QtWidgets.QLabel self.ram_read = self.screen_main_window.lineEdit_2 # type: QtWidgets.QLabel + # ########## set vars to gui elements self.rover_conn = self.screen_main_window.rover # type: QtWidgets.QLabel self.frsky = self.screen_main_window.frsky # type: QtWidgets.QLabel self.nav_mouse = self.screen_main_window.nav_mouse # type: QtWidgets.QLabel @@ -47,8 +69,10 @@ class SensorCore(QtCore.QThread): self.clock = self.screen_main_window.clock # type: QtWidgets.QLCDNumber self.cpu = self.screen_main_window.cpu # type: QtWidgets.QLabel self.ram = self.screen_main_window.ram # type: QtWidgets.QLabel + self.gpu_temp = self.screen_main_window.gpu_temp # type: QtWidgets.QLabel + self.emmc = self.screen_main_window.emmc # type: QtWidgets.QLabel - # Subscription examples on pulling data from system_statuses_node.py + # ########## subscriptions pulling data from system_statuses_node.py ########## self.camera_status = rospy.Subscriber(CAMERA_TOPIC_NAME, CameraStatuses, self.__camera_callback) self.bogie_status = rospy.Subscriber(BOGIE_TOPIC_NAME, BogieStatuses, self.__bogie_callback) self.frsky_status = rospy.Subscriber(FRSKY_TOPIC_NAME, FrSkyStatus, self.__frsky_callback) @@ -72,32 +96,40 @@ class SensorCore(QtCore.QThread): self.camera_msg.camera_main_navigation = data.camera_main_navigation if self.camera_msg.camera_zed is False: - self.zed.setStyleSheet("background-color: red;") + # self.zed.setStyleSheet("background-color: red;") + self.camera_zed_stylesheet_change_ready__signal.emit("background-color: darkred;") else: - self.zed.setStyleSheet("background-color: darkgreen;") + # self.zed.setStyleSheet("background-color: darkgreen;") + self.camera_zed_stylesheet_change_ready__signal.emit("background-color: darkgreen;") if self.camera_msg.camera_undercarriage is False: - self.under_cam.setStyleSheet("background-color: red;") + # self.under_cam.setStyleSheet("background-color: darkred;") + self.camera_under_stylesheet_change_ready__signal.emit("background-color: darkred;") else: - self.under_cam.setStyleSheet("background-color: darkgreen;") + # self.under_cam.setStyleSheet("background-color: darkgreen;") + self.camera_under_stylesheet_change_ready__signal.emit("background-color: darkgreen;") if self.camera_msg.camera_chassis is False: - self.chassis_cam.setStyleSheet("background-color: red;") + # self.chassis_cam.setStyleSheet("background-color: darkred;") + self.camera_chassis_stylesheet_change_ready__signal.emit("background-color: darkred;") else: - self.chassis_cam.setStyleSheet("background-color: darkgreen;") + # self.chassis_cam.setStyleSheet("background-color: darkgreen;") + self.camera_chassis_stylesheet_change_ready__signal.emit("background-color: darkgreen;") if self.camera_msg.camera_main_navigation is False: - self.main_cam.setStyleSheet("background-color: red;") + # self.main_cam.setStyleSheet("background-color: darkred;") + self.camera_main_stylesheet_change_ready__signal.emit("background-color: darkred;") else: - self.main_cam.setStyleSheet("background-color: darkgreen;") + # self.main_cam.setStyleSheet("background-color: darkgreen;") + self.camera_main_stylesheet_change_ready__signal.emit("background-color: darkgreen;") def __frsky_callback(self, data): self.FrSky_msg.FrSky_controller_connection_status = data.FrSky_controller_connection_status if self.FrSky_msg.FrSky_controller_connection_status is False: - self.frsky.setStyleSheet("background-color: red;") + self.frsky_stylesheet_change_ready__signal.emit("background-color: darkred;") else: - self.frsky.setStyleSheet("background-color: darkgreen;") + self.frsky_stylesheet_change_ready__signal.emit("background-color: darkgreen;") def __bogie_callback(self, data): self.bogie_msg.bogie_connection_1 = data.bogie_connection_1 @@ -105,19 +137,25 @@ class SensorCore(QtCore.QThread): self.bogie_msg.bogie_connection_3 = data.bogie_connection_3 if self.bogie_msg.bogie_connection_1 is False: - self.bogie_right.setStyleSheet("background-color: red;") + # self.bogie_right.setStyleSheet("background-color: darkred;") + self.bogie_connection_1_stylesheet_change_ready__signal.emit("background-color: darkred;") else: - self.bogie_right.setStyleSheet("background-color: darkgreen;") + # self.bogie_right.setStyleSheet("background-color: darkgreen;") + self.bogie_connection_1_stylesheet_change_ready__signal.emit("background-color: darkgreen;") if self.bogie_msg.bogie_connection_2 is False: - self.bogie_left.setStyleSheet("background-color: red;") + # self.bogie_left.setStyleSheet("background-color: darkred;") + self.bogie_connection_2_stylesheet_change_ready__signal.emit("background-color: darkred;") else: - self.bogie_left.setStyleSheet("background-color: darkgreen;") + # self.bogie_left.setStyleSheet("background-color: darkgreen;") + self.bogie_connection_2_stylesheet_change_ready__signal.emit("background-color: darkgreen;") if self.bogie_msg.bogie_connection_3 is False: - self.bogie_rear.setStyleSheet("background-color: red;") + # self.bogie_rear.setStyleSheet("background-color: darkred;") + self.bogie_connection_3_stylesheet_change_ready__signal.emit("background-color: darkred;") else: - self.bogie_rear.setStyleSheet("background-color: darkgreen;") + # self.bogie_rear.setStyleSheet("background-color: darkgreen;") + self.bogie_connection_3_stylesheet_change_ready__signal.emit("background-color: darkgreen;") def __jetson_callback(self, data): self.jetson_msg.jetson_CPU = data.jetson_CPU @@ -128,35 +166,48 @@ class SensorCore(QtCore.QThread): if self.jetson_msg.jetson_CPU > 79: self.jetson_cpu_stylesheet_change_ready__signal.emit("background-color: orange;") - # self.cpu.setStyleSheet("background-color: orange;") elif self.jetson_msg.jetson_CPU > 89: - self.jetson_cpu_stylesheet_change_ready__signal.emit("background-color: red;") - # self.cpu.setStyleSheet("background-color: red;") + self.jetson_cpu_stylesheet_change_ready__signal.emit("background-color: darkred;") else: self.jetson_cpu_stylesheet_change_ready__signal.emit("background-color: darkgreen;") - # self.cpu.setStyleSheet("background-color: darkgreen;") - # self.jetson_msg.jetson_RAM = data.jetson_RAM - # self.ram.setText(str(self.jetson_msg.jetson_RAM)) - # if self.jetson_msg.jetson_RAM > 79: - # self.ram.setStyleSheet("background-color: orange;") - # elif self.jetson_msg.jetson_RAM > 89: - # self.ram.setStyleSheet("background-color: red;") - # else: - # self.ram.setStyleSheet("background-color: darkgreen;") - # - # self.jetson_msg.jetson_EMMC = data.jetson_EMMC - # self.jetson_msg.jetson_NVME_SSD = data.jetson_NVME_SSD - #rospy.loginfo(self.jetson_msg) + self.jetson_ram_update_ready__signal.emit(str(self.jetson_msg.jetson_RAM)) + + if self.jetson_msg.jetson_RAM > 79: + self.jetson_ram_stylesheet_change_ready__signal.emit("background-color: orange;") + elif self.jetson_msg.jetson_RAM > 89: + self.jetson_ram_stylesheet_change_ready__signal.emit("background-color: darkred;") + else: + self.jetson_ram_stylesheet_change_ready__signal.emit("background-color: darkgreen;") + + self.jetson_gpu_temp_update_ready__signal.emit(str(self.jetson_msg.jetson_GPU_temp)) + + if self.jetson_msg.jetson_GPU_temp > 64: + self.jetson_gpu_temp_stylesheet_change_ready__signal.emit("background-color: orange;") + elif self.jetson_msg.jetson_GPU_temp > 79: + self.jetson_gpu_temp_stylesheet_change_ready__signal.emit("background-color: darkred;") + else: + self.jetson_gpu_temp_stylesheet_change_ready__signal.emit("background-color: darkgreen;") + + self.jetson_emmc_update_ready__signal.emit(str(self.jetson_msg.jetson_EMMC)) + + if self.jetson_msg.jetson_EMMC > 79: + self.jetson_emmc_stylesheet_change_ready__signal.emit("background-color: orange;") + elif self.jetson_msg.jetson_EMMC > 89: + self.jetson_emmc_stylesheet_change_ready__signal.emit("background-color: darkred;") + else: + self.jetson_emmc_stylesheet_change_ready__signal.emit("background-color: darkgreen") def __gps_callback(self, data): self.GPS_msg.UTC_GPS_time = data.UTC_GPS_time self.GPS_msg.GPS_connection_status = data.GPS_connection_status if self.GPS_msg.GPS_connection_status is False: - self.gps.setStyleSheet("background-color: red") + # self.gps.setStyleSheet("background-color: darkred") + self.gps_stylesheet_change_ready__signal.emit("background-color: darkred;") else: - self.gps.setStyleSheet("background-color: darkgreen;") + # self.gps.setStyleSheet("background-color: darkgreen;") + self.gps_stylesheet_change_ready__signal.emit("background-color: darkgreen;") def __misc_callback(self, data): self.misc_msg.arm_connection_status = data.arm_connection_status @@ -177,6 +228,21 @@ class SensorCore(QtCore.QThread): def connect_signals_and_slots(self): self.jetson_cpu_update_ready__signal.connect(self.cpu.setText) self.jetson_cpu_stylesheet_change_ready__signal.connect(self.cpu.setStyleSheet) + self.jetson_ram_update_ready__signal.connect(self.ram.setText) + self.jetson_ram_stylesheet_change_ready__signal(self.ram.setStyleSheet) + self.jetson_emmc_update_ready__signal.connect(self.emmc.setText) + self.jetson_emmc_stylesheet_change_ready__signal.connect(self.emmc.setStyleSheet) + self.jetson_gpu_temp_update_ready__signal.connect(self.gpu_temp.setText) + self.jetson_gpu_temp_stylesheet_change_ready__signal(self.gpu_temp.setStyleSheet) + self.bogie_connection_1_stylesheet_change_ready__signal.connect(self.bogie_right.setStyleSheet) + self.bogie_connection_2_stylesheet_change_ready__signal.connect(self.bogie_left.setStyleSheet) + self.bogie_connection_3_stylesheet_change_ready__signal.connect(self.bogie_rear.setStyleSheet) + self.camera_zed_stylesheet_change_ready__signal.connect(self.zed.setStyleSheet) + self.camera_under_stylesheet_change_ready__signal.connect(self.under_cam.setStyleSheet) + self.camera_chassis_stylesheet_change_ready__signal.connect(self.chassis_cam.setStyleSheet) + self.camera_main_stylesheet_change_ready__signal.connect(self.main_cam.setStyleSheet) + self.gps_stylesheet_change_ready__signal.connect(self.gps.setStyleSheet) + self.frsky_stylesheet_change_ready__signal.connect(self.frsky.setStyleSheet) def setup_signals(self, start_signal, signals_and_slots_signal, kill_signal): start_signal.connect(self.start) diff --git a/software/ros_packages/ground_station/src/Resources/Ui/left_screen.ui b/software/ros_packages/ground_station/src/Resources/Ui/left_screen.ui index 8c781e5..0f49ff5 100644 --- a/software/ros_packages/ground_station/src/Resources/Ui/left_screen.ui +++ b/software/ros_packages/ground_station/src/Resources/Ui/left_screen.ui @@ -80,17 +80,27 @@ 0 - + - background-color: darkgreen; + background-color: darkred; - placeholder + <html><head/><body><p align="center"><span style=" font-weight:600;">EMMC</span></p></body></html> - - + + + + background-color: darkred; + + + <html><head/><body><p align="center"><span style=" font-weight:600;">GPU </span><span style=" font-weight:600;">Temp</span></p></body></html> + + + + + 0 @@ -123,7 +133,7 @@ - background-color:darkgreen; + background-color:darkred; Undercarriage Camera @@ -175,7 +185,7 @@ Connected false - background-color:darkgreen; + background-color:darkred; Right Bogie @@ -237,7 +247,7 @@ Connected - background-color:darkgreen; + background-color:darkred; QFrame::NoFrame @@ -282,7 +292,7 @@ Connected false - background-color:darkgreen; + background-color:darkred; GPS @@ -365,7 +375,7 @@ Fix - background-color:darkgreen; + background-color:darkred; QFrame::NoFrame @@ -407,7 +417,7 @@ Connected - background-color:darkgreen; + background-color:darkred; QFrame::NoFrame @@ -452,7 +462,7 @@ Connected false - background-color:darkgreen; + background-color:darkred; 3D Nav Mouse @@ -491,7 +501,7 @@ Connected - background-color:darkgreen; + background-color:darkred; QFrame::NoFrame @@ -505,8 +515,31 @@ Connected - - + + + + + + + background-color: darkred; + + + <html><head/><body><p align="center"><span style=" font-weight:600;">RAM</span></p></body></html> + + + + + + + background-color: darkred; + + + <html><head/><body><p align="center"><span style=" font-weight:600;">CPU %</span></p></body></html> + + + + + 0 @@ -539,7 +572,7 @@ Connected - background-color:darkgreen; + background-color:darkred; Chassis Camera @@ -584,7 +617,7 @@ Connected - background-color:darkgreen; + background-color:darkred; FrSky @@ -998,7 +1031,7 @@ Connected - + Connection 0