player-virtual.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. # Simula virtualmente um robo
  2. from robot import Robot
  3. from tag import TagClient
  4. from random import randint, random
  5. import signal, sys
  6. import math
  7. import time
  8. from numpy.linalg import norm
  9. import numpy as np
  10. rid = randint(100, 1000)
  11. run = False
  12. board = None
  13. tagplayer = -1
  14. client = TagClient('localhost', 10318)
  15. client.info(rid, 14, 19, 7, 13.5)
  16. px, py, course = None, None, None
  17. # Sinal de ctrl-c
  18. def signal_handler(signal, frame):
  19. client.stop()
  20. sys.exit(0)
  21. signal.signal(signal.SIGINT, signal_handler)
  22. players = {}
  23. while not client.quit:
  24. # nao recebeu informacoes do campo
  25. if client.getFieldInfo() is None:
  26. continue
  27. elif px is None:
  28. board = client.getFieldInfo()
  29. px, py = board[0]*random(), board[1]*random()
  30. course = math.pi*2.0*random()
  31. client.setPosition(px, py, course)
  32. # jogo esta parado
  33. if client.getStatus() is False:
  34. players = {}
  35. continue
  36. # jogo esta parado
  37. if client.isPause() is True:
  38. time.sleep(5)
  39. client.setPause()
  40. # nao recebeu informacoes do pegador
  41. if client.getTagInfo() is None:
  42. continue
  43. # verifica se ha posicoes novas
  44. newposs = client.getPosition()
  45. for info in newposs:
  46. posx, posy, course, idd, xsize, ysize, xtag, ytag = info
  47. if idd != rid:
  48. players[idd] = [posx, posy]
  49. tag, interval = client.getTagInfo()
  50. pos = [players[p] for p in players]
  51. if time.time() <= interval:
  52. # comportamento de fuga
  53. if tag in players and tag != rid:
  54. # foge se nao for pegador
  55. px = px + (px-players[tag][0])/180.0
  56. py = py + (py-players[tag][1])/180.0
  57. course = course+(random()-0.5)/5.0
  58. client.setPosition(px, py, course)
  59. else:
  60. if len(pos) >= 1 and tag == rid:
  61. move = np.array([px-pos[0][0], py-pos[0][1]])
  62. move = move/norm(move)*0.5
  63. px = px - move[0]
  64. py = py - move[1]
  65. if tag != rid:
  66. px = px+(random()-0.5)
  67. py = py+(random()-0.5)
  68. course = course+(random()-0.5)/5.0
  69. client.setPosition(px, py, course)