ControllWidget.py 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. import datetime
  2. import math
  3. import random
  4. import time
  5. from concurrent.futures import ThreadPoolExecutor, as_completed, wait
  6. from PyQt5.QtWidgets import QWidget, QFrame, QLabel, QLineEdit, QPushButton, QComboBox, QCheckBox
  7. from PyQt5.QtGui import QPixmap, QPainter, QResizeEvent, QCloseEvent, QPaintEvent, QFont
  8. from PyQt5.QtCore import QSize, QTimer, Qt
  9. import auto_test
  10. from RobotData import Robot
  11. import dijkstra.Map as mp
  12. class ControlFrame(QFrame):
  13. threadPool_ = ThreadPoolExecutor(5)
  14. last_beg = "**"
  15. begId_ = "------"
  16. targetId_ = "------"
  17. def __init__(self, config):
  18. QFrame.__init__(self)
  19. self.street_nodes_ = config['street_nodes']
  20. self.space_nodes_ = config['space_nodes']
  21. self.label_ = config['label']
  22. [id, ip, port, user, pawd] = config['mqtt']
  23. subtopics = config['subTopics']
  24. cmdTopic = config['cmdTopic']
  25. robotColor = config['robotColor']
  26. self.all_nodes_ = []
  27. for node in self.street_nodes_:
  28. self.all_nodes_.append(node)
  29. for node in self.space_nodes_:
  30. self.all_nodes_.append(node)
  31. self.robot_ = Robot(self.label_)
  32. self.robot_.connect(id, ip, port, user, pawd)
  33. self.robot_.SetSubDataTopic(subtopics, self.messageArrived)
  34. self.robot_.SetCmdTopic(cmdTopic)
  35. self.robot_.loop_start()
  36. self.robot_.SetColor(robotColor, robotColor)
  37. self.setGeometry(0, 0, 500, 500)
  38. self.InitUI()
  39. self.setFrameShape(self.StyledPanel)
  40. self.timer_ = QTimer()
  41. self.timer_.timeout.connect(self.Update)
  42. self.timer_.start(100)
  43. def messageArrived(self):
  44. pass
  45. # self.gl.update()
  46. def InitUI(self):
  47. self.basestatic = QLabel(self)
  48. self.basestatic.setText(self.label_)
  49. self.basestatic.setGeometry(20, 20, 80, 30)
  50. self.begstatic = QLabel(self)
  51. self.begstatic.setText(" 起点")
  52. self.begstatic.setGeometry(90, 5, 80, 30)
  53. self.begQc = QComboBox(self)
  54. self.begQc.setGeometry(160, 5, 80, 30)
  55. self.endstatic = QLabel(self)
  56. self.endstatic.setText("去马路点")
  57. self.endstatic.setGeometry(90, 50, 80, 30)
  58. self.endStreetQc = QComboBox(self)
  59. self.endStreetQc.setGeometry(160, 50, 80, 30)
  60. self.endstatic = QLabel(self)
  61. self.endstatic.setText("去车位点")
  62. self.endstatic.setGeometry(90, 95, 80, 30)
  63. self.endSpaceQc = QComboBox(self)
  64. self.endSpaceQc.setGeometry(160, 95, 80, 30)
  65. self.btnSend = QPushButton(self)
  66. self.btnSend.setGeometry(150, 140, 100, 40)
  67. self.btnSend.setText(" 启动导航")
  68. self.btnSend.clicked.connect(self.btnSendClick)
  69. self.btnCancel = QPushButton(self)
  70. self.btnCancel.setGeometry(150, 190, 100, 40)
  71. self.btnCancel.setText(" 取消导航")
  72. self.btnCancel.clicked.connect(self.btnCancelClick)
  73. self.begQc.addItems(self.all_nodes_)
  74. self.endStreetQc.addItems(self.street_nodes_)
  75. self.endStreetQc.addItem("------")
  76. self.endSpaceQc.addItem("------")
  77. self.endSpaceQc.addItems(self.space_nodes_)
  78. self.endStreetQc.activated.connect(self.endStreetQCChanged)
  79. self.endSpaceQc.activated.connect(self.endSpaceQCChanged)
  80. self.posestatic = QLabel(self)
  81. self.posestatic.setGeometry(260, 5, 100, 90)
  82. self.LedLabel = QLabel(self)
  83. self.LedLabel.setGeometry(80, 160, 50, 50)
  84. # 发送轴距
  85. self.wheelbasestatic = QLabel(self)
  86. self.wheelbasestatic.setText("轴距:")
  87. self.wheelbasestatic.setGeometry(260, 90, 40, 30)
  88. self.WheelBaseEdit = QLineEdit(self)
  89. self.WheelBaseEdit.setText("3.3")
  90. self.WheelBaseEdit.setGeometry(300, 90, 50, 30)
  91. self.btnModelCheck = QCheckBox("双车模式", self)
  92. self.btnModelCheck.setGeometry(260, 130, 100, 40)
  93. self.btnModelCheck.clicked.connect(self.MainAgvchangecb)
  94. self.btnClampCheck = QCheckBox("夹持", self)
  95. self.btnClampCheck.setGeometry(260, 160, 60, 40)
  96. self.btnClampCheck.clicked.connect(self.ClampClick)
  97. self.btnAuto = QCheckBox(self)
  98. self.btnAuto.setText("自动测试")
  99. self.btnAuto.setGeometry(260, 195, 100, 40)
  100. self.btnAuto.stateChanged.connect(self.AutoCheck)
  101. def Update(self):
  102. if self.robot_.timedRobotStatu_.timeout() == False:
  103. x = self.robot_.timedRobotStatu_.statu.x
  104. y = self.robot_.timedRobotStatu_.statu.y
  105. yaw = self.robot_.timedRobotStatu_.statu.theta
  106. self.posestatic.setText("x : %.3f\ny : %.3f\nΘ : %.2f°" % (x, y, yaw * 180 / math.pi))
  107. statu = "min-width: 32px; min-height: 32px;max-width:32px;\
  108. max-height: 32px;border-radius: 16px; border:1px solid black;background:green"
  109. if self.robot_.Connected() == False:
  110. statu = "min-width: 32px; min-height: 32px;max-width:32px;\
  111. max-height: 32px;border-radius: 16px; border:1px solid black;background:gray"
  112. # self.endQc.setEnabled(False)
  113. elif self.robot_.IsNavigating() == True:
  114. statu = "min-width: 32px; min-height: 32px;max-width:32px;\
  115. max-height: 32px;border-radius: 16px; border:1px solid black;background:yellow"
  116. self.endStreetQc.setEnabled(False)
  117. self.endSpaceQc.setEnabled(False)
  118. self.btnModelCheck.setEnabled(False)
  119. self.btnClampCheck.setEnabled(False)
  120. else:
  121. self.endStreetQc.setEnabled(True)
  122. self.endSpaceQc.setEnabled(True)
  123. self.btnModelCheck.setEnabled(True)
  124. self.btnClampCheck.setEnabled(True)
  125. self.LedLabel.setStyleSheet(statu)
  126. self.wheelbasestatic.setVisible(self.robot_.IsMainAgv())
  127. self.WheelBaseEdit.setVisible(self.robot_.IsMainAgv())
  128. self.btnModelCheck.setVisible(self.robot_.IsMainAgv())
  129. if self.robot_.IsMainModeStatu():
  130. self.btnModelCheck.setCheckState(Qt.Checked)
  131. else:
  132. self.btnModelCheck.setCheckState(Qt.Unchecked)
  133. if self.robot_.IsClampClosed():
  134. self.btnClampCheck.setCheckState(Qt.Checked)
  135. else:
  136. self.btnClampCheck.setCheckState(Qt.Unchecked)
  137. if self.robot_.IsNavigating():
  138. self.begId_ = self.robot_.begId_
  139. self.targetId_ = self.robot_.targetId_
  140. djks_map = mp.DijikstraMap()
  141. beg_node = djks_map.GetVertex(self.begId_)
  142. end_node = djks_map.GetVertex(self.targetId_)
  143. if beg_node is not None:
  144. self.begQc.setCurrentText(self.begId_)
  145. if end_node is not None:
  146. if isinstance(end_node, (mp.SpaceNode)):
  147. self.endStreetQc.setCurrentText("------")
  148. self.endSpaceQc.setCurrentText(self.targetId_)
  149. if isinstance(end_node, (mp.StreetNode)):
  150. self.endStreetQc.setCurrentText(self.targetId_)
  151. self.endSpaceQc.setCurrentText("------")
  152. def AutoCheck(self):
  153. if self.btnAuto.checkState()==Qt.Checked:
  154. self.robot_.autoTest_=True
  155. else:
  156. self.robot_.autoTest_=False
  157. def ClampClick(self):
  158. if self.robot_.IsClampClosed() == False:
  159. self.threadPool_.submit(self.robot_.ClampClose)
  160. else:
  161. self.threadPool_.submit(self.robot_.ClampOpen)
  162. def MainAgvchangecb(self):
  163. if self.robot_.IsMainModeStatu() == False:
  164. leng = float(self.WheelBaseEdit.text())
  165. self.threadPool_.submit(self.robot_.SwitchMoveMode, 2, leng)
  166. else:
  167. self.threadPool_.submit(self.robot_.SwitchMoveMode, 1, 0)
  168. def endStreetQCChanged(self):
  169. id1 = self.begQc.currentText()
  170. id2 = self.endStreetQc.currentText()
  171. if not id1 == "------" and not id2 == "------":
  172. self.robot_.GeneratePath(id1, id2)
  173. self.begId_=id1
  174. self.targetId_=id2
  175. def endSpaceQCChanged(self):
  176. id1 = self.begQc.currentText()
  177. id2 = self.endSpaceQc.currentText()
  178. if not id1 == "------" and not id2 == "------":
  179. self.robot_.GeneratePath(id1, id2)
  180. self.begId_=id1
  181. self.targetId_=id2
  182. def btnSendClick(self):
  183. if self.btnAuto.checkState()==Qt.Checked:
  184. if self.robot_.IsMainModeStatu():
  185. self.threadPool_.submit(self.robot_.AutoTestNavClamp,
  186. self.begId_, self.targetId_)
  187. else:
  188. print("agv not in main statu")
  189. else :
  190. self.threadPool_.submit(self.robot_.Navigatting,
  191. self.begId_, self.targetId_)
  192. def btnCancelClick(self):
  193. self.threadPool_.submit(self.robot_.CancelNavTask)
  194. self.btnAuto.setCheckState(Qt.Unchecked)
  195. class CountFrame(QFrame):
  196. def __init__(self):
  197. QFrame.__init__(self)
  198. self.InitUI()
  199. self.timer_ = QTimer()
  200. self.timer_.timeout.connect(self.UpdateUI)
  201. self.timer_.start(200)
  202. def InitUI(self):
  203. self.static1 = QLabel(self)
  204. self.static1.setText("重载导航次数 : /")
  205. self.static1.setGeometry(5, 5, 200, 30)
  206. self.static2 = QLabel(self)
  207. self.static2.setText("单车导航次数 : /")
  208. self.static2.setGeometry(5, 40, 200, 30)
  209. def UpdateUI(self):
  210. load_str = "重载导航次数 : %d" % (auto_test.TestCount().loadCount())
  211. single_str = "单车导航次数 : %d" % (auto_test.TestCount().singleCount())
  212. self.static1.setText(load_str)
  213. self.static2.setText(single_str)