test.py 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. #===============================================================================
  4. #
  5. # test.py
  6. #
  7. # Test program for the simple GL Viewer.
  8. #
  9. # Copyright (c) 2011, Arne Schmitz <arne.schmitz@gmx.net>
  10. # All rights reserved.
  11. #
  12. # Redistribution and use in source and binary forms, with or without
  13. # modification, are permitted provided that the following conditions are met:
  14. # * Redistributions of source code must retain the above copyright
  15. # notice, this list of conditions and the following disclaimer.
  16. # * Redistributions in binary form must reproduce the above copyright
  17. # notice, this list of conditions and the following disclaimer in the
  18. # documentation and/or other materials provided with the distribution.
  19. # * Neither the name of the <organization> nor the
  20. # names of its contributors may be used to endorse or promote products
  21. # derived from this software without specific prior written permission.
  22. #
  23. # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  24. # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  25. # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  26. # DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
  27. # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  28. # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  29. # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  30. # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  31. # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  32. # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  33. #
  34. #===============================================================================
  35. import math
  36. import time
  37. import sys
  38. from PyQt5.QtGui import *
  39. from PyQt5.QtWidgets import *
  40. from PyQt5.QtCore import *
  41. from MapGLWidget import MapGLWidget
  42. import json
  43. import dijkstra.Map as mp
  44. import ControllWidget
  45. import JointContrallerWidget
  46. import ManualOperationWidget
  47. import RobotData as RD
  48. import message_pb2 as message
  49. import google.protobuf.json_format as jtf
  50. import uuid
  51. #===============================================================================
  52. class MainWindow(QMainWindow):
  53. """docstring for Mainwindow"""
  54. djks_map_=mp.DijikstraMap()
  55. ui_nodes={}
  56. ui_nodes["street_nodes"]=[]
  57. ui_nodes["space_nodes"]=[]
  58. def __init__(self, parent = None):
  59. super(MainWindow,self).__init__(parent)
  60. self.basic()
  61. self.count_frame_=ControllWidget.CountFrame()
  62. self.LoadMap()
  63. config1={"label":"AgvMain",
  64. "rpc":"127.0.0.1:9090",
  65. "street_nodes":self.ui_nodes["street_nodes"],
  66. "space_nodes":self.ui_nodes["space_nodes"],
  67. "mqtt":["pyui1","192.168.0.70",1883,"admin","zx123456"],
  68. # "mqtt":["pyui1","192.168.225.224",1883,"admin","zx123456"],
  69. # "mqtt":["pyui-main","127.0.0.1",1883,"admin","zx123456"],
  70. "subTopics":{"agv_main/agv_statu":message.RobotStatu.__name__,
  71. "agv_main/nav_statu":message.NavStatu.__name__},
  72. "cmdTopic":"agv_main/nav_cmd",
  73. "robotColor":[0.7,0.2,0.3]}
  74. config2={"label":"AGV2",
  75. "rpc":"127.0.0.1:9091",
  76. "street_nodes":self.ui_nodes["street_nodes"],
  77. "space_nodes":self.ui_nodes["space_nodes"],
  78. "mqtt":["pyui2","192.168.0.71",1883,"admin","zx123456"],
  79. # "mqtt":["pyui2","192.168.225.224",1883,"admin","zx123456"],
  80. # "mqtt":["pyui-child","127.0.0.1",1883,"admin","zx123456"],
  81. "subTopics":{"agv_child/agv_statu":message.RobotStatu.__name__,
  82. "agv_child/nav_statu":message.NavStatu.__name__},
  83. "cmdTopic":"agv_child/nav_cmd",
  84. "robotColor":[0.4,0.2,0.8]}
  85. self.Controller1 = ControllWidget.ControlFrame(config1)
  86. self.Controller2 = ControllWidget.ControlFrame(config2)
  87. robot_dict = {self.Controller1.robot_.name_: self.Controller1.robot_,
  88. self.Controller2.robot_.name_: self.Controller2.robot_}
  89. self.ManualOperationWidget = ManualOperationWidget.ManualOperationWidget(robot_dict)
  90. splitter_main = self.split_()
  91. self.setCentralWidget(splitter_main)
  92. self.gl.SetRobot1Instance(self.Controller1.robot_)
  93. self.gl.SetRobot2Instance(self.Controller2.robot_)
  94. self.timer_=QTimer()
  95. self.timer_.timeout.connect(self.Update)
  96. self.timer_.start(100)
  97. def LoadMap(self):
  98. self.gl = MapGLWidget() #将opengl例子嵌入GUI
  99. map=self.load_map("./map.json")
  100. for node in map['street_nodes'].items():
  101. [id,point]=node
  102. street_node=mp.StreetNode(id,point[0],point[1])
  103. self.djks_map_.AddVertex(street_node)
  104. self.gl.AddNode([id,"street_node",point])
  105. self.ui_nodes["street_nodes"].append(id)
  106. for node in map['space_nodes'].items():
  107. [id,point]=node
  108. [x,y,yaw]=point
  109. space_node=mp.SpaceNode(id,point[0],point[1],yaw)
  110. self.djks_map_.AddVertex(space_node)
  111. glNode=[id,"space_node",[x,y]]
  112. self.gl.AddNode(glNode)
  113. self.ui_nodes["space_nodes"].append(id)
  114. for road in map['roads'].items():
  115. self.gl.AddRoad(road)
  116. [_,points]=road
  117. for pt1 in points:
  118. for pt2 in points:
  119. if not pt1==pt2:
  120. self.djks_map_.AddEdge(pt1,pt2)
  121. def load_map(self,file):
  122. with open(file,'r',encoding='utf-8') as fp:
  123. map=json.load(fp)
  124. return map
  125. def Update(self):
  126. self.gl.update()
  127. #窗口基础属性
  128. def basic(self):
  129. #设置标题,大小,图标
  130. self.setWindowTitle("GT")
  131. self.resize(1100,650)
  132. self.setWindowIcon(QIcon("./image/Gt.png"))
  133. #居中显示
  134. screen = QDesktopWidget().geometry()
  135. self_size = self.geometry()
  136. self.move(int((screen.width() - self_size.width())/2),int((screen.height() - self_size.height())/2))
  137. def closeEvent(self, QCloseEvent):
  138. self.gl.close()
  139. #分割窗口
  140. def split_(self):
  141. splitter_main = QSplitter(Qt.Horizontal)
  142. splitter = QSplitter(Qt.Vertical)
  143. splitter.addWidget(self.count_frame_)
  144. splitter.addWidget(self.Controller1)
  145. splitter.addWidget(self.Controller2)
  146. splitter.addWidget(self.ManualOperationWidget)
  147. splitter.setStretchFactor(0,1)
  148. splitter.setStretchFactor(1,3)
  149. splitter.setStretchFactor(2,3)
  150. splitter.setStretchFactor(3,1)
  151. splitter_main.addWidget(splitter)
  152. splitter_main.addWidget(self.gl)
  153. splitter_main.setStretchFactor(0,1)
  154. splitter_main.setStretchFactor(2,4)
  155. return splitter_main
  156. if __name__ == "__main__":
  157. app = QApplication(sys.argv)
  158. win = MainWindow()
  159. win.show()
  160. sys.exit(app.exec_())
  161. #===============================================================================
  162. # Main
  163. #===============================================================================
  164. '''app = QApplication(sys.argv)
  165. mainWindow = MapGLWidget()
  166. mainWindow.show()
  167. mainWindow.raise_() # Need this at least on OS X, otherwise the window ends up in background
  168. sys.exit(app.exec_())'''
  169. #===============================================================================
  170. #
  171. # Local Variables:
  172. # mode: Python
  173. # indent-tabs-mode: nil
  174. # End:
  175. #
  176. #===============================================================================