From d9ad3bce0ce8a605b4f0289b5488363585362df1 Mon Sep 17 00:00:00 2001 From: waldluis Date: Fri, 9 Jun 2023 10:08:27 +0200 Subject: [PATCH] Robot comments extended, Docu updated --- documentation/Robot.docx | Bin 84848 -> 85459 bytes software/roboter/raspy/defines.py | 2 -- software/roboter/raspy/functions.py | 29 ++++++++++++++++-------- software/roboter/raspy/mainProg.py | 2 +- software/roboter/raspy/raspy_sensors.py | 11 ++++----- 5 files changed, 25 insertions(+), 19 deletions(-) diff --git a/documentation/Robot.docx b/documentation/Robot.docx index e4d0b0f5581832586136cfa30b2346c934aa260e..d042d653d036fc76c74acd17c08cb1b1c3970c81 100644 GIT binary patch delta 19930 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 diff --git a/software/roboter/raspy/defines.py b/software/roboter/raspy/defines.py index 5e76927..aea9fe1 100644 --- a/software/roboter/raspy/defines.py +++ b/software/roboter/raspy/defines.py @@ -65,7 +65,6 @@ ALLSENSORDATA = { "ActionID": "" } -# TODO When sensor is available POSITION = { "Position": "" } @@ -115,7 +114,6 @@ ALLPLANTDATA = [ PLANTDATA ] -# TODO When sensor is available POSITION = { "Position": "", "Timestamp": "" diff --git a/software/roboter/raspy/functions.py b/software/roboter/raspy/functions.py index 1e7d70f..b38806e 100644 --- a/software/roboter/raspy/functions.py +++ b/software/roboter/raspy/functions.py @@ -18,6 +18,8 @@ def measure_send_data(plantID, actionID, client: mqtt.Client): """ Reads all sensors and publishes data via MQTT in form of SENSORDATA + ***Function is only neccessary for driving without color codes*** + Args: plantID (_type_): plant to measure actionID (_type_): current ID of driving action @@ -58,6 +60,8 @@ def drive_plant_thread(plantID, actionID, client: mqtt.Client): errorCode = os.system(f'sshpass -p maker ssh robot@ev3dev.local python3 /home/robot/Programme/plant_{plantID}.py') + # Error handling for drive operation + # Abort when drive operation at start when error occurs if errorCode != 0: if errorCode == 65280: errorMessage = "EV3 not connected" @@ -67,19 +71,20 @@ def drive_plant_thread(plantID, actionID, client: mqtt.Client): logging.info(f"{errorMessage}, Drive Plant aborted, Robot at starting position") client.publish(Topics["ROBOT_DATA_ERROR"], f"{errorMessage}, Drive Plant aborted, Robot at starting position", qos=1) client.publish(Topics["ROBOT_DATA_ROBOTREADY"], "True", qos=1) - return logging.info("Measuring Sensors") measure_send_data(plantID, actionID, client) - # TODO How to Handle Pictures and PlantID - logging.info("Taking Picture") - sendPicture(client) + # Taking Picture not fully implemented + # logging.info("Taking Picture") + # sendPicture(client) logging.info("Robot driving home") errorCode = os.system(f'sshpass -p maker ssh robot@ev3dev.local python3 /home/robot/Programme/drive_back.py {plantID}') + # Error handling for drive operation + # Abort when drive operation at start when error occurs if errorCode != 0: if errorCode == 65280: errorMessage = "EV3 not connected" @@ -119,10 +124,11 @@ def drive_plant_all_thread(plantIDs: list, actionID, client: mqtt.Client): allPlantData["ActionID"] = actionID for plant in plantIDs: - # FIXME Only possible with color codes logging.info(f"Robot Driving to plant {plant}") errorCode = os.system(f'sshpass -p maker ssh robot@ev3dev.local python3 /home/robot/Programme/drive_plant.py {plant}') + # Error handling for drive operation + # Abort when drive operation at start when error occurs if errorCode != 0: if errorCode == 65280: errorMessage = "EV3 not connected" @@ -149,11 +155,13 @@ def drive_plant_all_thread(plantIDs: list, actionID, client: mqtt.Client): allPlantData["SensorData"].append(sensordata) - # TODO How to Handle Pictures and PlantID - logging.info("Taking Picture") - sendPicture(client) + # Taking Picture not fully implemented + # logging.info("Taking Picture") + # sendPicture(client) errorCode = os.system(f'sshpass -p maker ssh robot@ev3dev.local python3 /home/robot/Programme/drive_arm.py {plant}') + # Error handling for drive operation + # Abort when drive operation at start when error occurs if errorCode != 0: if errorCode == 65280: errorMessage = "EV3 not connected" @@ -170,6 +178,8 @@ def drive_plant_all_thread(plantIDs: list, actionID, client: mqtt.Client): logging.info("Robot driving home") + # Error handling for drive operation + # Abort when drive operation at start when error occurs errorCode = os.system(f'sshpass -p maker ssh robot@ev3dev.local python3 /home/robot/Programme/drive_back_straight.py') if errorCode != 0: if errorCode == 65280: @@ -215,7 +225,6 @@ def drive_plant(client: mqtt.Client, userdata, message: mqtt.MQTTMessage): thread.start() -# FIXME Only possible with color codes def drive_plant_all(client: mqtt.Client, userdata, message: mqtt.MQTTMessage): """ Function to drive to plants according to request @@ -254,7 +263,6 @@ def get_position(clients: mqtt.Client, userdata, message: mqtt.MQTTMessage): """ logging.info("Received position request") - # TODO Write GPS Sensor Function position = { "Position": "" } @@ -266,6 +274,7 @@ def get_batteryStatus(client: mqtt.Client, userdata, message: mqtt.MQTTMessage): """ Callback function for battery status request Function to read battery status from EV3 and send via MQTT in form of BATTERY + Current battery level is stored in "voltage_now" file Reading battery level via SSH script execution Battery level shown in Volts: 8,5V -> 100% diff --git a/software/roboter/raspy/mainProg.py b/software/roboter/raspy/mainProg.py index c5fb46d..d6037fe 100644 --- a/software/roboter/raspy/mainProg.py +++ b/software/roboter/raspy/mainProg.py @@ -45,7 +45,7 @@ def on_connect(client: mqtt.Client, userdata, flags, rc): def main(): """ - Initialises MQTT and Sensors + Initialises MQTT Runs forever and controlls all robot functions """ logging.basicConfig(filename="robot.log", filemode="a", encoding="utf-8", level=logging.DEBUG, format='%(asctime)s %(name)s %(levelname)s %(message)s', diff --git a/software/roboter/raspy/raspy_sensors.py b/software/roboter/raspy/raspy_sensors.py index 0bb4770..8047a5b 100644 --- a/software/roboter/raspy/raspy_sensors.py +++ b/software/roboter/raspy/raspy_sensors.py @@ -99,6 +99,7 @@ def readSensors(sensorData): """ Read DHT22, TSL2561 and Humidity Sensor Dictionary is passed to ensure that values are available when errors occur + When error occurs during reading of sensor, affected values are set to 0 Args: sensorData (dictionary): Dictionary of type SENSORDATA @@ -114,7 +115,7 @@ def readSensors(sensorData): try: sensorData["AirTemperature"], sensorData["AirHumidity"] = readDHT22() except Exception as e: - sensorData["AirHumidity"] = 0 # No value returend if error occurs -> setting dummy value + sensorData["AirHumidity"] = 0 # No value returend if error occurs -> setting safe values sensorData["AirTemperature"] = 0 errorMessage = str(e) + "\n" # Appending received error message to later forward all occured errors @@ -122,14 +123,14 @@ def readSensors(sensorData): try: sensorData["Brightness"] = readTSL2561() except Exception as e: - sensorData["Brightness"] = 0 # No value returend if error occurs -> setting dummy value + sensorData["Brightness"] = 0 # No value returend if error occurs -> setting safe value errorMessage = errorMessage + str(e) + "\n" # Appending received error message to later forward all occured errors # read YL-69 try: sensorData["SoilMoisture"] = readMCP3008() except Exception as e: - sensorData["SoilMoisture"] = 0 # No value returend if error occurs -> setting dummy value + sensorData["SoilMoisture"] = 0 # No value returend if error occurs -> setting safe value errorMessage = errorMessage + str(e) + "\n" # Appending received error message to later forward all occured errors # raise combined error message @@ -146,15 +147,13 @@ def takePicture(): try: camera = PiCamera() except: - # raise Exception("Camera not connected") - pass + raise Exception("Camera not connected") camera.start_preview() camera.capture("picture.png") camera.stop_preview() -# TODO - read position with sensor def readPosition(): """ Read and return Position