From 12ed32ef54772ee9d214bdf31a71590926010f53 Mon Sep 17 00:00:00 2001 From: Corwin Perren Date: Fri, 10 Aug 2018 13:03:08 -0700 Subject: [PATCH] Minor changes to rdf and a low res mode for video. --- .../firmware/freq_testing/freq_testing.ino | 15 +++ software/firmware/mining/mining.ino | 9 ++ .../Framework/MiscSystems/BashConsoleCore.py | 8 +- .../src/Framework/MiscSystems/RDFCore.py | 42 +++++++- .../VideoSystems/RoverVideoCoordinator.py | 44 ++++++++- .../VideoSystems/RoverVideoReceiver.py | 2 + .../src/Resources/Ui/left_screen.ui | 97 ++++++++++++++++--- .../src/Resources/Ui/right_screen.ui | 82 ++++++++++++++++ .../rover_main/launch/rover/control.launch | 4 +- 9 files changed, 276 insertions(+), 27 deletions(-) create mode 100644 software/firmware/freq_testing/freq_testing.ino diff --git a/software/firmware/freq_testing/freq_testing.ino b/software/firmware/freq_testing/freq_testing.ino new file mode 100644 index 0000000..ecef981 --- /dev/null +++ b/software/firmware/freq_testing/freq_testing.ino @@ -0,0 +1,15 @@ +float freq = 1.5; +int pin = 13; +// convert freq to mills +float mills = (1/freq)*1000; + +void setup(){ + pinMode(pin, OUTPUT); +} + +void loop(){ + digitalWrite(pin,LOW); + delay(mills); + digitalWrite(pin, HIGH); + delay(mills); +} diff --git a/software/firmware/mining/mining.ino b/software/firmware/mining/mining.ino index 291e4a9..a0c03f0 100644 --- a/software/firmware/mining/mining.ino +++ b/software/firmware/mining/mining.ino @@ -22,6 +22,9 @@ enum HARDWARE { MOTOR_TILT_EN = 33, MOTOR_TILT_FB = A11, + CAMERA_CONTROL = 0, + CAMERA_VIDEO_EN = 1, + LED_13 = 13, LED_RED = 20, @@ -119,6 +122,10 @@ void setup_hardware() { pinMode(HARDWARE::MOTOR_TILT_CS, INPUT); pinMode(HARDWARE::MOTOR_TILT_FB, INPUT); + + pinMode(HARDWARE::CAMERA_CONTROL, OUTPUT); + pinMode(HARDWARE::CAMERA_VIDEO_EN, OUTPUT); + pinMode(HARDWARE::LED_13, OUTPUT); pinMode(HARDWARE::LED_RED, OUTPUT); pinMode(HARDWARE::LED_BLUE, OUTPUT); @@ -132,6 +139,8 @@ void setup_hardware() { digitalWrite(HARDWARE::MOTOR_LIFT_EN, HIGH); digitalWrite(HARDWARE::MOTOR_TILT_EN, HIGH); + digitalWrite(HARDWARE::CAMERA_VIDEO_EN, HIGH); + // Change motor PWM frequency so it's not in the audible range analogWriteFrequency(HARDWARE::MOTOR_LIFT_PWM, 25000); analogWriteFrequency(HARDWARE::MOTOR_TILT_PWM, 25000); diff --git a/software/ros_packages/ground_station/src/Framework/MiscSystems/BashConsoleCore.py b/software/ros_packages/ground_station/src/Framework/MiscSystems/BashConsoleCore.py index c63eea8..c4207ca 100644 --- a/software/ros_packages/ground_station/src/Framework/MiscSystems/BashConsoleCore.py +++ b/software/ros_packages/ground_station/src/Framework/MiscSystems/BashConsoleCore.py @@ -14,9 +14,9 @@ import paramiko ##################################### THREAD_HERTZ = 5 -IP = "192.168.1.127" -USER = "caperren" -PASS = "ult1m2t3!" +IP = "192.168.1.10" +USER = "nvidia" +PASS = "nvidia" ##################################### @@ -81,6 +81,8 @@ class BashConsole(QtCore.QThread): self.ssh_client.connect(IP, username=USER, password=PASS, compress=True) except: print "No connection" + if not self.run_thread_flag: + return self.ssh_client = None self.msleep(1000) diff --git a/software/ros_packages/ground_station/src/Framework/MiscSystems/RDFCore.py b/software/ros_packages/ground_station/src/Framework/MiscSystems/RDFCore.py index 9fbd0a4..2cf19bf 100644 --- a/software/ros_packages/ground_station/src/Framework/MiscSystems/RDFCore.py +++ b/software/ros_packages/ground_station/src/Framework/MiscSystems/RDFCore.py @@ -20,6 +20,13 @@ RDF_DATA_TOPIC = "/rover_science/rdf/data" THREAD_HERTZ = 5 +COLOR_GREEN = "background-color:darkgreen;" +COLOR_RED = "background-color:darkred;" + + +ALLOWED_RDF_VARIANCE = 0.15 + + ##################################### # UbiquitiRadioSettings Class Definition ##################################### @@ -28,6 +35,9 @@ class RDF(QtCore.QThread): rssi_lcd_number_update_ready__signal = QtCore.pyqtSignal(int) beacon_lcd_number_update_ready__signal = QtCore.pyqtSignal(float) + beacon_valid_text_change_ready__signal = QtCore.pyqtSignal(str) + beacon_valid_stylesheet_change_ready__signal = QtCore.pyqtSignal(str) + def __init__(self, shared_objects): super(RDF, self).__init__() @@ -37,6 +47,7 @@ class RDF(QtCore.QThread): self.rssi_lcdnumber = self.left_screen.rssi_lcdnumber # type:QtWidgets.QLCDNumber self.beacon_frequency_lcd_number = self.left_screen.beacon_frequency_lcd_number # type:QtWidgets.QLCDNumber + self.beacon_frequency_valid_label = self.left_screen.beacon_frequency_valid_label # type:QtWidgets.QLCDNumber # ########## Get the settings instance ########## self.settings = QtCore.QSettings() @@ -58,6 +69,9 @@ class RDF(QtCore.QThread): self.raw_data_timestamps = numpy.array([]) self.data_window_size = 200 + self.previous_frequencies = [] + self.num_previous_frequencies = 3 + def run(self): self.logger.debug("Starting RDF Thread") @@ -92,9 +106,30 @@ class RDF(QtCore.QThread): max_index = numpy.argmax(numpy.abs(yf)) freq = xf[max_index] + + if len(self.previous_frequencies) == self.num_previous_frequencies: + del self.previous_frequencies[0] + + self.previous_frequencies.append(freq) + + if len(self.previous_frequencies) == self.num_previous_frequencies: + variance_too_large = False + + if abs(self.previous_frequencies[0] - self.previous_frequencies[1]) > ALLOWED_RDF_VARIANCE: + variance_too_large = True + + if abs(self.previous_frequencies[0] - self.previous_frequencies[2]) > ALLOWED_RDF_VARIANCE: + variance_too_large = True + + if abs(self.previous_frequencies[1] - self.previous_frequencies[2]) > ALLOWED_RDF_VARIANCE: + variance_too_large = True + + self.beacon_valid_stylesheet_change_ready__signal.emit(COLOR_GREEN if not variance_too_large else COLOR_RED) + self.beacon_valid_text_change_ready__signal.emit("Yes" if not variance_too_large else "No") + self.beacon_lcd_number_update_ready__signal.emit(freq) - except: - pass + except Exception, e: + print e self.raw_data = numpy.array([]) self.raw_data_timestamps = numpy.array([]) @@ -119,6 +154,9 @@ class RDF(QtCore.QThread): self.rssi_lcd_number_update_ready__signal.connect(self.rssi_lcdnumber.display) self.beacon_lcd_number_update_ready__signal.connect(self.beacon_frequency_lcd_number.display) + self.beacon_valid_text_change_ready__signal.connect(self.beacon_frequency_valid_label.setText) + self.beacon_valid_stylesheet_change_ready__signal.connect(self.beacon_frequency_valid_label.setStyleSheet) + def setup_signals(self, start_signal, signals_and_slots_signal, kill_signal): start_signal.connect(self.start) signals_and_slots_signal.connect(self.connect_signals_and_slots) diff --git a/software/ros_packages/ground_station/src/Framework/VideoSystems/RoverVideoCoordinator.py b/software/ros_packages/ground_station/src/Framework/VideoSystems/RoverVideoCoordinator.py index 6099b98..fe347dd 100644 --- a/software/ros_packages/ground_station/src/Framework/VideoSystems/RoverVideoCoordinator.py +++ b/software/ros_packages/ground_station/src/Framework/VideoSystems/RoverVideoCoordinator.py @@ -22,11 +22,16 @@ PRIMARY_LABEL_MAX = (640, 360) SECONDARY_LABEL_MAX = (640, 360) TERTIARY_LABEL_MAX = (640, 360) +LOW_RES = (256, 144) + GUI_SELECTION_CHANGE_TIMEOUT = 3 # Seconds STYLESHEET_SELECTED = "border: 2px solid orange; background-color:black;" STYLESHEET_UNSELECTED = "background-color:black;" +COLOR_GREEN = "background-color: darkgreen;" +COLOR_RED = "background-color: darkred;" + ##################################### # RoverVideoCoordinator Class Definition @@ -38,6 +43,9 @@ class RoverVideoCoordinator(QtCore.QThread): pan_tilt_selection_changed__signal = QtCore.pyqtSignal(str) + low_res_button_text_update_ready__signal = QtCore.pyqtSignal(str) + low_res_button_stylesheet_update_ready__signal = QtCore.pyqtSignal(str) + def __init__(self, shared_objects): super(RoverVideoCoordinator, self).__init__() @@ -48,6 +56,8 @@ class RoverVideoCoordinator(QtCore.QThread): self.secondary_video_display_label = self.right_screen.secondary_video_label # type:QtWidgets.QLabel self.tertiary_video_display_label = self.right_screen.tertiary_video_label # type:QtWidgets.QLabel + self.low_res_mode_button = self.right_screen.low_res_mode_button # type: QtWidgets.QLabel + self.index_to_label_element = { 0: self.primary_video_display_label, 1: self.secondary_video_display_label, @@ -107,6 +117,8 @@ class RoverVideoCoordinator(QtCore.QThread): self.first_image_received = False + self.in_low_res_mode = False + def run(self): self.logger.debug("Starting Video Coordinator Thread") @@ -140,13 +152,17 @@ class RoverVideoCoordinator(QtCore.QThread): def __set_max_resolutions(self): if self.set_max_resolutions_flag: - self.camera_threads[self.valid_cameras[self.primary_label_current_setting]].set_hard_max_resolution(PRIMARY_LABEL_MAX) + if self.in_low_res_mode: + for camera in self.camera_threads: + self.camera_threads[camera].set_hard_max_resolution(LOW_RES) + else: + self.camera_threads[self.valid_cameras[self.primary_label_current_setting]].set_hard_max_resolution(PRIMARY_LABEL_MAX) - if self.secondary_label_current_setting != self.primary_label_current_setting: - self.camera_threads[self.valid_cameras[self.secondary_label_current_setting]].set_hard_max_resolution(SECONDARY_LABEL_MAX) + if self.secondary_label_current_setting != self.primary_label_current_setting: + self.camera_threads[self.valid_cameras[self.secondary_label_current_setting]].set_hard_max_resolution(SECONDARY_LABEL_MAX) - if self.tertiary_label_current_setting != self.primary_label_current_setting and self.tertiary_label_current_setting != self.secondary_label_current_setting: - self.camera_threads[self.valid_cameras[self.tertiary_label_current_setting]].set_hard_max_resolution(SECONDARY_LABEL_MAX) + if self.tertiary_label_current_setting != self.primary_label_current_setting and self.tertiary_label_current_setting != self.secondary_label_current_setting: + self.camera_threads[self.valid_cameras[self.tertiary_label_current_setting]].set_hard_max_resolution(SECONDARY_LABEL_MAX) self.set_max_resolutions_flag = False @@ -242,6 +258,10 @@ class RoverVideoCoordinator(QtCore.QThread): self.shared_objects["threaded_classes"]["Joystick Sender"].toggle_selected_gui_camera__signal.connect( self.on_gui_selected_camera_toggled) + self.low_res_mode_button.clicked.connect(self.on_low_res_button_clicked__slot) + self.low_res_button_text_update_ready__signal.connect(self.low_res_mode_button.setText) + self.low_res_button_stylesheet_update_ready__signal.connect(self.low_res_mode_button.setStyleSheet) + self.update_element_stylesheet__signal.connect(self.__on_gui_element_stylesheet_update__slot) def setup_signals(self, start_signal, signals_and_slots_signal, kill_signal): @@ -353,5 +373,19 @@ class RoverVideoCoordinator(QtCore.QThread): self.update_element_stylesheet__signal.emit() + def on_low_res_button_clicked__slot(self): + if self.low_res_mode_button.text() == "ENABLED": + self.in_low_res_mode = False + self.set_max_resolutions_flag = True + + self.low_res_button_text_update_ready__signal.emit("DISABLED") + self.low_res_button_stylesheet_update_ready__signal.emit(COLOR_GREEN) + else: + self.in_low_res_mode = False + self.set_max_resolutions_flag = True + + self.low_res_button_text_update_ready__signal.emit("ENABLED") + self.low_res_button_stylesheet_update_ready__signal.emit(COLOR_RED) + def on_kill_threads_requested__slot(self): self.run_thread_flag = False diff --git a/software/ros_packages/ground_station/src/Framework/VideoSystems/RoverVideoReceiver.py b/software/ros_packages/ground_station/src/Framework/VideoSystems/RoverVideoReceiver.py index 9545f19..3d43bdd 100644 --- a/software/ros_packages/ground_station/src/Framework/VideoSystems/RoverVideoReceiver.py +++ b/software/ros_packages/ground_station/src/Framework/VideoSystems/RoverVideoReceiver.py @@ -146,6 +146,8 @@ class RoverVideoReceiver(QtCore.QThread): self.current_resolution_index = min(self.current_resolution_index + 1, self.max_resolution_index) elif current_fps <= MIN_FRAMERATE_BEFORE_ADJUST: self.current_resolution_index = max(self.current_resolution_index - 1, 0) + else: + self.current_resolution_index = min(self.current_resolution_index, self.max_resolution_index) if self.last_resolution_index != self.current_resolution_index: self.camera_control_publisher.publish( 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 9bd74e6..c99d702 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 @@ -1390,14 +1390,14 @@ N/A - 0 + 1 RDF - + Qt::Vertical @@ -1441,7 +1441,27 @@ N/A - + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + @@ -1468,21 +1488,57 @@ N/A + + + + Qt::Vertical + + + + + + + + + + 16 + 75 + true + + + + Frequency Valid + + + + + + + + 0 + 150 + + + + + 24 + + + + background-color:darkred; + + + No + + + Qt::AlignCenter + + + + + - - - - Qt::Horizontal - - - - 40 - 20 - - - - @@ -1527,6 +1583,9 @@ N/A + + background-color: darkred; + Upright Zeroed @@ -1534,6 +1593,9 @@ N/A + + background-color: darkred; + Stow Arm @@ -1541,6 +1603,9 @@ N/A + + background-color: darkred; + Unstow Arm diff --git a/software/ros_packages/ground_station/src/Resources/Ui/right_screen.ui b/software/ros_packages/ground_station/src/Resources/Ui/right_screen.ui index f074dd3..8c4ece1 100644 --- a/software/ros_packages/ground_station/src/Resources/Ui/right_screen.ui +++ b/software/ros_packages/ground_station/src/Resources/Ui/right_screen.ui @@ -975,6 +975,9 @@ Position false + + color:red; + @@ -1083,6 +1086,9 @@ Position false + + color:red; + @@ -1191,6 +1197,9 @@ Position false + + color:red; + @@ -2158,11 +2167,84 @@ Position + + + + + 14 + 75 + true + + + + Low Res Mode + + + Qt::AlignCenter + + + + + + + 6 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + background-color:darkgreen + + + DISABLED + + + false + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::Horizontal + + + 0 + + 6 + diff --git a/software/ros_packages/rover_main/launch/rover/control.launch b/software/ros_packages/rover_main/launch/rover/control.launch index b425982..cf79418 100644 --- a/software/ros_packages/rover_main/launch/rover/control.launch +++ b/software/ros_packages/rover_main/launch/rover/control.launch @@ -35,6 +35,8 @@ - + + +