Advertisement
Guest User

Untitled

a guest
Feb 22nd, 2019
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.25 KB | None | 0 0
  1. def calcX(t, Px, Vx, k):
  2. return Px + Vx * (1 - np.exp(-k * t)) / k
  3.  
  4. def calcY(t, Py, Vy, k):
  5. return Py + Vy * (1 - np.exp(-k * t)) / k
  6.  
  7. def calcZ(t, Pz, Vz, k, g):
  8. return Pz - (g * t + (np.exp(-k * t) - 1) * (g / k + Vz)) / k
  9.  
  10. def calcVelX(t, Vx, k):
  11. return Vx * np.exp(-k * t)
  12.  
  13. def calcVelY(t, Vy, k):
  14. return Vy * np.exp(-k * t)
  15.  
  16. def calcVelZ(t, Vz, k, g):
  17. return -(g - np.exp(-k * t) * (g + k * Vz)) / k
  18.  
  19. def calcT(Xref, Px, Vx, k):
  20. return -np.log(1 - k * (Xref - Px) / Vx) / k
  21.  
  22. class Point:
  23. def __init__(self, t, x, y, z):
  24. self.t = t
  25. self.x = x
  26. self.y = y
  27. self.z = z
  28.  
  29. def distance(point1, point2):
  30. return math.sqrt((point2.x - point1.x) ** 2 + (point2.y - point1.y) ** 2 + (point2.z - point1.z) ** 2 )
  31.  
  32. class BallMovement():
  33.  
  34. def __init__(self):
  35. self.pointBuffer = []
  36. self.fly = False
  37. self.minFlySpeed = 3
  38. self.timeLim = 0.1
  39. self.polynom = False
  40. self.p = 1
  41. self.maxPredErr = 0.5
  42. self.newTraectory = []
  43. self.polyCount = 20
  44. self.kx = None
  45. self.ky = None
  46. self.kz = None
  47. self.count = 0
  48.  
  49. def checkBeginVectorPoint(self, vector, point):
  50. v1 = np.array([
  51. (point.x - vector[1].x) / (point.t - vector[1].t),
  52. (point.y - vector[1].y) / (point.t - vector[1].t),
  53. (point.z - vector[1].z) / (point.t - vector[1].t),
  54. ])
  55. v2 = np.array([
  56. (vector[1].x - vector[0].x) / (vector[1].t - vector[0].t),
  57. (vector[1].y - vector[0].y) / (vector[1].t - vector[0].t),
  58. (vector[1].z - vector[0].z) / (vector[1].t - vector[0].t),
  59. ])
  60. if ((np.linalg.norm(v1) > self.minFlySpeed)
  61. and (np.linalg.norm(v1 - v2) < self.minFlySpeed * 0.1)
  62. and ((point.t - vector[0].t) < self.timeLim)
  63. and ((point.z - vector[0].z) > 0)):
  64. return True
  65. else:
  66. return False
  67.  
  68.  
  69. def checkBeginVector(self, vector):
  70. v1 = np.array([
  71. (vector[2].x - vector[1].x) / (vector[2].t - vector[1].t),
  72. (vector[2].y - vector[1].y) / (vector[2].t - vector[1].t),
  73. (vector[2].z - vector[1].z) / (vector[2].t - vector[1].t),
  74. ])
  75. v2 = np.array([
  76. (vector[1].x - vector[0].x) / (vector[1].t - vector[0].t),
  77. (vector[1].y - vector[0].y) / (vector[1].t - vector[0].t),
  78. (vector[1].z - vector[0].z) / (vector[1].t - vector[0].t),
  79. ])
  80. if ((np.linalg.norm(v1) > self.minFlySpeed)
  81. and (np.linalg.norm(v1 - v2) < self.minFlySpeed * 0.1)
  82. and ((vector[2].t - vector[0].t) < self.timeLim)
  83. and ((vector[2].z - vector[0].z) > 0)):
  84. return True
  85. else:
  86. return False
  87.  
  88. def pushPoint(self, point):
  89. if (len(self.pointBuffer) < 2 and not self.fly):
  90. self.pointBuffer.append(point)
  91. elif (len(self.pointBuffer) == 2 and not self.fly):
  92. if (self.checkBeginVectorPoint(self.pointBuffer, point)):
  93. self.fly = True
  94. else:
  95. self.pointBuffer.pop(0)
  96. self.pointBuffer.append(point)
  97. if (self.fly):
  98. if (len(self.pointBuffer) < 3):
  99. self.pointBuffer.append(point)
  100. elif self.polynom:
  101. ex = np.polyval(self.kx, point.t) - point.x
  102. ey = np.polyval(self.ky, point.t) - point.y
  103. ez = np.polyval(self.kz, point.t) - point.z
  104. E = np.linalg.norm(np.array([ex, ey, ez]))
  105. if (E > self.maxPredErr):
  106. self.newTraectory.append(point)
  107. else:
  108. if (len(self.pointBuffer) == self.polyCount):
  109. self.pointBuffer.pop(0)
  110. self.pointBuffer.append(point)
  111. self.newTraectory = []
  112. if (len(self.newTraectory) == 3):
  113. self.pointBuffer = self.newTraectory
  114. self.fly = False
  115. self.polynom = False
  116. self.newTraectory = []
  117. if (self.checkBeginVector(self.pointBuffer)):
  118. self.fly = True
  119. else:
  120. self.pointBuffer.pop(0)
  121. x = np.array([p.x for p in self.pointBuffer])
  122. y = np.array([p.y for p in self.pointBuffer])
  123. z = np.array([p.z for p in self.pointBuffer])
  124. t = np.array([p.t for p in self.pointBuffer])
  125. if (len(self.pointBuffer) < 5):
  126. self.p = 1
  127. if (len(self.pointBuffer) > 5):
  128. self.p = 2
  129. p = self.p
  130. self.kx = np.polyfit(t, x, p)
  131. self.ky = np.polyfit(t, y, p)
  132. self.kz = np.polyfit(t, z, p)
  133. dkx = np.polyder(self.kx)
  134. dky = np.polyder(self.ky)
  135. dkz = np.polyder(self.kz)
  136. self.polynom = True
  137. T = (self.pointBuffer[len(self.pointBuffer) - 1].t - self.pointBuffer[0].t) / 2
  138. PxT = np.polyval(self.kx,T)
  139. PyT = np.polyval(self.ky,T)
  140. PzT = np.polyval(self.kz,T)
  141. VxT = np.polyval(dkx, T)
  142. VyT = np.polyval(dky, T)
  143. VzT = np.polyval(dkz, T)
  144. if (len(self.pointBuffer) == self.polyCount):
  145. t = calcT(1, PxT, VxT, 0.9)
  146. X = calcX(t, PxT, VxT, 0.9)
  147. Y = calcY(t, PyT, VyT, 0.9)
  148. Z = calcZ(t, PzT, VzT, 0.9, 9.8)
  149. velX = calcVelX(t, VxT, 0.9)
  150. velY = calcVelY(t, VyT, 0.9)
  151. velZ = calcVelZ(t, VzT, 0.9, 9.8)
  152. # print(t)
  153. print("X - {}".format(X))
  154. print("Y - {}".format(Y))
  155. print("Z - {}".format(Z))
  156. print(velX)
  157. print(velY)
  158. print(velZ)
  159. self.count += 1
  160. # print(self.count)
  161. return Z, t
  162. # for i in range(1, len(self.pointBuffer)):
  163. # if (distance(self.pointBuffer[i - 1], self.pointBuffer[i])):
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement