diff --git a/message_sender.py b/message_sender.py new file mode 100644 index 0000000000000000000000000000000000000000..ba5494bcddda38a4bb39247e6a70c80e8c81489e --- /dev/null +++ b/message_sender.py @@ -0,0 +1,260 @@ +# -*- coding: utf-8 -*- +""" +Created on Fri Mar 4 14:28:51 2022 + +@author: s3340992 +""" + +from abc import ABC +from shapely.geometry import Point, LineString +from shapely.geometry.polygon import Polygon +import numpy as np +from datetime import datetime, timedelta +import datetime +import time +import json +from vehicle import vehicle +from node import node +import paho.mqtt.client as mqtt +import cv2 +import tkinter + +# MQTT setup +the_hostname = "AGV_simulator" +MQTT_SERVER = "192.168.43.195" +#MQTT_SERVER = "broker.hivemq.com" +MQTT_PATH = "VDA5050_AgvState" +MQTT_PORT = 1883 + +# vis_parameters +height = 900 +width = 1000 +color = ["red", "green", "blue", "cyan", "yellow", "magenta"] +vehicle_radius = 20 + + + + +def play_videoFile(filePath,mirror=False): + cap = cv2.VideoCapture(filePath) + cv2.namedWindow('Video Life2Coding',cv2.WINDOW_AUTOSIZE) + frameTime = 200 + while True: + ret_val, frame = cap.read() + if mirror: + frame = cv2.flip(frame, 1) + cv2.imshow('Video Life2Coding', frame) + if cv2.waitKey(frameTime) == 27: + break # esc to quit + cv2.destroyAllWindows() + +def draw_veh(canvas, pos_x, pos_y, tag, color): + canvas.create_oval(pos_x - vehicle_radius, + height - pos_y - vehicle_radius, + pos_x + vehicle_radius, + height - pos_y + vehicle_radius, + fill=color, + tag=tag) + +def abs_move(self, tag, new_x, new_y): + # Get the current object position + x, y, *_ = self.bbox(self.find_withtag(tag)[0]) + for obj in self.find_withtag(tag): + # Move the object + self.move(obj, (new_x-x), (new_y-y)) + + +# Monkey patch the `abs_move` method +tkinter.Canvas.abs_move = abs_move + +def visualization(canvas, tag, pos, color): + height = 900 + canvas.abs_move(tag, pos[0]- vehicle_radius, + height - pos[1]- vehicle_radius) + canvas.update() + +def send_msg(client, msg): + print(msg) + client.publish(MQTT_PATH, msg) + +def create_message(header_id, veh_num, time_delta, x , y, theta, time_now, last_node_id, battery_state, error_list, load_list): + #time_msg = time_null + timedelta(seconds=time_delta) + time_msg = time_now + timestamp = str(time_msg.date()) + timestamp += "T" + timestamp += str(time_msg.time()) + timestamp += "+00:00" + + battery_state_msg = { + "batteryCharge" : str(battery_state) + } + error_msg = { + "errorType" : error_list[0], + "errorLevel" : error_list[1] + } + position_msg = { + "x" : x, + "y" : y, + "theta" : theta + } + load_msg = { + "loadId" : load_list[0] + } + json_msg = { + "headerId" : header_id, + "timeStamp" : timestamp, + "manufacturer" : "TL_TUD", + "serialNumber" : veh_num, + "lastNodeId" : last_node_id, + "batteryState": battery_state_msg, + "errors" : [error_msg], + "agvPosition" : position_msg, + "loads" : [load_msg] + } + msg = json.dumps(json_msg) + print (msg) + return msg + + +def message_filter(list_pos, list_nodes, time_lastupdate): + pos = [list_pos[2], list_pos[3]] + if pos in list_nodes: + return False + elif ((list_pos[1] - time_lastupdate) > 30): + return False + else: + return True + +# The callback for when the client receives a CONNACK response from the server. +def on_connect(client, userdata, flags, rc): + if rc == 0: + print("Connected successfully") + else: + print("Connect returned result code: " + str(rc)) + +# The callback for when a PUBLISH message is received from the server. +def on_message(client, userdata, msg): + print("Received message: " + msg.topic + " -> " + msg.payload.decode("utf-8")) + +#-------------------------------------------------------------------- + +with open('simulation_runs/raw_output/log.json') as json_file: + raw_data_7 = json.load(json_file) +# create the client +client = mqtt.Client() +client.on_connect = on_connect +client.on_message = on_message + +# enable TLS +#client.tls_set(tls_version=mqtt.ssl.PROTOCOL_TLS) +#client.username_pw_set("phone", "IPOSframework123") +client.connect(MQTT_SERVER, MQTT_PORT) +#client.loop_start() +#client.subscribe(MQTT_PATH) + + +veh_1 = vehicle("1", "TUD", 0, 0, 100, 0, "0") +veh_2 = vehicle("2", "TUD", 0, 0, 100, 0, "0") +veh_3 = vehicle("3", "TUD", 0, 0, 100, 0, "0") +veh_4 = vehicle("4", "TUD", 0, 0, 100, 0, "0") +veh_5 = vehicle("5", "TUD", 0, 0, 100, 0, "0") + +# create node list +node_list = [] +# create node and appending them to the list +node_list.append(node("1", 18, 10)) +node_list.append(node("2", 6, 3.12)) +node_list.append(node("3", 14, 3.12)) +node_list.append(node("4", 14, 16.92)) +node_list.append(node("5", 6, 16.92)) +node_list.append(node("6", 2, 10)) + +# play video +#play_videoFile('Beispielvideo.mp4',False) + +#cap = cv2.VideoCapture('Beispielvideo.mp4') +#cv2.namedWindow('Video Life2Coding',cv2.WINDOW_AUTOSIZE) +#mirror = False + +# create canvas +root = tkinter.Tk() +root.title("simVis") +root.resizable(False, False) +canvas = tkinter.Canvas(root, width=width, height=height) +canvas.pack() +canvas_factor=50 + +for i in range(5): + draw_veh(canvas, 0, 0, 'veh'+str(i+1), color[i]) + +actual_time = 0 +time_interval = 0.02 +timeBegin = time.time() +time_null = time.time() +last_time_frame = 0 +for loadpoint in node_list: + canvas.create_oval(loadpoint.x*canvas_factor - 5, height - loadpoint.y*canvas_factor - 5, loadpoint.x*canvas_factor + 5, height - loadpoint.y*canvas_factor + 5, fill='dark orange') +for i in range(len(raw_data_7)): +# if (float(raw_data_7[i][1]) > last_time_frame): +# ret_val, frame = cap.read() +# if mirror: +# frame = cv2.flip(frame, 1) +# cv2.imshow('Video Life2Coding', frame) +# last_time_frame = raw_data_7[i][1] + + while (float(raw_data_7[i][1]) > actual_time): + timeEnd = time.time() + timeElapsed = timeEnd - timeBegin + actual_time += time_interval+timeElapsed//time_interval + time.sleep(time_interval-timeElapsed % time_interval) + timeBegin = time.time() + continue + else: + #time_start = time.time() + if (raw_data_7[i][0] == 1): + veh_1.update_pos(float(raw_data_7[i][2]), float(raw_data_7[i][3]), raw_data_7[i][1], node_list) + visualization(canvas, "veh1", [veh_1.pos_x*canvas_factor, veh_1.pos_y*canvas_factor], color[raw_data_7[i][0]-1]) + #print("veh_1 updated!") + if (veh_1.send_msg): + msg = create_message("1", "1", float(raw_data_7[i][1]), veh_1.pos_x, veh_1.pos_y, veh_1.theta, datetime.datetime.now(), veh_1.last_node_id, veh_1.battery_state, ["0", "WARNING"], ["1"]) + client.publish(MQTT_PATH, msg) + veh_1.last_msg_time = actual_time + veh_1.send_msg = False + elif (raw_data_7[i][0] == 2): + veh_2.update_pos(float(raw_data_7[i][2]), float(raw_data_7[i][3]), float(raw_data_7[i][1]), node_list) + visualization(canvas, "veh2", [veh_2.pos_x*canvas_factor, veh_2.pos_y*canvas_factor], color[raw_data_7[i][0]-1]) + if (veh_2.send_msg): + msg = create_message("2", "2", float(raw_data_7[i][1]), veh_2.pos_x, veh_2.pos_y, veh_2.theta, datetime.datetime.now(), veh_2.last_node_id, veh_2.battery_state, ["0", "WARNING"], ["2"]) + client.publish(MQTT_PATH, msg) + veh_2.last_msg_time = actual_time + veh_2.send_msg = False + elif (raw_data_7[i][0] == 3): + veh_3.update_pos(float(raw_data_7[i][2]), float(raw_data_7[i][3]), float(raw_data_7[i][1]), node_list) + visualization(canvas, "veh3", [veh_3.pos_x*canvas_factor, veh_3.pos_y*canvas_factor], color[raw_data_7[i][0]-1]) + if (veh_3.send_msg): + msg = create_message("3", "3", float(raw_data_7[i][1]), veh_3.pos_x, veh_3.pos_y, veh_3.theta, datetime.datetime.now(), veh_3.last_node_id, veh_3.battery_state, ["0", "WARNING"], ["3"]) + client.publish(MQTT_PATH, msg) + veh_3.last_msg_time = actual_time + veh_3.send_msg = False + elif (raw_data_7[i][0] == 4): + veh_4.update_pos(float(raw_data_7[i][2]), float(raw_data_7[i][3]), float(raw_data_7[i][1]), node_list) + visualization(canvas, "veh4", [veh_4.pos_x*canvas_factor, veh_4.pos_y*canvas_factor], color[raw_data_7[i][0]-1]) + if (veh_4.send_msg): + msg = create_message("4", "4", float(raw_data_7[i][1]), veh_4.pos_x, veh_4.pos_y, veh_4.theta, datetime.datetime.now(), veh_4.last_node_id, veh_4.battery_state, ["0", "WARNING"], ["4"]) + client.publish(MQTT_PATH, msg) + veh_4.last_msg_time = actual_time + veh_4.send_msg = False + elif (raw_data_7[i][0] == 5): + veh_5.update_pos(float(raw_data_7[i][2]), float(raw_data_7[i][3]), float(raw_data_7[i][1]), node_list) + visualization(canvas, "veh5", [veh_5.pos_x*canvas_factor, veh_5.pos_y*canvas_factor], color[raw_data_7[i][0]-1]) + if (veh_5.send_msg): + msg = create_message("5", "5", float(raw_data_7[i][1]), veh_5.pos_x, veh_5.pos_y, veh_5.theta, datetime.datetime.now(), veh_5.last_node_id, veh_5.battery_state, ["0", "WARNING"], ["5"]) + client.publish(MQTT_PATH, msg) + veh_5.last_msg_time = actual_time + veh_5.send_msg = False + #time_elapsed = time.time()-time_start + #print(time_elapsed) + + + +