Got more statuses working, mainly GPS. Played with odom a bit more. Map now shows live GPS location!

This commit is contained in:
2018-07-15 22:35:50 -07:00
parent 1b7f5437b9
commit a573f72c1c
8 changed files with 405 additions and 146 deletions

View File

@@ -18,7 +18,7 @@ GAME_CONTROLLER_NAME = "Logitech Logitech Extreme 3D Pro"
DEFAULT_DRIVE_COMMAND_TOPIC = "/rover_control/command_control/ground_station_drive" DEFAULT_DRIVE_COMMAND_TOPIC = "/rover_control/command_control/ground_station_drive"
DEFAULT_PAN_TILT_COMMAND_TOPIC = "/rover_control/pan_tilt/control" DEFAULT_PAN_TILT_COMMAND_TOPIC = "/rover_control/pan_tilt/control"
DRIVE_COMMAND_HERTZ = 15 DRIVE_COMMAND_HERTZ = 20
Y_AXIS_DEADBAND = 0.05 Y_AXIS_DEADBAND = 0.05
X_AXIS_DEADBAND = 0.05 X_AXIS_DEADBAND = 0.05
@@ -32,7 +32,7 @@ GUI_ELEMENT_CHANGE_TIME = 0.2
CAMERA_TOGGLE_CHANGE_TIME = 0.35 CAMERA_TOGGLE_CHANGE_TIME = 0.35
PAN_TILT_X_AXIS_SCALAR = 3 PAN_TILT_X_AXIS_SCALAR = 3
PAN_TILT_Y_AXIS_SCALAR = 10 PAN_TILT_Y_AXIS_SCALAR = 20
##################################### #####################################
@@ -169,6 +169,9 @@ class JoystickControlSender(QtCore.QThread):
self.drive_command_publisher = rospy.Publisher(DEFAULT_DRIVE_COMMAND_TOPIC, DriveCommandMessage, queue_size=1) self.drive_command_publisher = rospy.Publisher(DEFAULT_DRIVE_COMMAND_TOPIC, DriveCommandMessage, queue_size=1)
self.tower_pan_tilt_command_publisher = rospy.Publisher(DEFAULT_PAN_TILT_COMMAND_TOPIC, TowerPanTiltControlMessage, queue_size=1) self.tower_pan_tilt_command_publisher = rospy.Publisher(DEFAULT_PAN_TILT_COMMAND_TOPIC, TowerPanTiltControlMessage, queue_size=1)
self.last_hat_x_was_movement = False
self.last_hat_y_was_movement = False
self.wait_time = 1.0 / DRIVE_COMMAND_HERTZ self.wait_time = 1.0 / DRIVE_COMMAND_HERTZ
self.drive_paused = True self.drive_paused = True

View File

