From 23035c11bab486ab93d2565c891b2b8ac04d4636 Mon Sep 17 00:00:00 2001 From: Corwin Perren Date: Thu, 17 May 2018 21:46:59 -0700 Subject: [PATCH] Changed code so rover can run without FrSky for EXPO --- .../UDEV_rules/99-rover-usb-serial.rules | 4 +- .../firmware/motor_driver/motor_driver.ino | 2 +- .../src/Framework/StatusSystems/StatusCore.py | 33 --- .../src/Resources/Images/osurclogo.png | Bin 22714 -> 22485 bytes .../src/Resources/Ui/left_screen.ui | 207 ++++++++++++++++-- .../ros_packages/rover_arm/src/rover_arm.cpp | 88 +++++++- .../control_coordinators/drive_coordinator.py | 8 +- .../src/drive_control/drive_control.py | 10 +- .../rover_main/launch/rover/control.launch | 18 +- 9 files changed, 291 insertions(+), 79 deletions(-) diff --git a/software/environment/rover/UDEV_rules/99-rover-usb-serial.rules b/software/environment/rover/UDEV_rules/99-rover-usb-serial.rules index 7ef3f03..b2abd8a 100644 --- a/software/environment/rover/UDEV_rules/99-rover-usb-serial.rules +++ b/software/environment/rover/UDEV_rules/99-rover-usb-serial.rules @@ -22,4 +22,6 @@ SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", ATTRS{seria SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", ATTRS{serial}=="NM2UFVE1", ENV{ID_USB_INTERFACE_NUM}=="02", SYMLINK+="rover/ttyIRIS_2_2" SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", ATTRS{serial}=="NM2UFVE1", ENV{ID_USB_INTERFACE_NUM}=="03", SYMLINK+="rover/ttyIRIS_2_3" -SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="AH05K2Y8", SYMLINK+="rover/ttyTEST" \ No newline at end of file +SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="AH05K2Y8", SYMLINK+="rover/ttyLEFT" +SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A906H89E", SYMLINK+="rover/ttyRIGHT" +SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A906H7P0", SYMLINK+="rover/ttyREAR" \ No newline at end of file diff --git a/software/firmware/motor_driver/motor_driver.ino b/software/firmware/motor_driver/motor_driver.ino index dc504d8..44a2933 100644 --- a/software/firmware/motor_driver/motor_driver.ino +++ b/software/firmware/motor_driver/motor_driver.ino @@ -53,7 +53,7 @@ void setup() { setup_hardware(); num_modbus_registers = sizeof(modbus_data) / sizeof(modbus_data[0]); - slave.begin(2000000); // baud-rate at 19200 + slave.begin(115200); // baud-rate at 19200 slave.setTimeOut(150); Serial.begin(9600); 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 00a339b..2a44149 100644 --- a/software/ros_packages/ground_station/src/Framework/StatusSystems/StatusCore.py +++ b/software/ros_packages/ground_station/src/Framework/StatusSystems/StatusCore.py @@ -67,9 +67,6 @@ class SensorCore(QtCore.QThread): 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.under_cam = self.screen_main_window.under_cam # type: QtWidgets.QLabel - self.bogie_right = self.screen_main_window.right_bogie # type: QtWidgets.QLabel - self.bogie_left = self.screen_main_window.left_bogie # type: QtWidgets.QLabel - self.bogie_rear = self.screen_main_window.rear_bogie # type: QtWidgets.QLabel self.clock = self.screen_main_window.clock_qlcdnumber # type: QtWidgets.QLCDNumber self.cpu = self.screen_main_window.cpu # type: QtWidgets.QLabel self.ram = self.screen_main_window.ram # type: QtWidgets.QLabel @@ -78,7 +75,6 @@ class SensorCore(QtCore.QThread): # ########## subscriptions pulling data from system_statuses_node.py ########## self.camera_status = rospy.Subscriber(CAMERA_TOPIC_NAME, CameraStatuses, self.__camera_callback) - self.bogie_status = rospy.Subscriber(BOGIE_TOPIC_NAME, BogieStatuses, self.__bogie_callback) self.frsky_status = rospy.Subscriber(FRSKY_TOPIC_NAME, FrSkyStatus, self.__frsky_callback) self.gps_status = rospy.Subscriber(GPS_TOPIC_NAME, GPSInfo, self.__gps_callback) self.jetson_status = rospy.Subscriber(JETSON_TOPIC_NAME, JetsonInfo, self.__jetson_callback) @@ -140,32 +136,6 @@ class SensorCore(QtCore.QThread): else: self.frsky_stylesheet_change_ready__signal.emit("background-color: darkgreen;") - def __bogie_callback(self, data): - self.bogie_msg.bogie_connection_1 = data.bogie_connection_1 - self.bogie_msg.bogie_connection_2 = data.bogie_connection_2 - self.bogie_msg.bogie_connection_3 = data.bogie_connection_3 - - if data.bogie_connection_1 is False: - # self.bogie_right.setStyleSheet("background-color: darkred;") - self.bogie_connection_1_stylesheet_change_ready__signal.emit("background-color: darkred;") - else: - # self.bogie_right.setStyleSheet("background-color: darkgreen;") - self.bogie_connection_1_stylesheet_change_ready__signal.emit("background-color: darkgreen;") - - if data.bogie_connection_2 is False: - # self.bogie_left.setStyleSheet("background-color: darkred;") - self.bogie_connection_2_stylesheet_change_ready__signal.emit("background-color: darkred;") - else: - # self.bogie_left.setStyleSheet("background-color: darkgreen;") - self.bogie_connection_2_stylesheet_change_ready__signal.emit("background-color: darkgreen;") - - if data.bogie_connection_3 is False: - # self.bogie_rear.setStyleSheet("background-color: darkred;") - self.bogie_connection_3_stylesheet_change_ready__signal.emit("background-color: darkred;") - else: - # self.bogie_rear.setStyleSheet("background-color: darkgreen;") - self.bogie_connection_3_stylesheet_change_ready__signal.emit("background-color: darkgreen;") - def __jetson_callback(self, data): self.jetson_cpu_update_ready__signal.emit("TX2 CPU\n" + str(data.jetson_CPU) + "%") @@ -238,9 +208,6 @@ class SensorCore(QtCore.QThread): self.jetson_emmc_stylesheet_change_ready__signal.connect(self.emmc.setStyleSheet) self.jetson_gpu_temp_update_ready__signal.connect(self.gpu_temp.setText) self.jetson_gpu_temp_stylesheet_change_ready__signal.connect(self.gpu_temp.setStyleSheet) - self.bogie_connection_1_stylesheet_change_ready__signal.connect(self.bogie_right.setStyleSheet) - self.bogie_connection_2_stylesheet_change_ready__signal.connect(self.bogie_left.setStyleSheet) - self.bogie_connection_3_stylesheet_change_ready__signal.connect(self.bogie_rear.setStyleSheet) self.camera_zed_stylesheet_change_ready__signal.connect(self.zed.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) diff --git a/software/ros_packages/ground_station/src/Resources/Images/osurclogo.png b/software/ros_packages/ground_station/src/Resources/Images/osurclogo.png index e5ea8473336b96b856a2e217c36d0ef6af367951..7107d7f1a88aa946395a9534696219304cc0975d 100644 GIT binary patch literal 22485 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 Wb`&wI41Ej$0000 - + @@ -322,7 +322,7 @@ Connected - + @@ -395,7 +395,7 @@ Connected - background-color:darkred; + background-color:darkgreen; QFrame::NoFrame @@ -443,7 +443,7 @@ Connected - background-color:darkred; + background-color:darkgreen; FrSky @@ -485,7 +485,7 @@ Connected false - background-color:darkred; + background-color:darkgreen; 3D Nav Mouse @@ -524,7 +524,7 @@ Connected - background-color:darkred; + background-color:darkgreen; QFrame::NoFrame @@ -538,7 +538,7 @@ Connected - + @@ -611,7 +611,7 @@ Connected false - background-color:darkred; + background-color:darkgreen; GPS @@ -623,7 +623,7 @@ Fix - + 0 @@ -656,8 +656,8 @@ Fix background-color:darkred; - Right Bogie -Connected + Middle Left Wheel +Disconnected Qt::AlignCenter @@ -665,7 +665,7 @@ Connected - + 0 @@ -692,13 +692,13 @@ Connected - background-color:darkred; + background-color:darkgreen; QFrame::NoFrame - Rear Bogie + Rear Left Wheel Connected @@ -707,7 +707,7 @@ Connected - + 0 @@ -734,13 +734,13 @@ Connected - background-color:darkred; + background-color:darkgreen; QFrame::NoFrame - Left Bogie + Front Left Wheel Connected @@ -748,7 +748,7 @@ Connected - + @@ -782,7 +782,8 @@ Connected QFrame::NoFrame - ZED Connected + ZED +Disconnected Qt::AlignCenter @@ -815,6 +816,174 @@ Connected + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 9999999 + 9999999 + + + + + 10 + 75 + true + + + + background-color:darkgreen; + + + QFrame::NoFrame + + + Front Right Wheel +Connected + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 9999999 + 9999999 + + + + + 10 + 75 + true + + + + background-color:darkred; + + + QFrame::NoFrame + + + Battery Voltage +N/A + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 9999999 + 9999999 + + + + + 10 + 75 + true + + + + background-color:darkred; + + + QFrame::NoFrame + + + Middle Right Wheel +Disconnected + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 9999999 + 9999999 + + + + + 10 + 75 + true + + + + background-color:darkgreen; + + + QFrame::NoFrame + + + Rear Right Wheel +Connected + + + Qt::AlignCenter + + + diff --git a/software/ros_packages/rover_arm/src/rover_arm.cpp b/software/ros_packages/rover_arm/src/rover_arm.cpp index 7c23cb1..cf134c2 100644 --- a/software/ros_packages/rover_arm/src/rover_arm.cpp +++ b/software/ros_packages/rover_arm/src/rover_arm.cpp @@ -11,20 +11,84 @@ using namespace std; int device_address = 1; -int main(int argc, char** argv){ - smbus busHandle = smOpenBus("/dev/ttyUSB0"); +////////// Global Variables ////////// +// ROS Parameter Defaults +const string default_port = "/dev/ttyUSB0"; - if (busHandle >= 0) { - cout << "Successfully connected bus" << endl; -// deviceAddress=ui->deviceAddress->value(); - } else - cout << "Couldn't connect to bus"; - while(1){ - smSetParameter(busHandle, device_address, SMP_FAULTS, 0); - smSetParameter(busHandle, device_address, SMP_CONTROL_BITS1, SMP_CB1_ENABLE); - smSetParameter(busHandle, device_address, SMP_ABSOLUTE_SETPOINT, 1000); - cout << "Test" << endl; +// Axis Defaults +const smint32 axis1_max_count = 100000; +float axis1_max_degrees = 180.0; + +const smint32 axis2_max_count = 100000; + +const smint32 axis3_max_count = 100000; + +const smint32 axis4_max_count = 100000; + +const smint32 axis5_max_count = 320000; + +const smint32 axis6_max_count = 100000; + + +class RoverArm{ +public: + RoverArm(int argc, char** argv){ + ros::init(argc, argv, "rover_arm"); + + node_handle = new ros::NodeHandle("~"); + + node_handle->param("port", arm_port, default_port); + + + // Connect to arm, exit if failed + arm_bus_handle = smOpenBus(arm_port.c_str()); + + if(arm_bus_handle < 0){ + ROS_ERROR("Could not connect to arm"); + } } + void run(){ + char dir = 0; + + printf("OK?: %d", ros::ok()); + + while(ros::ok()){ + smSetParameter(arm_bus_handle, device_address, SMP_FAULTS, 0); + smSetParameter(arm_bus_handle, device_address, SMP_CONTROL_BITS1, SMP_CB1_ENABLE); + + smint32 status = 0; + while(!(status & STAT_TARGET_REACHED)){ + smRead1Parameter(arm_bus_handle, device_address, SMP_STATUS, &status); + } + + dir = !dir; + + if(dir){ + smSetParameter(arm_bus_handle, device_address, SMP_ABSOLUTE_SETPOINT, 0); + }else{ + smSetParameter(arm_bus_handle, device_address, SMP_ABSOLUTE_SETPOINT, 330000); + } + + ros::spinOnce(); + } + + ROS_ERROR("Shutting down."); + } +private: + ros::NodeHandle *node_handle; + + string arm_port; + smbus arm_bus_handle; + + + +}; + + + +int main(int argc, char** argv){ + RoverArm rover_arm(argc, argv); + rover_arm.run(); } \ No newline at end of file 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..96c99de 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 @@ -91,10 +91,10 @@ class DriveCoordinator(object): sleep(max(self.wait_time - time_diff, 0)) def process_drive_commands(self): - if not self.drive_command_data["iris"]["message"].ignore_drive_control: - self.send_drive_control_command(self.drive_command_data["iris"]) - else: - self.send_drive_control_command(self.drive_command_data["ground_station"]) + # if not self.drive_command_data["iris"]["message"].ignore_drive_control: + # self.send_drive_control_command(self.drive_command_data["iris"]) + # else: + self.send_drive_control_command(self.drive_command_data["ground_station"]) def send_drive_control_command(self, drive_command_data): 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 0da5859..6d45284 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 @@ -68,6 +68,11 @@ class DriveControl(object): self.port = rospy.get_param("~port", DEFAULT_PORT) self.baud = rospy.get_param("~baud", DEFAULT_BAUD) + print self.port + + self.first_motor_id = rospy.get_param("~first_motor_id", FIRST_MOTOR_ID) + self.second_motor_id = rospy.get_param("~second_motor_id", SECOND_MOTOR_ID) + self.first_motor_inverted = rospy.get_param("~invert_first_motor", DEFAULT_INVERT) self.second_motor_inverted = rospy.get_param("~invert_second_motor", DEFAULT_INVERT) @@ -117,6 +122,7 @@ class DriveControl(object): print "Error occurred:", error if (time() - self.bogie_last_seen) > BOGIE_LAST_SEEN_TIMEOUT: + print "Bogie not seen for", BOGIE_LAST_SEEN_TIMEOUT, "seconds. Exiting." return # Exit so respawn can take over time_diff = time() - start_time @@ -124,8 +130,8 @@ class DriveControl(object): sleep(max(self.wait_time - time_diff, 0)) def connect_to_bogie(self): - self.first_motor = minimalmodbus.Instrument(self.port, FIRST_MOTOR_ID) - self.second_motor = minimalmodbus.Instrument(self.port, SECOND_MOTOR_ID) + self.first_motor = minimalmodbus.Instrument(self.port, int(self.first_motor_id)) + self.second_motor = minimalmodbus.Instrument(self.port, int(self.second_motor_id)) self.__setup_minimalmodbus_for_485() def send_drive_control_message(self): diff --git a/software/ros_packages/rover_main/launch/rover/control.launch b/software/ros_packages/rover_main/launch/rover/control.launch index f5042ed..37dbc7f 100644 --- a/software/ros_packages/rover_main/launch/rover/control.launch +++ b/software/ros_packages/rover_main/launch/rover/control.launch @@ -1,18 +1,20 @@ - - - - + + + + - + + + - + @@ -20,9 +22,11 @@ - + + +