#!/usr/bin/env python # -*- coding: utf-8 -*- #=============================================================================== # # test.py # # Test program for the simple GL Viewer. # # Copyright (c) 2011, Arne Schmitz # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of the nor the # names of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE # DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # #=============================================================================== import math import time import sys from PyQt5.QtGui import * from PyQt5.QtWidgets import * from PyQt5.QtCore import * from MapGLWidget import MapGLWidget import json import dijkstra.Map as mp import ControllWidget import JointContrallerWidget import ManualOperationWidget import RobotData as RD import message_pb2 as message import google.protobuf.json_format as jtf import uuid from custom_define import RobotName #=============================================================================== class MainWindow(QMainWindow): """docstring for Mainwindow""" djks_map_=mp.DijikstraMap() ui_nodes={} ui_nodes["street_nodes"]=[] ui_nodes["space_nodes"]=[] def __init__(self, parent = None): super(MainWindow,self).__init__(parent) self.basic() self.count_frame_=ControllWidget.CountFrame() self.LoadMap() config1={"label":RobotName.strAGVMain, "rpc":"192.168.0.70:9090", # "rpc": "127.0.0.1:9090", "street_nodes":self.ui_nodes["street_nodes"], "space_nodes":self.ui_nodes["space_nodes"], # "mqtt":["pyui1","192.168.0.70",1883,"admin","zx123456"], # "mqtt":["pyui1","192.168.225.224",1883,"admin","zx123456"], "mqtt":["pyui-main","127.0.0.1",1883,"admin","zx123456"], "subTopics":{"agv_main/agv_statu":message.RobotStatu.__name__, "agv_main/nav_statu":message.NavStatu.__name__}, "cmdTopic":"agv_main/nav_cmd", "robotColor":[0.7,0.2,0.3]} config2={"label":RobotName.strAGV2, # "rpc":"192.168.0.71:9090", "rpc": "127.0.0.1:9091", "street_nodes":self.ui_nodes["street_nodes"], "space_nodes":self.ui_nodes["space_nodes"], # "mqtt":["pyui2","192.168.0.71",1883,"admin","zx123456"], # "mqtt":["pyui2","192.168.225.224",1883,"admin","zx123456"], "mqtt":["pyui-child","127.0.0.1",1883,"admin","zx123456"], "subTopics":{"agv_child/agv_statu":message.RobotStatu.__name__, "agv_child/nav_statu":message.NavStatu.__name__}, "cmdTopic":"agv_child/nav_cmd", "robotColor":[0.4,0.2,0.8]} self.Controller1 = ControllWidget.ControlFrame(config1) self.Controller2 = ControllWidget.ControlFrame(config2) robot_dict = {self.Controller1.robot_.name_: self.Controller1.robot_, self.Controller2.robot_.name_: self.Controller2.robot_} self.ManualOperationWidget = ManualOperationWidget.ManualOperationWidget(robot_dict) splitter_main = self.split_() self.setCentralWidget(splitter_main) self.gl.SetRobot1Instance(self.Controller1.robot_) self.gl.SetRobot2Instance(self.Controller2.robot_) self.timer_=QTimer() self.timer_.timeout.connect(self.Update) self.timer_.start(100) def LoadMap(self): self.gl = MapGLWidget() #将opengl例子嵌入GUI map=self.load_map("./map.json") for node in map['street_nodes'].items(): [id,point]=node street_node=mp.StreetNode(id,point[0],point[1]) self.djks_map_.AddVertex(street_node) self.gl.AddNode([id,"street_node",point]) self.ui_nodes["street_nodes"].append(id) for node in map['space_nodes'].items(): [id,point]=node [x,y,yaw]=point space_node=mp.SpaceNode(id,point[0],point[1],yaw) self.djks_map_.AddVertex(space_node) glNode=[id,"space_node",[x,y]] self.gl.AddNode(glNode) self.ui_nodes["space_nodes"].append(id) for road in map['roads'].items(): self.gl.AddRoad(road) [_,points]=road for pt1 in points: for pt2 in points: if not pt1==pt2: self.djks_map_.AddEdge(pt1,pt2) def load_map(self,file): with open(file,'r',encoding='utf-8') as fp: map=json.load(fp) return map def Update(self): self.gl.update() #窗口基础属性 def basic(self): #设置标题,大小,图标 self.setWindowTitle("GT") self.resize(1100,650) self.setWindowIcon(QIcon("./image/Gt.png")) #居中显示 screen = QDesktopWidget().geometry() self_size = self.geometry() self.move(int((screen.width() - self_size.width())/2),int((screen.height() - self_size.height())/2)) def closeEvent(self, QCloseEvent): self.gl.close() #分割窗口 def split_(self): splitter_main = QSplitter(Qt.Horizontal) splitter = QSplitter(Qt.Vertical) splitter.addWidget(self.count_frame_) splitter.addWidget(self.Controller1) splitter.addWidget(self.Controller2) splitter.addWidget(self.ManualOperationWidget) splitter.setStretchFactor(0,1) splitter.setStretchFactor(1,3) splitter.setStretchFactor(2,3) splitter.setStretchFactor(3,1) splitter_main.addWidget(splitter) splitter_main.addWidget(self.gl) splitter_main.setStretchFactor(0,1) splitter_main.setStretchFactor(2,4) return splitter_main if __name__ == "__main__": app = QApplication(sys.argv) win = MainWindow() win.show() sys.exit(app.exec_()) #=============================================================================== # Main #=============================================================================== '''app = QApplication(sys.argv) mainWindow = MapGLWidget() mainWindow.show() mainWindow.raise_() # Need this at least on OS X, otherwise the window ends up in background sys.exit(app.exec_())''' #=============================================================================== # # Local Variables: # mode: Python # indent-tabs-mode: nil # End: # #===============================================================================