@@ -12,12 +12,15 @@ import rospy
# Custom Imports # Custom Imports
import RoverMap import RoverMap
from sensor_msgs.msg import NavSatFix
##################################### #####################################
# Global Variables # Global Variables
##################################### #####################################
# put some stuff here later so you can remember # put some stuff here later so you can remember
GPS_POSITION_TOPIC = "/rover_odometry/fix"
class RoverMapCoordinator(QtCore.QThread): class RoverMapCoordinator(QtCore.QThread):
pixmap_ready_signal = QtCore.pyqtSignal() pixmap_ready_signal = QtCore.pyqtSignal()
@@ -36,6 +39,8 @@ class RoverMapCoordinator(QtCore.QThread):
self.logger = logging.getLogger("groundstation") self.logger = logging.getLogger("groundstation")
self.gps_position_subscriber = rospy.Subscriber(GPS_POSITION_TOPIC, NavSatFix, self.gps_position_updated_callback)
self.run_thread_flag = True self.run_thread_flag = True
self.setup_map_flag = True self.setup_map_flag = True
@@ -47,6 +52,9 @@ class RoverMapCoordinator(QtCore.QThread):
self.map_pixmap = None self.map_pixmap = None
self.last_map_pixmap_cache_key = None self.last_map_pixmap_cache_key = None
self.longitude = None
self.latitude = None
def run(self): def run(self):
self.logger.debug("Starting Map Coordinator Thread") self.logger.debug("Starting Map Coordinator Thread")
@@ -72,13 +80,13 @@ class RoverMapCoordinator(QtCore.QThread):
def _map_setup(self): def _map_setup(self):
self.google_maps_object = RoverMap.GMapsStitcher(1280, self.google_maps_object = RoverMap.GMapsStitcher(1280,
720, 720,
44.567161, 44.5675721667,
-123.278432, -123.2750535,
18, 20, # FIXME: Used to be 18
'satellite', 'satellite',
None, 20) None, 20)
self.overlay_image_object = ( self.overlay_image_object = (
RoverMap.OverlayImage(44.567161, -123.278432, RoverMap.OverlayImage(44.5675721667, -123.2750535,
self.google_maps_object.northwest, self.google_maps_object.northwest,
self.google_maps_object.southeast, self.google_maps_object.southeast,
self.google_maps_object.big_image.size[0], self.google_maps_object.big_image.size[0],
@@ -136,15 +144,22 @@ class RoverMapCoordinator(QtCore.QThread):
return temp_list return temp_list
def update_overlay(self): def update_overlay(self):
longitude = 44.567161 if self.latitude and self.longitude:
latitude = -123.278432 longitude = self.latitude
navigation_list = self._get_table_elements(self.navigation_label) latitude = self.longitude
# landmark_list = self._get_table_elements(self.landmark_label)
landmark_list = [] print self.longitude, " : ", self.latitude
self.overlay_image = self.overlay_image_object.update_new_location( navigation_list = self._get_table_elements(self.navigation_label)
latitude, # landmark_list = self._get_table_elements(self.landmark_label)
longitude, landmark_list = []
70, self.overlay_image = self.overlay_image_object.update_new_location(
navigation_list, latitude,
landmark_list) longitude,
# self.overlay_image.save("something.png") 70,
navigation_list,
landmark_list)
# self.overlay_image.save("something.png")
def gps_position_updated_callback(self, data):
self.latitude = data.latitude
self.longitude = data.longitude

View File

@@ -7,6 +7,8 @@ from PyQt5 import QtWidgets, QtCore, QtGui, uic
from std_msgs.msg import Empty from std_msgs.msg import Empty
import PIL.Image import PIL.Image
from PIL.ImageQt import ImageQt from PIL.ImageQt import ImageQt
from std_msgs.msg import UInt16
# import Timer # import Timer
REQUEST_UPDATE_TOPIC = "/rover_status/update_requested" REQUEST_UPDATE_TOPIC = "/rover_status/update_requested"
@@ -19,6 +21,7 @@ GPS_TOPIC_NAME = "/rover_status/gps_status"
JETSON_TOPIC_NAME = "/rover_status/jetson_status" JETSON_TOPIC_NAME = "/rover_status/jetson_status"
MISC_TOPIC_NAME = "/rover_status/misc_status" MISC_TOPIC_NAME = "/rover_status/misc_status"
BATTERY_TOPIC_NAME = "/rover_status/battery_status" BATTERY_TOPIC_NAME = "/rover_status/battery_status"
CO2_TOPIC_NAME = "/rover_control/tower/status/co2"
COLOR_GREEN = "background-color: darkgreen; border: 1px solid black;" COLOR_GREEN = "background-color: darkgreen; border: 1px solid black;"
COLOR_ORANGE = "background-color: orange; border: 1px solid black;" COLOR_ORANGE = "background-color: orange; border: 1px solid black;"
@@ -40,6 +43,13 @@ class SensorCore(QtCore.QThread):
bogie_connection_2_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) bogie_connection_3_stylesheet_change_ready__signal = QtCore.pyqtSignal(str)
gps_fix_update_ready__signal = QtCore.pyqtSignal(str)
gps_heading_valid_update_ready__signal = QtCore.pyqtSignal(str)
gps_num_satellites_update_ready__signal = QtCore.pyqtSignal(str)
gps_accuracy_update_ready__signal = QtCore.pyqtSignal(str)
co2_levels_update_ready__signal = QtCore.pyqtSignal(str)
camera_zed_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_under_stylesheet_change_ready__signal = QtCore.pyqtSignal(str)
camera_chassis_stylesheet_change_ready__signal = QtCore.pyqtSignal(str) camera_chassis_stylesheet_change_ready__signal = QtCore.pyqtSignal(str)
@@ -70,7 +80,10 @@ class SensorCore(QtCore.QThread):
self.frsky = self.screen_main_window.frsky # 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 self.nav_mouse = self.screen_main_window.nav_mouse # type: QtWidgets.QLabel
self.joystick = self.screen_main_window.joystick # type: QtWidgets.QLabel self.joystick = self.screen_main_window.joystick # type: QtWidgets.QLabel
self.gps = self.screen_main_window.gps # type: QtWidgets.QLabel self.gps_fix_label = self.screen_main_window.gps_fix_label # type: QtWidgets.QLabel
self.gps_heading_valid_label = self.screen_main_window.gps_heading_valid_label # type: QtWidgets.QLabel
self.gps_num_satellites_label = self.screen_main_window.gps_num_satellites_label # type: QtWidgets.QLabel
self.gps_accuracy_label = self.screen_main_window.gps_accuracy_label # type: QtWidgets.QLabel
self.zed = self.screen_main_window.zed # type: QtWidgets.QLabel self.zed = self.screen_main_window.zed # type: QtWidgets.QLabel
self.main_cam = self.screen_main_window.main_cam # type: QtWidgets.QLabel self.main_cam = self.screen_main_window.main_cam # type: QtWidgets.QLabel
self.chassis_cam = self.screen_main_window.chassis_cam # type: QtWidgets.QLabel self.chassis_cam = self.screen_main_window.chassis_cam # type: QtWidgets.QLabel
@@ -81,6 +94,7 @@ class SensorCore(QtCore.QThread):
self.gpu_temp = self.screen_main_window.gpu_temp # 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.emmc = self.screen_main_window.emmc # type: QtWidgets.QLabel
self.battery = self.screen_main_window.battery_voltage_status_label # type: QtWidgets.QLabel self.battery = self.screen_main_window.battery_voltage_status_label # type: QtWidgets.QLabel
self.co2_levels_label = self.screen_main_window.co2_levels_label # type: QtWidgets.QLabel
# ########## subscriptions 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.camera_status = rospy.Subscriber(CAMERA_TOPIC_NAME, CameraStatuses, self.__camera_callback)
@@ -89,6 +103,7 @@ class SensorCore(QtCore.QThread):
self.jetson_status = rospy.Subscriber(JETSON_TOPIC_NAME, JetsonInfo, self.__jetson_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.misc_status = rospy.Subscriber(MISC_TOPIC_NAME, MiscStatuses, self.__misc_callback)
self.battery_status = rospy.Subscriber(BATTERY_TOPIC_NAME, BatteryStatusMessage, self.__battery_callback) self.battery_status = rospy.Subscriber(BATTERY_TOPIC_NAME, BatteryStatusMessage, self.__battery_callback)
self.co2_status = rospy.Subscriber(CO2_TOPIC_NAME, UInt16, self.__co2_callback)
self.camera_msg = CameraStatuses() self.camera_msg = CameraStatuses()
self.bogie_msg = None # BogieStatuses() self.bogie_msg = None # BogieStatuses()
@@ -185,13 +200,23 @@ class SensorCore(QtCore.QThread):
self.jetson_emmc_stylesheet_change_ready__signal.emit(COLOR_GREEN) self.jetson_emmc_stylesheet_change_ready__signal.emit(COLOR_GREEN)
def __gps_callback(self, data): def __gps_callback(self, data):
self.GPS_msg.UTC_GPS_time = data.UTC_GPS_time
if not data.GPS_connection_status: if data.gps_connected:
self.gps_stylesheet_change_ready__signal.emit(COLOR_RED) self.gps_fix_update_ready__signal.emit("GPS Fix\nTrue")
else:
self.gps_stylesheet_change_ready__signal.emit(COLOR_GREEN) self.gps_stylesheet_change_ready__signal.emit(COLOR_GREEN)
else:
self.gps_stylesheet_change_ready__signal.emit(COLOR_RED)
self.gps_fix_update_ready__signal.emit("GPS Fix\nFalse")
if data.gps_heading != -1:
self.gps_heading_valid_update_ready__signal.emit("GPS Heading Valid\nTrue")
else:
self.gps_heading_valid_update_ready__signal.emit("GPS Heading Valid\nFalse")
self.gps_num_satellites_update_ready__signal.emit("GPS Satellites\n%s" % data.num_satellites)
self.gps_accuracy_update_ready__signal.emit("GPS Accuracy\n%2.2f m" % data.horizontal_dilution)
def __misc_callback(self, data): def __misc_callback(self, data):
self.misc_msg.arm_connection_status = data.arm_connection_status self.misc_msg.arm_connection_status = data.arm_connection_status
self.misc_msg.arm_end_effector_connection_statuses = data.arm_end_effector_connection_statuses self.misc_msg.arm_end_effector_connection_statuses = data.arm_end_effector_connection_statuses
@@ -209,6 +234,12 @@ class SensorCore(QtCore.QThread):
self.battery_voltage_update_ready__signal.emit("Battery Voltage\n" + str(voltage) + " V") self.battery_voltage_update_ready__signal.emit("Battery Voltage\n" + str(voltage) + " V")
def __co2_callback(self, data):
if data.data != 9999:
self.co2_levels_update_ready__signal.emit("CO2 Levels\n%d ppm" % data.data)
else:
self.co2_levels_update_ready__signal.emit("CO2 Levels\n--- ppm")
def __display_time(self): def __display_time(self):
time = QtCore.QTime.currentTime() time = QtCore.QTime.currentTime()
temp = time.toString('hh:mm') temp = time.toString('hh:mm')
@@ -233,9 +264,16 @@ class SensorCore(QtCore.QThread):
self.camera_under_stylesheet_change_ready__signal.connect(self.under_cam.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_chassis_stylesheet_change_ready__signal.connect(self.chassis_cam.setStyleSheet)
self.camera_main_stylesheet_change_ready__signal.connect(self.main_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.gps_stylesheet_change_ready__signal.connect(self.gps_fix_label.setStyleSheet)
self.frsky_stylesheet_change_ready__signal.connect(self.frsky.setStyleSheet) self.frsky_stylesheet_change_ready__signal.connect(self.frsky.setStyleSheet)
self.gps_fix_update_ready__signal.connect(self.gps_fix_label.setText)
self.gps_heading_valid_update_ready__signal.connect(self.gps_heading_valid_label.setText)
self.gps_num_satellites_update_ready__signal.connect(self.gps_num_satellites_label.setText)
self.gps_accuracy_update_ready__signal.connect(self.gps_accuracy_label.setText)
self.co2_levels_update_ready__signal.connect(self.co2_levels_label.setText)
self.battery_voltage_update_ready__signal.connect(self.battery.setText) self.battery_voltage_update_ready__signal.connect(self.battery.setText)
self.battery_voltage_stylesheet_change_ready__signal.connect(self.battery.setStyleSheet) self.battery_voltage_stylesheet_change_ready__signal.connect(self.battery.setStyleSheet)

View File

@@ -251,7 +251,7 @@
<property name="spacing"> <property name="spacing">
<number>0</number> <number>0</number>
</property> </property>
<item row="5" column="4"> <item row="5" column="3">
<widget class="QLabel" name="emmc"> <widget class="QLabel" name="emmc">
<property name="font"> <property name="font">
<font> <font>
@@ -275,7 +275,7 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="13" column="5"> <item row="13" column="4">
<widget class="QLabel" name="chassis_cam"> <widget class="QLabel" name="chassis_cam">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
@@ -320,7 +320,7 @@ Connected</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="13" column="4"> <item row="13" column="3">
<widget class="QLabel" name="under_cam"> <widget class="QLabel" name="under_cam">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
@@ -452,7 +452,7 @@ Connected</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="4"> <item row="0" column="3">
<widget class="QLabel" name="nav_mouse"> <widget class="QLabel" name="nav_mouse">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
@@ -494,7 +494,7 @@ Connected</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="5"> <item row="0" column="4">
<widget class="QLabel" name="joystick"> <widget class="QLabel" name="joystick">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
@@ -578,49 +578,7 @@ Connected</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="8" column="1"> <item row="8" column="3">
<widget class="QLabel" name="gps">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>9999999</width>
<height>9999999</height>
</size>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="autoFillBackground">
<bool>false</bool>
</property>
<property name="styleSheet">
<string notr="true">background-color:darkgreen; border: 0.5px solid black;</string>
</property>
<property name="text">
<string>GPS
Fix</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="8" column="4">
<widget class="QLabel" name="middle_left_wheel_label"> <widget class="QLabel" name="middle_left_wheel_label">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
@@ -662,7 +620,7 @@ Connected</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="8" column="5"> <item row="8" column="4">
<widget class="QLabel" name="rear_left_wheel_label"> <widget class="QLabel" name="rear_left_wheel_label">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
@@ -812,7 +770,7 @@ Disconnected</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="5" column="5"> <item row="5" column="4">
<widget class="QLabel" name="gpu_temp"> <widget class="QLabel" name="gpu_temp">
<property name="font"> <property name="font">
<font> <font>
@@ -878,49 +836,7 @@ Connected</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="10" column="1"> <item row="10" column="3">
<widget class="QLabel" name="battery_voltage_status_label">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>9999999</width>
<height>9999999</height>
</size>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="styleSheet">
<string notr="true">background-color:darkgreen; border: 0.5px solid black;</string>
</property>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="text">
<string>Battery Voltage
N/A</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="10" column="4">
<widget class="QLabel" name="middle_right_wheel_label"> <widget class="QLabel" name="middle_right_wheel_label">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
@@ -986,7 +902,7 @@ Connected</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="10" column="5"> <item row="10" column="4">
<widget class="QLabel" name="rear_right_wheel_label"> <widget class="QLabel" name="rear_right_wheel_label">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
@@ -1070,7 +986,7 @@ Connected</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="4"> <item row="2" column="3">
<widget class="QLabel" name="radio_rates_label"> <widget class="QLabel" name="radio_rates_label">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
@@ -1154,7 +1070,7 @@ TX Rate: --- Mbps</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="5"> <item row="2" column="4">
<widget class="QLabel" name="radio_latency_label"> <widget class="QLabel" name="radio_latency_label">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
@@ -1196,6 +1112,258 @@ RX Latency: ----- ms</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="4">
<widget class="QLabel" name="gps_accuracy_label">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>9999999</width>
<height>9999999</height>
</size>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="autoFillBackground">
<bool>false</bool>
</property>
<property name="styleSheet">
<string notr="true">background-color:darkgreen; border: 0.5px solid black;</string>
</property>
<property name="text">
<string>GPS Accuracy
-- m</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="3" column="3">
<widget class="QLabel" name="gps_num_satellites_label">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>9999999</width>
<height>9999999</height>
</size>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="autoFillBackground">
<bool>false</bool>
</property>
<property name="styleSheet">
<string notr="true">background-color:darkgreen; border: 0.5px solid black;</string>
</property>
<property name="text">
<string>GPS Satellites
0</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QLabel" name="gps_heading_valid_label">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>9999999</width>
<height>9999999</height>
</size>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="autoFillBackground">
<bool>false</bool>
</property>
<property name="styleSheet">
<string notr="true">background-color:darkgreen; border: 0.5px solid black;</string>
</property>
<property name="text">
<string>GPS Heading Valid
False</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLabel" name="gps_fix_label">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>9999999</width>
<height>9999999</height>
</size>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="autoFillBackground">
<bool>false</bool>
</property>
<property name="styleSheet">
<string notr="true">background-color:darkgreen; border: 0.5px solid black;</string>
</property>
<property name="text">
<string>GPS Fix
False</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="8" column="1">
<widget class="QLabel" name="battery_voltage_status_label">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>9999999</width>
<height>9999999</height>
</size>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="styleSheet">
<string notr="true">background-color:darkgreen; border: 0.5px solid black;</string>
</property>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="text">
<string>Battery Voltage
N/A</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="10" column="1">
<widget class="QLabel" name="co2_levels_label">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>9999999</width>
<height>9999999</height>
</size>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="styleSheet">
<string notr="true">background-color:darkgreen; border: 0.5px solid black;</string>
</property>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="text">
<string>CO2 Levels
--- ppm</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout> </layout>
</item> </item>
</layout> </layout>

View File

@@ -7,7 +7,7 @@
<param name="destination_port" value="17100" /> <param name="destination_port" value="17100" />
<rosparam param="topics"> <rosparam param="topics">
[{name: "/rover_control/command_control/ground_station_drive", compress: true, rate: 15.0}, [{name: "/rover_control/command_control/ground_station_drive", compress: true, rate: 15.0},
{name: "/rover_control/pan_tilt/control", compress: true, rate: 15.0}] {name: "/rover_control/pan_tilt/control", compress: true, rate: 20.0}]
</rosparam> </rosparam>
</node> </node>

View File

@@ -2,7 +2,7 @@
<group ns="sender_transports"> <group ns="sender_transports">
<arg name="target" default="192.168.1.15" /> <arg name="target" default="192.168.1.15" />
<node name="chassis_1280x720" pkg="nimbro_topic_transport" type="udp_sender" output="screen"> <node name="chassis_1280x720" pkg="nimbro_topic_transport" type="udp_sender">
<param name="destination_addr" value="$(arg target)" /> <param name="destination_addr" value="$(arg target)" />
<param name="destination_port" value="17001" /> <param name="destination_port" value="17001" />
<rosparam param="topics"> <rosparam param="topics">
@@ -10,7 +10,7 @@
</rosparam> </rosparam>
</node> </node>
<node name="undercarriage_1280x720" pkg="nimbro_topic_transport" type="udp_sender" output="screen"> <node name="undercarriage_1280x720" pkg="nimbro_topic_transport" type="udp_sender">
<param name="destination_addr" value="$(arg target)" /> <param name="destination_addr" value="$(arg target)" />
<param name="destination_port" value="17002" /> <param name="destination_port" value="17002" />
<rosparam param="topics"> <rosparam param="topics">
@@ -18,7 +18,7 @@
</rosparam> </rosparam>
</node> </node>
<node name="main_navigation_1280x720" pkg="nimbro_topic_transport" type="udp_sender" output="screen"> <node name="main_navigation_1280x720" pkg="nimbro_topic_transport" type="udp_sender">
<param name="destination_addr" value="$(arg target)" /> <param name="destination_addr" value="$(arg target)" />
<param name="destination_port" value="17003" /> <param name="destination_port" value="17003" />
<rosparam param="topics"> <rosparam param="topics">
@@ -26,7 +26,7 @@
</rosparam> </rosparam>
</node> </node>
<node name="end_effector_1280x720" pkg="nimbro_topic_transport" type="udp_sender" output="screen"> <node name="end_effector_1280x720" pkg="nimbro_topic_transport" type="udp_sender">
<param name="destination_addr" value="$(arg target)" /> <param name="destination_addr" value="$(arg target)" />
<param name="destination_port" value="17004" /> <param name="destination_port" value="17004" />
<rosparam param="topics"> <rosparam param="topics">
@@ -34,7 +34,7 @@
</rosparam> </rosparam>
</node> </node>
<node name="chassis_640x360" pkg="nimbro_topic_transport" type="udp_sender" output="screen"> <node name="chassis_640x360" pkg="nimbro_topic_transport" type="udp_sender">
<param name="destination_addr" value="$(arg target)" /> <param name="destination_addr" value="$(arg target)" />
<param name="destination_port" value="17005" /> <param name="destination_port" value="17005" />
<rosparam param="topics"> <rosparam param="topics">
@@ -42,7 +42,7 @@
</rosparam> </rosparam>
</node> </node>
<node name="undercarriage_640x360" pkg="nimbro_topic_transport" type="udp_sender" output="screen"> <node name="undercarriage_640x360" pkg="nimbro_topic_transport" type="udp_sender">
<param name="destination_addr" value="$(arg target)" /> <param name="destination_addr" value="$(arg target)" />
<param name="destination_port" value="17006" /> <param name="destination_port" value="17006" />
<rosparam param="topics"> <rosparam param="topics">
@@ -50,7 +50,7 @@
</rosparam> </rosparam>
</node> </node>
<node name="main_navigation_640x360" pkg="nimbro_topic_transport" type="udp_sender" output="screen"> <node name="main_navigation_640x360" pkg="nimbro_topic_transport" type="udp_sender">
<param name="destination_addr" value="$(arg target)" /> <param name="destination_addr" value="$(arg target)" />
<param name="destination_port" value="17007" /> <param name="destination_port" value="17007" />
<rosparam param="topics"> <rosparam param="topics">
@@ -58,7 +58,7 @@
</rosparam> </rosparam>
</node> </node>
<node name="end_effector_640x360" pkg="nimbro_topic_transport" type="udp_sender" output="screen"> <node name="end_effector_640x360" pkg="nimbro_topic_transport" type="udp_sender">
<param name="destination_addr" value="$(arg target)" /> <param name="destination_addr" value="$(arg target)" />
<param name="destination_port" value="17008" /> <param name="destination_port" value="17008" />
<rosparam param="topics"> <rosparam param="topics">
@@ -66,7 +66,7 @@
</rosparam> </rosparam>
</node> </node>
<node name="chassis_256x144" pkg="nimbro_topic_transport" type="udp_sender" output="screen"> <node name="chassis_256x144" pkg="nimbro_topic_transport" type="udp_sender">
<param name="destination_addr" value="$(arg target)" /> <param name="destination_addr" value="$(arg target)" />
<param name="destination_port" value="17009" /> <param name="destination_port" value="17009" />
<rosparam param="topics"> <rosparam param="topics">
@@ -74,7 +74,7 @@
</rosparam> </rosparam>
</node> </node>
<node name="undercarriage_256x144" pkg="nimbro_topic_transport" type="udp_sender" output="screen"> <node name="undercarriage_256x144" pkg="nimbro_topic_transport" type="udp_sender">
<param name="destination_addr" value="$(arg target)" /> <param name="destination_addr" value="$(arg target)" />
<param name="destination_port" value="17010" /> <param name="destination_port" value="17010" />
<rosparam param="topics"> <rosparam param="topics">
@@ -82,7 +82,7 @@
</rosparam> </rosparam>
</node> </node>
<node name="main_navigation_256x144" pkg="nimbro_topic_transport" type="udp_sender" output="screen"> <node name="main_navigation_256x144" pkg="nimbro_topic_transport" type="udp_sender">
<param name="destination_addr" value="$(arg target)" /> <param name="destination_addr" value="$(arg target)" />
<param name="destination_port" value="17011" /> <param name="destination_port" value="17011" />
<rosparam param="topics"> <rosparam param="topics">
@@ -90,7 +90,7 @@
</rosparam> </rosparam>
</node> </node>
<node name="end_effector_256x144" pkg="nimbro_topic_transport" type="udp_sender" output="screen"> <node name="end_effector_256x144" pkg="nimbro_topic_transport" type="udp_sender">
<param name="destination_addr" value="$(arg target)" /> <param name="destination_addr" value="$(arg target)" />
<param name="destination_port" value="17012" /> <param name="destination_port" value="17012" />
<rosparam param="topics"> <rosparam param="topics">
@@ -98,7 +98,7 @@
</rosparam> </rosparam>
</node> </node>
<node name="bogie_status_tcp" pkg="nimbro_topic_transport" type="tcp_sender" output="screen"> <node name="bogie_status_tcp" pkg="nimbro_topic_transport" type="tcp_sender">
<param name="destination_addr" value="$(arg target)" /> <param name="destination_addr" value="$(arg target)" />
<param name="destination_port" value="17013" /> <param name="destination_port" value="17013" />
<rosparam param="topics"> <rosparam param="topics">
@@ -106,7 +106,7 @@
</rosparam> </rosparam>
</node> </node>
<node name="camera_status_tcp" pkg="nimbro_topic_transport" type="tcp_sender" output="screen"> <node name="camera_status_tcp" pkg="nimbro_topic_transport" type="tcp_sender">
<param name="destination_addr" value="$(arg target)" /> <param name="destination_addr" value="$(arg target)" />
<param name="destination_port" value="17014" /> <param name="destination_port" value="17014" />
<rosparam param="topics"> <rosparam param="topics">
@@ -114,7 +114,7 @@
</rosparam> </rosparam>
</node> </node>
<node name="frsky_status_tcp" pkg="nimbro_topic_transport" type="tcp_sender" output="screen"> <node name="frsky_status_tcp" pkg="nimbro_topic_transport" type="tcp_sender">
<param name="destination_addr" value="$(arg target)" /> <param name="destination_addr" value="$(arg target)" />
<param name="destination_port" value="17015" /> <param name="destination_port" value="17015" />
<rosparam param="topics"> <rosparam param="topics">
@@ -122,15 +122,16 @@
</rosparam> </rosparam>
</node> </node>
<node name="gps_status_tcp" pkg="nimbro_topic_transport" type="tcp_sender" output="screen"> <node name="gps_status_tcp" pkg="nimbro_topic_transport" type="tcp_sender">
<param name="destination_addr" value="$(arg target)" /> <param name="destination_addr" value="$(arg target)" />
<param name="destination_port" value="17016" /> <param name="destination_port" value="17016" />
<rosparam param="topics"> <rosparam param="topics">
[{name: "/rover_status/gps_status", compress: false, rate: 1.0}] [{name: "/rover_status/gps_status", compress: false, rate: 1.0},
{name: "/rover_odometry/fix", compress: false, rate: 5.0}]
</rosparam> </rosparam>
</node> </node>
<node name="jetson_status_tcp" pkg="nimbro_topic_transport" type="tcp_sender" output="screen"> <node name="jetson_status_tcp" pkg="nimbro_topic_transport" type="tcp_sender">
<param name="destination_addr" value="$(arg target)" /> <param name="destination_addr" value="$(arg target)" />
<param name="destination_port" value="17017" /> <param name="destination_port" value="17017" />
<rosparam param="topics"> <rosparam param="topics">
@@ -138,7 +139,7 @@
</rosparam> </rosparam>
</node> </node>
<node name="misc_status_tcp" pkg="nimbro_topic_transport" type="tcp_sender" output="screen"> <node name="misc_status_tcp" pkg="nimbro_topic_transport" type="tcp_sender">
<param name="destination_addr" value="$(arg target)" /> <param name="destination_addr" value="$(arg target)" />
<param name="destination_port" value="17018" /> <param name="destination_port" value="17018" />
<rosparam param="topics"> <rosparam param="topics">
@@ -146,13 +147,13 @@
</rosparam> </rosparam>
</node> </node>
<node name="udp_statuses_sender" pkg="nimbro_topic_transport" type="udp_sender" output="screen"> <node name="udp_statuses_sender" pkg="nimbro_topic_transport" type="udp_sender">
<param name="destination_addr" value="$(arg target)" /> <param name="destination_addr" value="$(arg target)" />
<param name="destination_port" value="17019" /> <param name="destination_port" value="17019" />
<rosparam param="topics"> <rosparam param="topics">
[ [
{name: "/rover_status/gps_status", compress: true, rate: 5.0}, {name: "/rover_status/battery_status", compress: false, rate: 1.0},
{name: "/rover_status/battery_status", compress: false, rate: 1.0} {name: "/rover_control/tower/status/co2", compress: false, rate: 1.0}
] ]
</rosparam> </rosparam>
</node> </node>

View File

@@ -7,6 +7,7 @@ import rospy
import serial import serial
from time import time, sleep from time import time, sleep
import json import json
import re
from nmea_msgs.msg import Sentence from nmea_msgs.msg import Sentence
from sensor_msgs.msg import Imu from sensor_msgs.msg import Imu
@@ -75,13 +76,42 @@ class Odometry(object):
imu = temp.get('imu', None) imu = temp.get('imu', None)
if gps: if gps:
print gps # ###### THIS IS HERE TO DEAL WITH UBLOX GPS #####
if "GNGGA" in gps:
gps = gps.replace("GNGGA", "GPGGA")
gps = gps[:-2] + str(self.chksum_nmea(gps))[2:]
# print gps
# #####
self.broadcast_gps(gps) self.broadcast_gps(gps)
if imu: if imu:
# print imu # print imu
self.broadcast_imu(imu) self.broadcast_imu(imu)
@staticmethod
def chksum_nmea(sentence):
# String slicing: Grabs all the characters
# between '$' and '*' and nukes any lingering
# newline or CRLF
chksumdata = re.sub("(\n|\r\n)", "", sentence[sentence.find("$") + 1:sentence.find("*")])
# Initializing our first XOR value
csum = 0
# For each char in chksumdata, XOR against the previous
# XOR'd char. The final XOR of the last char will be our
# checksum to verify against the checksum we sliced off
# the NMEA sentence
for c in chksumdata:
# XOR'ing value of csum against the next char in line
# and storing the new XOR value in csum
csum ^= ord(c)
# Do we have a validated sentence?
return hex(csum)
def broadcast_gps(self, gps): def broadcast_gps(self, gps):
message = Sentence() message = Sentence()
message.header.frame_id = "gps" message.header.frame_id = "gps"

View File

@@ -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_LEFT_TOPIC_NAME = '/rover_control/drive_status/left'
DEFAULT_BOGIE_RIGHT_TOPIC_NAME = '/rover_control/drive_status/right' DEFAULT_BOGIE_RIGHT_TOPIC_NAME = '/rover_control/drive_status/right'
DEFAULT_BOGIE_REAR_TOPIC_NAME = '/rover_control/drive_status/rear' DEFAULT_BOGIE_REAR_TOPIC_NAME = '/rover_control/drive_status/rear'
DEFAULT_GPS_NMEA_TOPIC_NAME = '/odometry/gps/sentence' DEFAULT_GPS_NMEA_TOPIC_NAME = '/rover_odometry/gps/sentence'
##################################### #####################################
@@ -130,7 +130,11 @@ class SystemStatuses:
# Pulls the UTC GPS Information (WIP v2.0) # Pulls the UTC GPS Information (WIP v2.0)
def __set_gps_info(self, data): def __set_gps_info(self, data):
self.GPS_msg.gps_connected = True self.GPS_msg.gps_connected = True
self.Nmea_Message = pynmea2.parse(data.sentence) try:
self.Nmea_Message = pynmea2.parse(data.sentence)
except:
return
if self.Nmea_Message.sentence_type == 'GGA': if self.Nmea_Message.sentence_type == 'GGA':
if int(self.Nmea_Message.gps_qual) != 0: if int(self.Nmea_Message.gps_qual) != 0:
self.GPS_msg.gps_fix = True self.GPS_msg.gps_fix = True