From 5e65f9dfdda446f5d0f848725b09872e460f7e29 Mon Sep 17 00:00:00 2001 From: Corwin Perren Date: Mon, 6 Aug 2018 20:13:50 -0700 Subject: [PATCH] Control changes. Joystick and spacenav sucked. Switched to regular controllers. Added readout for xbox controller mode. --- ....py => LogitechControllerControlSender.py} | 132 +++++++------- .../InputSystems/SpaceNavControlSender.py | 13 -- ...nder.py => XBOXControllerControlSender.py} | 106 +++++++++-- .../src/Resources/Ui/left_screen.ui | 168 +++++++++++++++++- .../ground_station/src/ground_station.py | 10 +- .../topic_transport_senders.launch | 2 +- 6 files changed, 328 insertions(+), 103 deletions(-) rename software/ros_packages/ground_station/src/Framework/InputSystems/{JoystickControlSender.py => LogitechControllerControlSender.py} (77%) rename software/ros_packages/ground_station/src/Framework/InputSystems/{ControllerControlSender.py => XBOXControllerControlSender.py} (61%) diff --git a/software/ros_packages/ground_station/src/Framework/InputSystems/JoystickControlSender.py b/software/ros_packages/ground_station/src/Framework/InputSystems/LogitechControllerControlSender.py similarity index 77% rename from software/ros_packages/ground_station/src/Framework/InputSystems/JoystickControlSender.py rename to software/ros_packages/ground_station/src/Framework/InputSystems/LogitechControllerControlSender.py index 99b3bee..1b9b839 100644 --- a/software/ros_packages/ground_station/src/Framework/InputSystems/JoystickControlSender.py +++ b/software/ros_packages/ground_station/src/Framework/InputSystems/LogitechControllerControlSender.py @@ -13,7 +13,7 @@ from rover_control.msg import DriveCommandMessage, TowerPanTiltControlMessage ##################################### # Global Variables ##################################### -GAME_CONTROLLER_NAME = "Logitech Logitech Extreme 3D Pro" +GAME_CONTROLLER_NAME = "Logitech Logitech Dual Action" DEFAULT_DRIVE_COMMAND_TOPIC = "/rover_control/command_control/ground_station_drive" DEFAULT_TOWER_PAN_TILT_COMMAND_TOPIC = "/rover_control/tower/pan_tilt/control" @@ -21,8 +21,10 @@ DEFAULT_CHASSIS_PAN_TILT_COMMAND_TOPIC = "/rover_control/chassis/pan_tilt/contro DRIVE_COMMAND_HERTZ = 20 -Y_AXIS_DEADBAND = 0.05 -X_AXIS_DEADBAND = 0.05 +STICK_DEADBAND = 8 + +STICK_MAX = 128.0 +STICK_OFFSET = 127 THROTTLE_MIN = 0.05 @@ -56,51 +58,57 @@ class LogitechJoystick(QtCore.QThread): self.gamepad = None # type: GamePad self.controller_states = { - "x_axis": 512, - "y_axis": 512, - "z_axis": 128, - "throttle_axis": 128, + "left_x_axis": 127, + "left_y_axis": 127, + "right_x_axis": 127, + "right_y_axis": 127, - "hat_x_axis": 0, - "hat_y_axis": 0, + "left_trigger": 0, + "right_trigger": 0, - "trigger_pressed": 0, - "thumb_pressed": 0, - "three_pressed": 0, - "four_pressed": 0, - "five_pressed": 0, - "six_pressed": 0, + "left_stick": 0, + "right_right": 0, - "seven_pressed": 0, - "eight_pressed": 0, - "nine_pressed": 0, - "ten_pressed": 0, - "eleven_pressed": 0, - "twelve_pressed": 0, + "left_bumper": 0, + "right_bumper": 0, + + "d_pad_x": 0, + "d_pad_y": 0, + + "back": 0, + "start": 0, + + "a": 0, + "x": 0, + "y": 0, + "b": 0, } self.raw_mapping_to_class_mapping = { - "ABS_X": "x_axis", - "ABS_Y": "y_axis", - "ABS_RZ": "z_axis", - "ABS_THROTTLE": "throttle_axis", + "ABS_X": "left_x_axis", + "ABS_Y": "left_y_axis", + "ABS_Z": "right_x_axis", + "ABS_RZ": "right_y_axis", - "ABS_HAT0X": "hat_x_axis", - "ABS_HAT0Y": "hat_y_axis", + "BTN_BASE": "left_trigger", + "BTN_BASE2": "right_trigger", - "BTN_TRIGGER": "trigger_pressed", - "BTN_THUMB": "thumb_pressed", - "BTN_THUMB2": "three_pressed", - "BTN_TOP": "four_pressed", - "BTN_TOP2": "five_pressed", - "BTN_PINKIE": "six_pressed", + "BTN_BASE5": "left_stick", + "BTN_BASE6": "right_right", - "BTN_BASE": "seven_pressed", - "BTN_BASE2": "eight_pressed", - "BTN_BASE3": "nine_pressed", - "BTN_BASE4": "ten_pressed", - "BTN_BASE5": "eleven_pressed", - "BTN_BASE6": "twelve_pressed" + "BTN_TOP2": "left_bumper", + "BTN_PINKIE": "right_bumper", + + "ABS_HAT0X": "d_pad_x", + "ABS_HAT0Y": "d_pad_y", + + "BTN_BASE3": "back", + "BTN_BASE4": "start", + + "BTN_THUMB": "a", + "BTN_TRIGGER": "x", + "BTN_TOP": "y", + "BTN_THUMB2": "b", } self.ready = False @@ -118,6 +126,7 @@ class LogitechJoystick(QtCore.QThread): def __setup_controller(self): for device in devices.gamepads: + # print device if device.name == GAME_CONTROLLER_NAME: self.gamepad = device @@ -129,7 +138,7 @@ class LogitechJoystick(QtCore.QThread): events = self.gamepad.read() for event in events: - # print event.code + print event.code, event.state if event.code in self.raw_mapping_to_class_mapping: self.controller_states[self.raw_mapping_to_class_mapping[event.code]] = event.state @@ -139,7 +148,7 @@ class LogitechJoystick(QtCore.QThread): ##################################### # Controller Class Definition ##################################### -class JoystickControlSender(QtCore.QThread): +class LogitechControllerControlSender(QtCore.QThread): set_speed_limit__signal = QtCore.pyqtSignal(int) set_left_drive_output__signal = QtCore.pyqtSignal(int) set_right_drive_output__signal = QtCore.pyqtSignal(int) @@ -149,7 +158,7 @@ class JoystickControlSender(QtCore.QThread): toggle_selected_gui_camera__signal = QtCore.pyqtSignal() def __init__(self, shared_objects): - super(JoystickControlSender, self).__init__() + super(LogitechControllerControlSender, self).__init__() # ########## Reference to class init variables ########## self.shared_objects = shared_objects @@ -215,7 +224,7 @@ class JoystickControlSender(QtCore.QThread): self.video_coordinator.pan_tilt_selection_changed__signal.connect(self.on_pan_tilt_selection_changed__slot) def check_and_set_pause_state(self): - thumb_pressed = self.joystick.controller_states["thumb_pressed"] + thumb_pressed = self.joystick.controller_states["start"] if thumb_pressed and (time() - self.last_pause_state_time) > PAUSE_STATE_CHANGE_TIME: self.drive_paused = not self.drive_paused self.show_changed_pause_state() @@ -227,7 +236,8 @@ class JoystickControlSender(QtCore.QThread): self.publish_pan_tilt_control_commands() def publish_drive_command(self): - throttle_axis = max((255 - self.joystick.controller_states["throttle_axis"]) / 255.0, THROTTLE_MIN) + throttle_axis = 1 + # throttle_axis = max((255 - self.joystick.controller_states["throttle_axis"]) / 255.0, THROTTLE_MIN) if self.drive_paused: drive_message = DriveCommandMessage() @@ -244,11 +254,11 @@ class JoystickControlSender(QtCore.QThread): self.drive_command_publisher.publish(drive_message) def publish_camera_control_commands(self): - trigger_pressed = self.joystick.controller_states["trigger_pressed"] - three_pressed = self.joystick.controller_states["three_pressed"] - four_pressed = self.joystick.controller_states["four_pressed"] - five_pressed = self.joystick.controller_states["five_pressed"] - six_pressed = self.joystick.controller_states["six_pressed"] + trigger_pressed = self.joystick.controller_states["y"] + three_pressed = self.joystick.controller_states["left_bumper"] + four_pressed = self.joystick.controller_states["right_bumper"] + five_pressed = self.joystick.controller_states["left_trigger"] + six_pressed = self.joystick.controller_states["right_trigger"] if (five_pressed or six_pressed) and (time() - self.last_camera_change_time) > CAMERA_CHANGE_TIME: change = -1 if five_pressed else 1 @@ -265,9 +275,9 @@ class JoystickControlSender(QtCore.QThread): self.last_camera_toggle_time = time() def publish_pan_tilt_control_commands(self): - button_eight = self.joystick.controller_states["seven_pressed"] - hat_x = self.joystick.controller_states["hat_x_axis"] - hat_y = self.joystick.controller_states["hat_y_axis"] + button_eight = self.joystick.controller_states["a"] + hat_x = self.joystick.controller_states["d_pad_x"] + hat_y = self.joystick.controller_states["d_pad_y"] if (hat_x == 0 and not self.last_hat_x_was_movement) and ( hat_y == 0 and not self.last_hat_y_was_movement) and not button_eight: @@ -294,20 +304,14 @@ class JoystickControlSender(QtCore.QThread): def get_drive_message(self, throttle_axis): drive_message = DriveCommandMessage() - y_axis = throttle_axis * (-(self.joystick.controller_states["y_axis"] - 512) / 512.0) - z_axis = throttle_axis * (-(self.joystick.controller_states["z_axis"] - 128) / 128.0) - x_axis = throttle_axis * (-(self.joystick.controller_states["x_axis"] - 512) / 512.0) + left_y_axis = self.joystick.controller_states["left_y_axis"] if abs(self.joystick.controller_states["left_y_axis"]) > STICK_DEADBAND else 0 + right_y_axis = self.joystick.controller_states["right_y_axis"] if abs(self.joystick.controller_states["right_y_axis"]) > STICK_DEADBAND else 0 - if abs(y_axis) < Y_AXIS_DEADBAND: - y_axis = 0 + left_y_axis = throttle_axis * (-(left_y_axis - STICK_OFFSET) / STICK_MAX) + right_y_axis = throttle_axis * (-(right_y_axis - STICK_OFFSET) / STICK_MAX) - if abs(x_axis) < X_AXIS_DEADBAND and y_axis == 0: - twist = z_axis - else: - twist = x_axis if y_axis >= 0 else -x_axis - - drive_message.drive_twist.linear.x = y_axis - drive_message.drive_twist.angular.z = twist + drive_message.drive_twist.linear.x = (left_y_axis + right_y_axis) / 2.0 + drive_message.drive_twist.angular.z = (right_y_axis - left_y_axis) / 2.0 return drive_message 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 9eca7ca..099b818 100644 --- a/software/ros_packages/ground_station/src/Framework/InputSystems/SpaceNavControlSender.py +++ b/software/ros_packages/ground_station/src/Framework/InputSystems/SpaceNavControlSender.py @@ -160,20 +160,7 @@ class SpaceNavControlSender(QtCore.QThread): elif self.current_control_mode == self.ARM_MODE: pass - def send_mining_commands(self): - linear_z = self.spnav_states["linear_z"] - angular_y = self.spnav_states["angular_y"] - message = MiningControlMessage() - - message.lift_set_absolute = 1024 - message.tilt_set_absolute = 1024 - - message.lift_set_relative = linear_z * MINING_LIFT_SCALAR if abs(linear_z) > Z_LINEAR_DEADBAND else 0 - message.tilt_set_relative = angular_y * MINING_TILT_SCALAR if abs(angular_y) > Y_ANGULAR_DEADBAND else 0 - message.cal_factor = -1 - - self.mining_control_publisher.publish(message) # print self.spnav_states["linear_z"], self.spnav_states["angular_y"] def connect_signals_and_slots(self): diff --git a/software/ros_packages/ground_station/src/Framework/InputSystems/ControllerControlSender.py b/software/ros_packages/ground_station/src/Framework/InputSystems/XBOXControllerControlSender.py similarity index 61% rename from software/ros_packages/ground_station/src/Framework/InputSystems/ControllerControlSender.py rename to software/ros_packages/ground_station/src/Framework/InputSystems/XBOXControllerControlSender.py index e71ecd3..0412966 100644 --- a/software/ros_packages/ground_station/src/Framework/InputSystems/ControllerControlSender.py +++ b/software/ros_packages/ground_station/src/Framework/InputSystems/XBOXControllerControlSender.py @@ -9,6 +9,7 @@ from time import time import rospy from rover_arm.msg import ArmControlMessage +from rover_control.msg import MiningControlMessage ##################################### # Global Variables @@ -18,6 +19,7 @@ GAME_CONTROLLER_NAME = "Afterglow Gamepad for Xbox 360" DRIVE_COMMAND_HERTZ = 20 RELATIVE_ARM_CONTROL_TOPIC = "/rover_arm/control/relative" +MINING_CONTROL_TOPIC = "/rover_control/mining/control" BASE_SCALAR = 0.003 SHOULDER_SCALAR = 0.002 @@ -32,6 +34,15 @@ LEFT_Y_AXIS_DEADZONE = 1500 RIGHT_X_AXIS_DEADZONE = 1500 RIGHT_Y_AXIS_DEADZONE = 1500 +THUMB_STICK_MAX = 32768.0 + +MINING_LIFT_SCALAR = 5 +MINING_TILT_SCALAR = 5 + + +COLOR_GREEN = "background-color:darkgreen; border: 1px solid black;" +COLOR_NONE = "border: 1px solid black;" + ##################################### # Controller Class Definition @@ -120,7 +131,7 @@ class XBOXController(QtCore.QThread): def __setup_controller(self): for device in devices.gamepads: - print device + # print device if device.name == GAME_CONTROLLER_NAME: self.gamepad = device @@ -146,15 +157,23 @@ class XBOXController(QtCore.QThread): ##################################### # Controller Class Definition ##################################### -class ControllerControlSender(QtCore.QThread): +class XBOXControllerControlSender(QtCore.QThread): + STATES = [ + "ARM", + "MINING" + ] + + xbox_control_arm_stylesheet_update_ready__signal = QtCore.pyqtSignal(str) + xbox_control_mining_stylesheet_update_ready__signal = QtCore.pyqtSignal(str) def __init__(self, shared_objects): - super(ControllerControlSender, self).__init__() + super(XBOXControllerControlSender, self).__init__() # ########## Reference to class init variables ########## self.shared_objects = shared_objects - self.video_coordinator = self.shared_objects["threaded_classes"]["Video Coordinator"] - self.right_screen = self.shared_objects["screens"]["right_screen"] + self.left_screen = self.shared_objects["screens"]["left_screen"] + self.xbox_mode_arm_label = self.left_screen.xbox_mode_arm_label # type: QtWidgets.QLabel + self.xbox_mode_mining_label = self.left_screen.xbox_mode_mining_label # type: QtWidgets.QLabel # ########## Get the settings instance ########## self.settings = QtCore.QSettings() @@ -173,6 +192,12 @@ class ControllerControlSender(QtCore.QThread): self.relative_arm_control_publisher = rospy.Publisher(RELATIVE_ARM_CONTROL_TOPIC, ArmControlMessage, queue_size=1) + self.mining_control_publisher = rospy.Publisher(MINING_CONTROL_TOPIC, MiningControlMessage, queue_size=1) + + self.current_state = self.STATES.index("ARM") + self.state_just_changed = False + + self.last_xbox_button_state = 0 def run(self): self.logger.debug("Starting Joystick Thread") @@ -180,7 +205,12 @@ class ControllerControlSender(QtCore.QThread): while self.run_thread_flag: start_time = time() - self.process_and_send_arm_control() + self.change_control_state_if_needed() + + if self.current_state == self.STATES.index("ARM"): + self.process_and_send_arm_control() + elif self.current_state == self.STATES.index("MINING"): + self.send_mining_commands() time_diff = time() - start_time @@ -189,9 +219,32 @@ class ControllerControlSender(QtCore.QThread): self.logger.debug("Stopping Joystick Thread") def connect_signals_and_slots(self): - pass + self.xbox_control_arm_stylesheet_update_ready__signal.connect(self.xbox_mode_arm_label.setStyleSheet) + self.xbox_control_mining_stylesheet_update_ready__signal.connect(self.xbox_mode_mining_label.setStyleSheet) + + def change_control_state_if_needed(self): + if self.state_just_changed: + self.xbox_control_arm_stylesheet_update_ready__signal.emit(COLOR_NONE) + self.xbox_control_mining_stylesheet_update_ready__signal.emit(COLOR_GREEN) + self.state_just_changed = False + + xbox_state = self.controller.controller_states["xbox_button"] + + if self.last_xbox_button_state == 0 and xbox_state == 1: + self.current_state += 1 + self.current_state = self.current_state % len(self.STATES) + self.state_just_changed = True + self.last_xbox_button_state = 1 + + elif self.last_xbox_button_state == 1 and xbox_state == 0: + self.last_xbox_button_state = 0 def process_and_send_arm_control(self): + if self.state_just_changed: + self.xbox_control_arm_stylesheet_update_ready__signal.emit(COLOR_GREEN) + self.xbox_control_mining_stylesheet_update_ready__signal.emit(COLOR_NONE) + self.state_just_changed = False + message = ArmControlMessage() should_publish = False @@ -200,13 +253,13 @@ class ControllerControlSender(QtCore.QThread): right_trigger = self.controller.controller_states["right_trigger"] left_x_axis = self.controller.controller_states["left_x_axis"] if abs(self.controller.controller_states[ - "left_x_axis"]) > LEFT_X_AXIS_DEADZONE else 0 + "left_x_axis"]) > LEFT_X_AXIS_DEADZONE else 0 left_y_axis = self.controller.controller_states["left_y_axis"] if abs(self.controller.controller_states[ - "left_y_axis"]) > LEFT_Y_AXIS_DEADZONE else 0 + "left_y_axis"]) > LEFT_Y_AXIS_DEADZONE else 0 right_y_axis = self.controller.controller_states["right_y_axis"] if abs(self.controller.controller_states[ - "right_y_axis"]) > RIGHT_Y_AXIS_DEADZONE else 0 + "right_y_axis"]) > RIGHT_Y_AXIS_DEADZONE else 0 right_x_axis = self.controller.controller_states["right_x_axis"] if abs(self.controller.controller_states[ - "right_x_axis"]) > RIGHT_X_AXIS_DEADZONE else 0 + "right_x_axis"]) > RIGHT_X_AXIS_DEADZONE else 0 # print left_x_axis, ":", left_y_axis, ":", right_x_axis, ":", right_y_axis @@ -215,19 +268,38 @@ class ControllerControlSender(QtCore.QThread): if left_trigger > 25: should_publish = True - message.base = ((left_x_axis / 32768.0) * BASE_SCALAR) * left_trigger_ratio - message.shoulder = (-(left_y_axis / 32768.0) * SHOULDER_SCALAR) * left_trigger_ratio - message.elbow = ((right_y_axis / 32768.0) * ELBOW_SCALAR) * left_trigger_ratio - message.roll = (-(right_x_axis / 32768.0) * ROLL_SCALAR) * left_trigger_ratio + message.base = ((left_x_axis / THUMB_STICK_MAX) * BASE_SCALAR) * left_trigger_ratio + message.shoulder = ((left_y_axis / THUMB_STICK_MAX) * SHOULDER_SCALAR) * left_trigger_ratio + message.elbow = (-(right_y_axis / THUMB_STICK_MAX) * ELBOW_SCALAR) * left_trigger_ratio + message.roll = (-(right_x_axis / THUMB_STICK_MAX) * ROLL_SCALAR) * left_trigger_ratio elif right_trigger > 25: should_publish = True - message.wrist_roll = ((right_x_axis / 32768.0) * WRIST_ROLL_SCALAR) * right_trigger_ratio - message.wrist_pitch = ((left_y_axis / 32768.0) * WRIST_PITCH_SCALAR) * right_trigger_ratio + message.wrist_roll = ((right_x_axis / THUMB_STICK_MAX) * WRIST_ROLL_SCALAR) * right_trigger_ratio + message.wrist_pitch = (-(left_y_axis / THUMB_STICK_MAX) * WRIST_PITCH_SCALAR) * right_trigger_ratio if should_publish: self.relative_arm_control_publisher.publish(message) + def send_mining_commands(self): + + left_y_axis = self.controller.controller_states["left_y_axis"] if abs(self.controller.controller_states["left_y_axis"]) > LEFT_Y_AXIS_DEADZONE else 0 + right_y_axis = self.controller.controller_states["right_y_axis"] if abs(self.controller.controller_states[ + "right_y_axis"]) > RIGHT_Y_AXIS_DEADZONE else 0 + + if left_y_axis or right_y_axis: + + message = MiningControlMessage() + + message.lift_set_absolute = 1024 + message.tilt_set_absolute = 1024 + + message.lift_set_relative = (-(left_y_axis / THUMB_STICK_MAX) * MINING_LIFT_SCALAR) + message.tilt_set_relative = ((right_y_axis / THUMB_STICK_MAX) * MINING_TILT_SCALAR) + message.cal_factor = -1 + + self.mining_control_publisher.publish(message) + 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/Resources/Ui/left_screen.ui b/software/ros_packages/ground_station/src/Resources/Ui/left_screen.ui index fc9ae74..627e6d2 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 @@ -2574,13 +2574,13 @@ N/A - 640 + 470 360 - 640 + 470 360 @@ -3170,6 +3170,170 @@ N/A + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Vertical + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + 6 + + + + + + 12 + 75 + true + + + + Xbox Mode + + + + + + + 0 + + + + + + 120 + 120 + + + + + 120 + 120 + + + + background-color:darkgreen; border: 1px solid black; + + + Arm + + + Qt::AlignCenter + + + + + + + + + 0 + + + + + + 120 + 120 + + + + + 120 + 120 + + + + border: 1px solid black; + + + Mining + + + Qt::AlignCenter + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Vertical + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + diff --git a/software/ros_packages/ground_station/src/ground_station.py b/software/ros_packages/ground_station/src/ground_station.py index 3fee80c..a155de6 100644 --- a/software/ros_packages/ground_station/src/ground_station.py +++ b/software/ros_packages/ground_station/src/ground_station.py @@ -15,15 +15,14 @@ import Framework.StartupSystems.ROSMasterChecker as ROSMasterChecker import Framework.LoggingSystems.Logger as Logger import Framework.VideoSystems.RoverVideoCoordinator as RoverVideoCoordinator import Framework.MapSystems.RoverMapCoordinator as RoverMapCoordinator -import Framework.InputSystems.JoystickControlSender as JoystickControlSender -import Framework.InputSystems.ControllerControlSender as ControllerControlSender +import Framework.InputSystems.LogitechControllerControlSender as JoystickControlSender +import Framework.InputSystems.XBOXControllerControlSender as ControllerControlSender 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 import Framework.MiscSystems.MiningCore as MiningCore import Framework.MiscSystems.BashConsoleCore as BashConsoleCore import Framework.MiscSystems.MiscArmCore as MiscArmCore @@ -112,14 +111,13 @@ class GroundStation(QtCore.QObject): # ##### Instantiate Threaded Classes ###### self.__add_thread("Video Coordinator", RoverVideoCoordinator.RoverVideoCoordinator(self.shared_objects)) self.__add_thread("Map Coordinator", RoverMapCoordinator.RoverMapCoordinator(self.shared_objects)) - self.__add_thread("Joystick Sender", JoystickControlSender.JoystickControlSender(self.shared_objects)) - self.__add_thread("Controller Sender", ControllerControlSender.ControllerControlSender(self.shared_objects)) + self.__add_thread("Joystick Sender", JoystickControlSender.LogitechControllerControlSender(self.shared_objects)) + self.__add_thread("Controller Sender", ControllerControlSender.XBOXControllerControlSender(self.shared_objects)) self.__add_thread("Speed and Heading", SpeedAndHeading.SpeedAndHeadingIndication(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)) self.__add_thread("Bash Console", BashConsoleCore.BashConsole(self.shared_objects)) self.__add_thread("Misc Arm", MiscArmCore.MiscArm(self.shared_objects)) self.__add_thread("RDF", RDFCore.RDF(self.shared_objects)) diff --git a/software/ros_packages/rover_main/launch/ground_station/topic_transport_senders.launch b/software/ros_packages/rover_main/launch/ground_station/topic_transport_senders.launch index 78225ea..ff6ba20 100644 --- a/software/ros_packages/rover_main/launch/ground_station/topic_transport_senders.launch +++ b/software/ros_packages/rover_main/launch/ground_station/topic_transport_senders.launch @@ -9,7 +9,7 @@ [{name: "/rover_control/command_control/ground_station_drive", compress: true, rate: 15.0}, {name: "/rover_control/tower/pan_tilt/control", compress: true, rate: 30.0}, {name: "/rover_control/chassis/pan_tilt/control", compress: true, rate: 30.0}, - {name: "/rover_control/mining/control", compress: true, rate: 15.0}, + {name: "/rover_control/mining/control", compress: true, rate: 30.0}, {name: "/rover_arm/control/relative", compress: true, rate: 30.0}]