mirror of
https://github.com/OSURoboticsClub/Rover_2017_2018.git
synced 2025-11-08 18:21:15 +00:00
Merge branch 'master' of https://github.com/OSURoboticsClub/Rover_2017_2018
This commit is contained in:
@@ -1,50 +1,180 @@
|
|||||||
import sys
|
#####################################
|
||||||
from PyQt5 import QtWidgets, QtCore, QtGui, uic
|
# Imports
|
||||||
import signal
|
#####################################
|
||||||
|
# Python native imports
|
||||||
|
from PyQt5 import QtCore, QtWidgets
|
||||||
|
import logging
|
||||||
|
from inputs import devices, GamePad
|
||||||
|
from time import time
|
||||||
|
|
||||||
import rospy
|
import rospy
|
||||||
import time
|
from rover_control.msg import DriveCommandMessage
|
||||||
from cv_bridge import CvBridge, CvBridgeError
|
|
||||||
import cv2
|
|
||||||
import qimage2ndarray
|
|
||||||
import numpy as np
|
|
||||||
|
|
||||||
from geometry_msgs.msg import Twist
|
#####################################
|
||||||
from sensor_msgs.msg import CompressedImage
|
# Global Variables
|
||||||
#from sensor_msgs.msg import Image, CompressedImage
|
#####################################
|
||||||
|
GAME_CONTROLLER_NAME = "Logitech Logitech Extreme 3D Pro"
|
||||||
|
|
||||||
|
DEFAULT_DRIVE_COMMAND_TOPIC = "command_control/groundstation_drive"
|
||||||
|
|
||||||
|
|
||||||
class DriveTest(QtCore.QThread):
|
#####################################
|
||||||
publish_message_signal = QtCore.pyqtSignal()
|
# Controller Class Definition
|
||||||
|
#####################################
|
||||||
|
class LogitechJoystick(QtCore.QThread):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(DriveTest, self).__init__()
|
super(LogitechJoystick, self).__init__()
|
||||||
|
|
||||||
self.not_abort = True
|
# ########## Thread Flags ##########
|
||||||
|
self.run_thread_flag = True
|
||||||
|
self.setup_controller_flag = True
|
||||||
|
self.data_acquisition_and_broadcast_flag = True
|
||||||
|
self.controller_acquired = False
|
||||||
|
|
||||||
self.message = None
|
# ########## Class Variables ##########
|
||||||
self.publisher = rospy.Publisher("/cmd_vel", Twist, queue_size=10)
|
self.gamepad = None # type: GamePad
|
||||||
|
|
||||||
rospy.init_node("test")
|
self.controller_states = {
|
||||||
|
"left_stick_x_axis": 0,
|
||||||
|
"left_stick_y_axis": 0,
|
||||||
|
"left_stick_center_pressed": 0,
|
||||||
|
|
||||||
|
"right_stick_x_axis": 0,
|
||||||
|
"right_stick_y_axis": 0,
|
||||||
|
"right_stick_center_pressed": 0,
|
||||||
|
|
||||||
|
"left_trigger_z_axis": 0,
|
||||||
|
"left_bumper_pressed": 0,
|
||||||
|
|
||||||
|
"right_trigger_z_axis": 0,
|
||||||
|
"right_bumper_pressed": 0,
|
||||||
|
|
||||||
|
"dpad_x": 0,
|
||||||
|
"dpad_y": 0,
|
||||||
|
|
||||||
|
"select_pressed": 0,
|
||||||
|
"start_pressed": 0,
|
||||||
|
"home_pressed": 0,
|
||||||
|
|
||||||
|
"a_pressed": 0,
|
||||||
|
"b_pressed": 0,
|
||||||
|
"x_pressed": 0,
|
||||||
|
"y_pressed": 0
|
||||||
|
}
|
||||||
|
|
||||||
|
self.raw_mapping_to_class_mapping = {
|
||||||
|
"ABS_X": "left_stick_x_axis",
|
||||||
|
"ABS_Y": "left_stick_y_axis",
|
||||||
|
"BTN_THUMBL": "left_stick_center_pressed",
|
||||||
|
|
||||||
|
"ABS_RX": "right_stick_x_axis",
|
||||||
|
"ABS_RY": "right_stick_y_axis",
|
||||||
|
"BTN_THUMBR": "right_stick_center_pressed",
|
||||||
|
|
||||||
|
"ABS_Z": "left_trigger_z_axis",
|
||||||
|
"BTN_TL": "left_bumper_pressed",
|
||||||
|
|
||||||
|
"ABS_RZ": "right_trigger_z_axis",
|
||||||
|
"BTN_TR": "right_bumper_pressed",
|
||||||
|
|
||||||
|
"ABS_HAT0X": "dpad_x",
|
||||||
|
"ABS_HAT0Y": "dpad_y",
|
||||||
|
|
||||||
|
"BTN_SELECT": "select_pressed",
|
||||||
|
"BTN_START": "start_pressed",
|
||||||
|
"BTN_MODE": "home_pressed",
|
||||||
|
|
||||||
|
"BTN_SOUTH": "a_pressed",
|
||||||
|
"BTN_EAST": "b_pressed",
|
||||||
|
"BTN_NORTH": "x_pressed",
|
||||||
|
"BTN_WEST": "y_pressed"
|
||||||
|
}
|
||||||
|
self.ready = False
|
||||||
|
|
||||||
|
self.start()
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
# TODO: Thread starting message here
|
|
||||||
while self.not_abort:
|
|
||||||
self.message = Twist()
|
|
||||||
|
|
||||||
self.message.linear.x = 1.0
|
while self.run_thread_flag:
|
||||||
self.message.angular.z = 1.0
|
if self.setup_controller_flag:
|
||||||
|
self.controller_acquired = self.__setup_controller()
|
||||||
|
self.setup_controller_flag = False
|
||||||
|
if self.data_acquisition_and_broadcast_flag:
|
||||||
|
self.__get_controller_data()
|
||||||
|
|
||||||
self.publisher.publish(self.message)
|
def __setup_controller(self):
|
||||||
|
for device in devices.gamepads:
|
||||||
|
if device.name == GAME_CONTROLLER_NAME:
|
||||||
|
self.gamepad = device
|
||||||
|
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
def __get_controller_data(self):
|
||||||
|
if self.controller_acquired:
|
||||||
|
events = self.gamepad.read()
|
||||||
|
|
||||||
|
for event in events:
|
||||||
|
if event.code in self.raw_mapping_to_class_mapping:
|
||||||
|
self.controller_states[self.raw_mapping_to_class_mapping[event.code]] = event.state
|
||||||
|
self.ready = True
|
||||||
|
# print "Logitech: %s" % self.controller_states
|
||||||
|
|
||||||
|
|
||||||
|
#####################################
|
||||||
|
# Controller Class Definition
|
||||||
|
#####################################
|
||||||
|
class RoverDriveSender(QtCore.QThread):
|
||||||
|
def __init__(self, shared_objects):
|
||||||
|
super(RoverDriveSender, self).__init__()
|
||||||
|
|
||||||
|
# ########## Reference to class init variables ##########
|
||||||
|
self.shared_objects = shared_objects
|
||||||
|
self.right_screen = self.shared_objects["screens"]["right_screen"]
|
||||||
|
self.primary_video_display_label = self.right_screen.primary_video_label # type:QtWidgets.QLabel
|
||||||
|
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
|
||||||
|
|
||||||
|
# ########## 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
|
||||||
|
|
||||||
|
self.joystick = LogitechJoystick()
|
||||||
|
while not self.joystick.ready:
|
||||||
self.msleep(100)
|
self.msleep(100)
|
||||||
# TODO: Thread ending message here
|
|
||||||
|
|
||||||
def __publish_message(self):
|
# ########## Class Variables ##########
|
||||||
|
# Publishers
|
||||||
|
self.drive_command_publisher = rospy.Publisher(DEFAULT_DRIVE_COMMAND_TOPIC, DriveCommandMessage, queue_size=1)
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
while self.run_thread_flag:
|
||||||
|
|
||||||
|
start_time = time()
|
||||||
|
|
||||||
|
self.__update_and_publish()
|
||||||
|
|
||||||
|
time_diff = time() - start_time
|
||||||
|
|
||||||
|
self.msleep(max(self.wait_time - time_diff, 0))
|
||||||
|
|
||||||
|
def connect_signals_and_slots(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def setup_start_and_kill_signals(self, start_signal, signals_and_slots_signal, kill_signal):
|
def __update_and_publish(self):
|
||||||
|
|
||||||
|
# axis = self.joystick.controller_states["left_stick_y_axis"]
|
||||||
|
print self.joystick.controller_states
|
||||||
|
|
||||||
|
def setup_signals(self, start_signal, signals_and_slots_signal, kill_signal):
|
||||||
start_signal.connect(self.start)
|
start_signal.connect(self.start)
|
||||||
|
signals_and_slots_signal.connect(self.connect_signals_and_slots)
|
||||||
kill_signal.connect(self.on_kill_threads_requested__slot)
|
kill_signal.connect(self.on_kill_threads_requested__slot)
|
||||||
|
|
||||||
def on_kill_threads_requested__slot(self):
|
def on_kill_threads_requested__slot(self):
|
||||||
self.not_abort = False
|
self.run_thread_flag = False
|
||||||
|
|||||||
@@ -92,5 +92,4 @@ class RoverMapCoordinator(QtCore.QThread):
|
|||||||
kill_signal.connect(self.on_kill_threads_requested_slot)
|
kill_signal.connect(self.on_kill_threads_requested_slot)
|
||||||
|
|
||||||
def pixmap_ready__slot(self):
|
def pixmap_ready__slot(self):
|
||||||
self.logger.info("Made it")
|
|
||||||
self.mapping_label.setPixmap(self.map_pixmap)
|
self.mapping_label.setPixmap(self.map_pixmap)
|
||||||
|
|||||||
@@ -120,6 +120,9 @@
|
|||||||
<property name="text">
|
<property name="text">
|
||||||
<string/>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignCenter</set>
|
||||||
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ import Framework.StartupSystems.ROSMasterChecker as ROSMasterChecker
|
|||||||
import Framework.LoggingSystems.Logger as Logger
|
import Framework.LoggingSystems.Logger as Logger
|
||||||
import Framework.VideoSystems.RoverVideoCoordinator as RoverVideoCoordinator
|
import Framework.VideoSystems.RoverVideoCoordinator as RoverVideoCoordinator
|
||||||
import Framework.MapSystems.RoverMapCoordinator as RoverMapCoordinator
|
import Framework.MapSystems.RoverMapCoordinator as RoverMapCoordinator
|
||||||
|
import Framework.DriveSystems.RoverDriveSender as RoverDriveSender
|
||||||
|
|
||||||
#####################################
|
#####################################
|
||||||
# Global Variables
|
# Global Variables
|
||||||
@@ -99,6 +100,7 @@ class GroundStation(QtCore.QObject):
|
|||||||
# ##### Instantiate Threaded Classes ######
|
# ##### Instantiate Threaded Classes ######
|
||||||
self.__add_thread("Video Coordinator", RoverVideoCoordinator.RoverVideoCoordinator(self.shared_objects))
|
self.__add_thread("Video Coordinator", RoverVideoCoordinator.RoverVideoCoordinator(self.shared_objects))
|
||||||
self.__add_thread("Map Coordinator", RoverMapCoordinator.RoverMapCoordinator(self.shared_objects))
|
self.__add_thread("Map Coordinator", RoverMapCoordinator.RoverMapCoordinator(self.shared_objects))
|
||||||
|
self.__add_thread("Rover Drive Sender", RoverDriveSender.RoverDriveSender(self.shared_objects))
|
||||||
self.connect_signals_and_slots_signal.emit()
|
self.connect_signals_and_slots_signal.emit()
|
||||||
self.__connect_signals_to_slots()
|
self.__connect_signals_to_slots()
|
||||||
self.start_threads_signal.emit()
|
self.start_threads_signal.emit()
|
||||||
|
|||||||
Reference in New Issue
Block a user