diff --git a/software/firmware/iris/iris.ino b/software/firmware/iris/iris.ino index db7483f..4fa4ff7 100644 --- a/software/firmware/iris/iris.ino +++ b/software/firmware/iris/iris.ino @@ -46,7 +46,7 @@ uint8_t message_count = 0; uint8_t failSafe; uint16_t lostFrames = 0; -uint16_t telem_24v_scalar = 37500; +uint16_t telem_24v_scalar = 36680; ////////// Class Instantiations ////////// SBUS x8r(SBUS_HARDWARE_PORT); diff --git a/software/ros_packages/ground_station/src/Framework/InputSystems/JoystickControlSender.py b/software/ros_packages/ground_station/src/Framework/InputSystems/JoystickControlSender.py index 957c081..4d5bb07 100644 --- a/software/ros_packages/ground_station/src/Framework/InputSystems/JoystickControlSender.py +++ b/software/ros_packages/ground_station/src/Framework/InputSystems/JoystickControlSender.py @@ -288,4 +288,4 @@ class JoystickControlSender(QtCore.QThread): self.right_drive_progress_bar.setStyleSheet("background-color: transparent;") def on_kill_threads_requested__slot(self): - self.run_thread_flag = False + self.run_thread_flag = False \ No newline at end of file diff --git a/software/ros_packages/ground_station/src/Framework/InputSystems/SpaceNavControlSender.py b/software/ros_packages/ground_station/src/Framework/InputSystems/SpaceNavControlSender.py index 1dfd6d4..933ddc1 100644 --- a/software/ros_packages/ground_station/src/Framework/InputSystems/SpaceNavControlSender.py +++ b/software/ros_packages/ground_station/src/Framework/InputSystems/SpaceNavControlSender.py @@ -110,7 +110,7 @@ class SpaceNavControlSender(QtCore.QThread): time_diff = time() - start_time - self.msleep(max(int(self.wait_time - time_diff), 0)) + self.msleep(max(int((self.wait_time - time_diff) * 1000), 0)) def process_spnav_events(self): event = spnav.spnav_poll_event() 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 2a44149..4a6ae46 100644 --- a/software/ros_packages/ground_station/src/Framework/StatusSystems/StatusCore.py +++ b/software/ros_packages/ground_station/src/Framework/StatusSystems/StatusCore.py @@ -18,6 +18,11 @@ FRSKY_TOPIC_NAME = "/rover_status/frsky_status" GPS_TOPIC_NAME = "/rover_status/gps_status" JETSON_TOPIC_NAME = "/rover_status/jetson_status" MISC_TOPIC_NAME = "/rover_status/misc_status" +BATTERY_TOPIC_NAME = "/rover_status/battery_status" + +COLOR_GREEN = "background-color: darkgreen; border: 1px solid black;" +COLOR_ORANGE = "background-color: orange; border: 1px solid black;" +COLOR_RED = "background-color: darkred; border: 1px solid black;" class SensorCore(QtCore.QThread): @@ -44,6 +49,9 @@ class SensorCore(QtCore.QThread): frsky_stylesheet_change_ready__signal = QtCore.pyqtSignal(str) + battery_voltage_update_ready__signal = QtCore.pyqtSignal(str) + battery_voltage_stylesheet_change_ready__signal = QtCore.pyqtSignal(str) + def __init__(self, shared_objects): super(SensorCore, self).__init__() @@ -72,6 +80,7 @@ class SensorCore(QtCore.QThread): 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 + self.battery = self.screen_main_window.battery_voltage_status_label # type: QtWidgets.QLabel # ########## subscriptions pulling data from system_statuses_node.py ########## self.camera_status = rospy.Subscriber(CAMERA_TOPIC_NAME, CameraStatuses, self.__camera_callback) @@ -79,6 +88,7 @@ class SensorCore(QtCore.QThread): self.gps_status = rospy.Subscriber(GPS_TOPIC_NAME, GPSInfo, self.__gps_callback) self.jetson_status = rospy.Subscriber(JETSON_TOPIC_NAME, JetsonInfo, self.__jetson_callback) self.misc_status = rospy.Subscriber(MISC_TOPIC_NAME, MiscStatuses, self.__misc_callback) + self.battery_status = rospy.Subscriber(BATTERY_TOPIC_NAME, BatteryStatusMessage, self.__battery_callback) self.camera_msg = CameraStatuses() self.bogie_msg = BogieStatuses() @@ -86,6 +96,7 @@ class SensorCore(QtCore.QThread): self.GPS_msg = GPSInfo() self.jetson_msg = JetsonInfo() self.misc_msg = MiscStatuses() + self.battery_msg = BatteryStatusMessage() self.update_requester = rospy.Publisher(REQUEST_UPDATE_TOPIC, Empty, queue_size=10) @@ -102,84 +113,84 @@ class SensorCore(QtCore.QThread): if data.camera_zed is False: # self.zed.setStyleSheet("background-color: red;") - self.camera_zed_stylesheet_change_ready__signal.emit("background-color: darkred;") + self.camera_zed_stylesheet_change_ready__signal.emit(COLOR_RED) else: - # self.zed.setStyleSheet("background-color: darkgreen;") - self.camera_zed_stylesheet_change_ready__signal.emit("background-color: darkgreen;") + # self.zed.setStyleSheet(COLOR_GREEN) + self.camera_zed_stylesheet_change_ready__signal.emit(COLOR_GREEN) if data.camera_undercarriage is False: - # self.under_cam.setStyleSheet("background-color: darkred;") - self.camera_under_stylesheet_change_ready__signal.emit("background-color: darkred;") + # self.under_cam.setStyleSheet(COLOR_RED) + self.camera_under_stylesheet_change_ready__signal.emit(COLOR_RED) else: - # self.under_cam.setStyleSheet("background-color: darkgreen;") - self.camera_under_stylesheet_change_ready__signal.emit("background-color: darkgreen;") + # self.under_cam.setStyleSheet(COLOR_GREEN) + self.camera_under_stylesheet_change_ready__signal.emit(COLOR_GREEN) if data.camera_chassis is False: - # self.chassis_cam.setStyleSheet("background-color: darkred;") - self.camera_chassis_stylesheet_change_ready__signal.emit("background-color: darkred;") + # self.chassis_cam.setStyleSheet(COLOR_RED) + self.camera_chassis_stylesheet_change_ready__signal.emit(COLOR_RED) else: - # self.chassis_cam.setStyleSheet("background-color: darkgreen;") - self.camera_chassis_stylesheet_change_ready__signal.emit("background-color: darkgreen;") + # self.chassis_cam.setStyleSheet(COLOR_GREEN) + self.camera_chassis_stylesheet_change_ready__signal.emit(COLOR_GREEN) if data.camera_main_navigation is False: - # self.main_cam.setStyleSheet("background-color: darkred;") - self.camera_main_stylesheet_change_ready__signal.emit("background-color: darkred;") + # self.main_cam.setStyleSheet(COLOR_RED) + self.camera_main_stylesheet_change_ready__signal.emit(COLOR_RED) else: - # self.main_cam.setStyleSheet("background-color: darkgreen;") - self.camera_main_stylesheet_change_ready__signal.emit("background-color: darkgreen;") + # self.main_cam.setStyleSheet(COLOR_GREEN) + self.camera_main_stylesheet_change_ready__signal.emit(COLOR_GREEN) 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_stylesheet_change_ready__signal.emit("background-color: darkred;") + self.frsky_stylesheet_change_ready__signal.emit(COLOR_RED) else: - self.frsky_stylesheet_change_ready__signal.emit("background-color: darkgreen;") + self.frsky_stylesheet_change_ready__signal.emit(COLOR_GREEN) def __jetson_callback(self, data): self.jetson_cpu_update_ready__signal.emit("TX2 CPU\n" + str(data.jetson_CPU) + "%") if data.jetson_CPU > 85: - self.jetson_cpu_stylesheet_change_ready__signal.emit("background-color: orange;") + self.jetson_cpu_stylesheet_change_ready__signal.emit(COLOR_ORANGE) elif data.jetson_CPU > 95: - self.jetson_cpu_stylesheet_change_ready__signal.emit("background-color: darkred;") + self.jetson_cpu_stylesheet_change_ready__signal.emit(COLOR_RED) else: - self.jetson_cpu_stylesheet_change_ready__signal.emit("background-color: darkgreen;") + self.jetson_cpu_stylesheet_change_ready__signal.emit(COLOR_GREEN) self.jetson_ram_update_ready__signal.emit("TX2 RAM\n" + str(data.jetson_RAM) + "%") if data.jetson_RAM > 79: - self.jetson_ram_stylesheet_change_ready__signal.emit("background-color: orange;") + self.jetson_ram_stylesheet_change_ready__signal.emit(COLOR_ORANGE) elif data.jetson_RAM > 89: - self.jetson_ram_stylesheet_change_ready__signal.emit("background-color: darkred;") + self.jetson_ram_stylesheet_change_ready__signal.emit(COLOR_RED) else: - self.jetson_ram_stylesheet_change_ready__signal.emit("background-color: darkgreen;") + self.jetson_ram_stylesheet_change_ready__signal.emit(COLOR_GREEN) self.jetson_gpu_temp_update_ready__signal.emit("TX2 TEMP\n" + str(data.jetson_GPU_temp) + "°C") if data.jetson_GPU_temp > 64: - self.jetson_gpu_temp_stylesheet_change_ready__signal.emit("background-color: orange;") + self.jetson_gpu_temp_stylesheet_change_ready__signal.emit(COLOR_ORANGE) elif data.jetson_GPU_temp > 79: - self.jetson_gpu_temp_stylesheet_change_ready__signal.emit("background-color: darkred;") + self.jetson_gpu_temp_stylesheet_change_ready__signal.emit(COLOR_RED) else: - self.jetson_gpu_temp_stylesheet_change_ready__signal.emit("background-color: darkgreen;") + self.jetson_gpu_temp_stylesheet_change_ready__signal.emit(COLOR_GREEN) self.jetson_emmc_update_ready__signal.emit("TX2 EMMC\n" + str(data.jetson_EMMC) + "%") if data.jetson_EMMC > 79: - self.jetson_emmc_stylesheet_change_ready__signal.emit("background-color: orange;") + self.jetson_emmc_stylesheet_change_ready__signal.emit(COLOR_ORANGE) elif data.jetson_EMMC > 89: - self.jetson_emmc_stylesheet_change_ready__signal.emit("background-color: darkred;") + self.jetson_emmc_stylesheet_change_ready__signal.emit(COLOR_RED) else: - self.jetson_emmc_stylesheet_change_ready__signal.emit("background-color: darkgreen") + self.jetson_emmc_stylesheet_change_ready__signal.emit(COLOR_GREEN) def __gps_callback(self, data): self.GPS_msg.UTC_GPS_time = data.UTC_GPS_time if not data.GPS_connection_status: - self.gps_stylesheet_change_ready__signal.emit("background-color: darkred;") + self.gps_stylesheet_change_ready__signal.emit(COLOR_RED) else: - self.gps_stylesheet_change_ready__signal.emit("background-color: darkgreen;") + self.gps_stylesheet_change_ready__signal.emit(COLOR_GREEN) def __misc_callback(self, data): self.misc_msg.arm_connection_status = data.arm_connection_status @@ -188,6 +199,16 @@ class SensorCore(QtCore.QThread): self.misc_msg.tower_connection_status = data.tower_connection_status self.misc_msg.chassis_pan_tilt_connection_status = data.chassis_pan_tilt_connection_status + def __battery_callback(self, data): + voltage = data.battery_voltage / 1000.0 + + if voltage >= 20: + self.battery_voltage_stylesheet_change_ready__signal.emit(COLOR_GREEN) + else: + self.battery_voltage_stylesheet_change_ready__signal.emit(COLOR_RED) + + self.battery_voltage_update_ready__signal.emit("Battery Voltage\n" + str(voltage) + "V") + def __display_time(self): time = QtCore.QTime.currentTime() temp = time.toString('hh:mm') @@ -215,6 +236,9 @@ class SensorCore(QtCore.QThread): self.gps_stylesheet_change_ready__signal.connect(self.gps.setStyleSheet) self.frsky_stylesheet_change_ready__signal.connect(self.frsky.setStyleSheet) + self.battery_voltage_update_ready__signal.connect(self.battery.setText) + self.battery_voltage_stylesheet_change_ready__signal.connect(self.battery.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/StatusSystems/UbiquitiStatusCore.py b/software/ros_packages/ground_station/src/Framework/StatusSystems/UbiquitiStatusCore.py new file mode 100644 index 0000000..1aaa182 --- /dev/null +++ b/software/ros_packages/ground_station/src/Framework/StatusSystems/UbiquitiStatusCore.py @@ -0,0 +1,126 @@ +# coding=utf-8 +##################################### +# Imports +##################################### +# Python native imports +from PyQt5 import QtCore, QtWidgets +import logging +from time import time +import paramiko +from pprint import pprint +import json + +##################################### +# Global Variables +##################################### +THREAD_HERTZ = 2 + +ACCESS_POINT_IP = "192.168.1.20" # The channel only has to be set on the access point. The staion will adjust. +ACCESS_POINT_USER = "ubnt" +ACCESS_POINT_PASSWORD = "rover4lyfe^" # We don't care about this password, don't freak out. Wifi is open anyways... + +GENERAL_WIRELESS_INFO_COMMAND = "wstalist" + + +##################################### +# UbiquitiRadioSettings Class Definition +##################################### +class UbiquitiStatus(QtCore.QThread): + connection_quality_update_ready__signal = QtCore.pyqtSignal(str) + successful_transmission_update_ready__signal = QtCore.pyqtSignal(str) + radio_rates_update_ready__signal = QtCore.pyqtSignal(str) + radio_latency_update_ready__signal = QtCore.pyqtSignal(str) + + def __init__(self, shared_objects): + super(UbiquitiStatus, self).__init__() + + # ########## Reference to class init variables ########## + self.shared_objects = shared_objects + self.left_screen = self.shared_objects["screens"]["left_screen"] + + self.connection_quality_label = self.left_screen.connection_quality_label + self.successful_transmit_label = self.left_screen.successful_transmit_label + self.radio_rates_label = self.left_screen.radio_rates_label + self.radio_latency_label = self.left_screen.radio_latency_label + + # ########## Get the settings instance ########## + self.settings = QtCore.QSettings() + + # ########## Get the Pick And Plate instance of the logger ########## + self.logger = logging.getLogger("groundstation") + + # ########## Thread Flags ########## + self.run_thread_flag = True + + # ########## Class Variables ########## + self.wait_time = 1.0 / THREAD_HERTZ + + self.ssh_client = None + + def run(self): + try: + self.setup_and_connect_ssh_client() + except Exception: + return + + while self.run_thread_flag: + start_time = time() + + try: + self.get_and_show_ubiquiti_status() + except Exception, e: + print e + + time_diff = time() - start_time + + self.msleep(max(int((self.wait_time - time_diff) * 1000), 0)) + + def setup_and_connect_ssh_client(self): + self.ssh_client = paramiko.SSHClient() + self.ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + self.ssh_client.connect(ACCESS_POINT_IP, username=ACCESS_POINT_USER, password=ACCESS_POINT_PASSWORD, + compress=True) + + def get_and_show_ubiquiti_status(self): + ssh_stdin, ssh_stdout, ssh_stderr = self.ssh_client.exec_command(GENERAL_WIRELESS_INFO_COMMAND) + + try: + output_json = json.loads(ssh_stdout.read())[0] + + transmit_percent = output_json["ccq"] + quality = output_json["airmax"]["quality"] + # capacity = output_json["airmax"]["capacity"] + rx_rate = output_json["rx"] + tx_rate = output_json["tx"] + ground_tx_latency = output_json["tx_latency"] + rover_tx_latency = output_json["remote"]["tx_latency"] + + except IndexError: + transmit_percent = 0 + quality = 0 + # capacity = output_json["airmax"]["capacity"] + rx_rate = 0 + tx_rate = 0 + ground_tx_latency = "----" + rover_tx_latency = "----" + + + self.connection_quality_update_ready__signal.emit("Connection Quality\n%s %%" % quality) + self.successful_transmission_update_ready__signal.emit("Successful Transmit\n%s %%" % transmit_percent) + self.radio_rates_update_ready__signal.emit("TX Rate: %s Mbps\nRX Rate: %s Mbps" % (tx_rate, rx_rate)) + self.radio_latency_update_ready__signal.emit( + "TX Latency: %s ms\nRX Latency: %s ms" % (ground_tx_latency, rover_tx_latency)) + + def connect_signals_and_slots(self): + self.connection_quality_update_ready__signal.connect(self.connection_quality_label.setText) + self.successful_transmission_update_ready__signal.connect(self.successful_transmit_label.setText) + self.radio_rates_update_ready__signal.connect(self.radio_rates_label.setText) + self.radio_latency_update_ready__signal.connect(self.radio_latency_label.setText) + + 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) + kill_signal.connect(self.on_kill_threads_requested__slot) + + def on_kill_threads_requested__slot(self): + self.run_thread_flag = False 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 cbcd109..2cff728 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 @@ -251,23 +251,17 @@ 0 - - - - background-color: darkred; - - - <html><head/><body><p align="center"><span style=" font-weight:600;">TX2 RAM</span></p></body></html> - - - Qt::AlignCenter - - - - + + + + 10 + 75 + true + + - background-color: darkred; + background-color:darkgreen; border: 0.5px solid black; <html><head/><body><p align="center"><span style=" font-weight:600;">TX2 EMMC</span></p></body></html> @@ -277,7 +271,7 @@ - + @@ -311,7 +305,7 @@ - background-color:darkred; + background-color:darkgreen; border: 0.5px solid black; Chassis Camera @@ -322,7 +316,7 @@ Connected - + @@ -356,7 +350,7 @@ Connected - background-color:darkred; + background-color:darkgreen; border: 0.5px solid black; Undercarriage Camera @@ -395,7 +389,7 @@ Connected - background-color:darkgreen; + background-color:darkgreen; border: 0.5px solid black; QFrame::NoFrame @@ -443,7 +437,7 @@ Connected - background-color:darkgreen; + background-color:darkgreen; border: 0.5px solid black; FrSky @@ -485,7 +479,7 @@ Connected false - background-color:darkgreen; + background-color:darkgreen; border: 0.5px solid black; 3D Nav Mouse @@ -524,7 +518,7 @@ Connected - background-color:darkgreen; + background-color:darkgreen; border: 0.5px solid black; QFrame::NoFrame @@ -538,7 +532,7 @@ Connected - + @@ -566,7 +560,7 @@ Connected - background-color:darkred; + background-color:darkgreen; border: 0.5px solid black; QFrame::NoFrame @@ -580,7 +574,7 @@ Connected - + @@ -611,7 +605,7 @@ Connected false - background-color:darkgreen; + background-color:darkgreen; border: 0.5px solid black; GPS @@ -622,7 +616,7 @@ Fix - + @@ -653,18 +647,18 @@ Fix false - background-color:darkred; + background-color:darkgreen; border: 0.5px solid black; Middle Left Wheel -Disconnected +Connected Qt::AlignCenter - + @@ -692,7 +686,7 @@ Disconnected - background-color:darkgreen; + background-color:darkgreen; border: 0.5px solid black; QFrame::NoFrame @@ -706,7 +700,7 @@ Connected - + @@ -734,7 +728,7 @@ Connected - background-color:darkgreen; + background-color:darkgreen; border: 0.5px solid black; QFrame::NoFrame @@ -748,7 +742,7 @@ Connected - + @@ -776,7 +770,7 @@ Connected - background-color:darkred; + background-color:darkgreen; border: 0.5px solid black; QFrame::NoFrame @@ -790,10 +784,17 @@ Disconnected - + + + + 10 + 75 + true + + - background-color: darkred; + background-color:darkgreen; border: 0.5px solid black; <html><head/><body><p align="center"><span style=" font-weight:600;">TX2 CPU</span></p></body></html> @@ -803,10 +804,17 @@ Disconnected - + + + + 10 + 75 + true + + - background-color: darkred; + background-color:darkgreen; border: 0.5px solid black; <html><head/><body><p align="center"><span style=" font-size:9pt; font-weight:600;">TX2 TEMP</span></p></body></html> @@ -816,7 +824,7 @@ Disconnected - + @@ -844,7 +852,7 @@ Disconnected - background-color:darkgreen; + background-color:darkgreen; border: 0.5px solid black; QFrame::NoFrame @@ -858,7 +866,7 @@ Connected - + @@ -886,7 +894,7 @@ Connected - background-color:darkred; + background-color:darkgreen; border: 0.5px solid black; QFrame::NoFrame @@ -900,7 +908,7 @@ N/A - + @@ -928,21 +936,41 @@ N/A - background-color:darkred; + background-color:darkgreen; border: 0.5px solid black; QFrame::NoFrame Middle Right Wheel -Disconnected +Connected Qt::AlignCenter - + + + + + 10 + 75 + true + + + + background-color:darkgreen; border: 0.5px solid black; + + + <html><head/><body><p align="center"><span style=" font-weight:600;">TX2 RAM</span></p></body></html> + + + Qt::AlignCenter + + + + @@ -970,7 +998,7 @@ Disconnected - background-color:darkgreen; + background-color:darkgreen; border: 0.5px solid black; QFrame::NoFrame @@ -984,6 +1012,174 @@ Connected + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 9999999 + 9999999 + + + + + 10 + 75 + true + + + + background-color:darkgreen; border: 0.5px solid black; + + + QFrame::NoFrame + + + Connection Quality +0.0% + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 9999999 + 9999999 + + + + + 9 + 75 + true + + + + background-color:darkgreen; border: 0.5px solid black; + + + QFrame::NoFrame + + + RX Rate: 240.0 Mbps +TX Rate: 300 Mbps + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 9999999 + 9999999 + + + + + 10 + 75 + true + + + + background-color:darkgreen; border: 0.5px solid black; + + + QFrame::NoFrame + + + Successful Transmit +0.0% + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 9999999 + 9999999 + + + + + 9 + 75 + true + + + + background-color:darkgreen; border: 0.5px solid black; + + + QFrame::NoFrame + + + TX Latency: 10000 ms +RX Latency: 10000 ms + + + Qt::AlignCenter + + + diff --git a/software/ros_packages/ground_station/src/ground_station.py b/software/ros_packages/ground_station/src/ground_station.py index a21febb..3fe78f7 100644 --- a/software/ros_packages/ground_station/src/ground_station.py +++ b/software/ros_packages/ground_station/src/ground_station.py @@ -20,6 +20,7 @@ import Framework.NavigationSystems.SpeedAndHeadingIndication as SpeedAndHeading import Framework.NavigationSystems.WaypointsCoordinator as WaypointsCoordinator import Framework.ArmSystems.ArmIndication as ArmIndication import Framework.StatusSystems.StatusCore as StatusCore +import Framework.StatusSystems.UbiquitiStatusCore as UbiquitiStatusCore import Framework.SettingsSystems.UbiquitiRadioSettings as UbiquitiRadioSettings import Framework.InputSystems.SpaceNavControlSender as SpaceNavControlSender @@ -108,6 +109,7 @@ class GroundStation(QtCore.QObject): self.__add_thread("Speed and Heading", SpeedAndHeading.SpeedAndHeadingIndication(self.shared_objects)) self.__add_thread("Arm Indication", ArmIndication.ArmIndication(self.shared_objects)) self.__add_thread("Rover Status", StatusCore.SensorCore(self.shared_objects)) + self.__add_thread("Ubiquiti Status", UbiquitiStatusCore.UbiquitiStatus(self.shared_objects)) self.__add_thread("Ubiquiti Radio Settings", UbiquitiRadioSettings.UbiquitiRadioSettings(self.shared_objects)) self.__add_thread("Waypoints Coordinator", WaypointsCoordinator.WaypointsCoordinator(self.shared_objects)) self.__add_thread("Spacenav Sender", SpaceNavControlSender.SpaceNavControlSender(self.shared_objects)) diff --git a/software/ros_packages/rover_control/src/control_coordinators/drive_coordinator.py b/software/ros_packages/rover_control/src/control_coordinators/drive_coordinator.py index 89ea46b..c0e92f0 100755 --- a/software/ros_packages/rover_control/src/control_coordinators/drive_coordinator.py +++ b/software/ros_packages/rover_control/src/control_coordinators/drive_coordinator.py @@ -71,7 +71,6 @@ class DriveCoordinator(object): self.left_bogie_publisher = rospy.Publisher(self.left_bogie_topic, DriveControlMessage, queue_size=1) self.right_bogie_publisher = rospy.Publisher(self.right_bogie_topic, DriveControlMessage, queue_size=1) - self.last_message_time = time() # ########## Run the Class ########## diff --git a/software/ros_packages/rover_control/src/drive_control/drive_control.py b/software/ros_packages/rover_control/src/drive_control/drive_control.py index 6d45284..8ce35da 100755 --- a/software/ros_packages/rover_control/src/drive_control/drive_control.py +++ b/software/ros_packages/rover_control/src/drive_control/drive_control.py @@ -34,7 +34,7 @@ COMMUNICATIONS_TIMEOUT = 0.01 # Seconds RX_DELAY = 0.01 TX_DELAY = 0.01 -DEFAULT_HERTZ = 20 +DEFAULT_HERTZ = 30 MODBUS_REGISTERS = { "DIRECTION": 0, diff --git a/software/ros_packages/rover_main/launch/rover/control.launch b/software/ros_packages/rover_main/launch/rover/control.launch index 63a408b..033ca9e 100644 --- a/software/ros_packages/rover_main/launch/rover/control.launch +++ b/software/ros_packages/rover_main/launch/rover/control.launch @@ -31,6 +31,6 @@ - + diff --git a/software/ros_packages/rover_main/launch/rover/odometry.launch b/software/ros_packages/rover_main/launch/rover/odometry.launch index b11160e..5c85d19 100644 --- a/software/ros_packages/rover_main/launch/rover/odometry.launch +++ b/software/ros_packages/rover_main/launch/rover/odometry.launch @@ -3,6 +3,9 @@ + + + diff --git a/software/ros_packages/rover_main/launch/rover/odometry2.launch b/software/ros_packages/rover_main/launch/rover/odometry2.launch new file mode 100644 index 0000000..9de8629 --- /dev/null +++ b/software/ros_packages/rover_main/launch/rover/odometry2.launch @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [true, true, false, + false, false, false, + false , false, false, + false, false, false, + false, false, false] + + [false, false, false, + true , true , true, + false, false, false, + true , true , true , + true , true , true ] + + + + + + + + + + + + + + + + + + + + + + diff --git a/software/ros_packages/rover_status/src/system_statuses_node.py b/software/ros_packages/rover_status/src/system_statuses_node.py index f4f2309..d73fe53 100755 --- a/software/ros_packages/rover_status/src/system_statuses_node.py +++ b/software/ros_packages/rover_status/src/system_statuses_node.py @@ -36,7 +36,7 @@ DEFAULT_IRIS_STATUS_TOPIC_NAME = "/rover_control/iris_status" DEFAULT_BOGIE_LEFT_TOPIC_NAME = '/rover_control/drive_status/left' DEFAULT_BOGIE_RIGHT_TOPIC_NAME = '/rover_control/drive_status/right' DEFAULT_BOGIE_REAR_TOPIC_NAME = '/rover_control/drive_status/rear' -DEFAULT_GPS_NMEA_TOPIC_NAME = '/nmea_sentence' +DEFAULT_GPS_NMEA_TOPIC_NAME = '/odometry/gps/sentence' ##################################### diff --git a/software/testing/ubiradio_testing.py b/software/testing/ubiradio_testing.py index 839345f..042e89d 100644 --- a/software/testing/ubiradio_testing.py +++ b/software/testing/ubiradio_testing.py @@ -1,6 +1,6 @@ import paramiko import json -from pprint import pprint +import time # ath0 21 channels in total; available frequencies : # Channel 01 : 2.412 GHz @@ -43,12 +43,25 @@ ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy) # Before anyone complains, I'm not worried about this password being online. # We only set one because the web interfaces HAVE to have one ssh.connect("192.168.1.20", username="ubnt", password="rover4lyfe^", compress=True) -ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command(get_general_info) -pprint( json.loads(ssh_stdout.read()) ) +while True: + ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command(get_general_info) -ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command(set_wireless_frequency) -ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command(get_wireless_info) + output_json = json.loads(ssh_stdout.read())[0] + successful_transmit_percent = output_json["ccq"] + quality = output_json["airmax"]["quality"] + capacity = output_json["airmax"]["capacity"] + rx_rate = output_json["rx"] + tx_rate = output_json["tx"] + ground_tx_latency = output_json["tx_latency"] + rover_tx_latency = output_json["remote"]["tx_latency"] + + print successful_transmit_percent, " | ", quality, " | ", capacity, " | ", rx_rate, " | ", tx_rate, " | ", ground_tx_latency, " | ", rover_tx_latency + + time.sleep(0.25) +# ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command(set_wireless_frequency) +# ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command(get_wireless_info) +# +# print ssh_stdout.read() -print ssh_stdout.read() \ No newline at end of file