Advertisement
Guest User

Untitled

a guest
Nov 21st, 2019
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.55 KB | None | 0 0
  1. from scipy import linalg as la
  2. import matplotlib.pyplot as pl
  3. import numpy as np
  4.  
  5. import quadrotor as quad
  6. import formation_distance as form
  7. import quadlog
  8. import animation as ani
  9.  
  10.  
  11.  
  12. #def listen_rel_xyz(quad1: quadrotor, quad2; quadrotor)
  13.  
  14.  
  15.  
  16. # Quadrotor
  17. m = 0.65 # Kg
  18. l = 0.23 # m
  19. Jxx = 7.5e-3 # Kg/m^2
  20. Jyy = Jxx
  21. Jzz = 1.3e-2
  22. Jxy = 0
  23. Jxz = 0
  24. Jyz = 0
  25. J = np.array([[Jxx, Jxy, Jxz],
  26. [Jxy, Jyy, Jyz],
  27. [Jxz, Jyz, Jzz]])
  28. CDl = 9e-3
  29. CDr = 9e-4
  30. kt = 3.13e-5 # Ns^2
  31. km = 7.5e-7 # Ns^2
  32. kw = 1/0.18 # rad/s
  33.  
  34. # Initial conditions
  35. att_0 = np.array([0.0, 0.0, 0.0])
  36. pqr_0 = np.array([0.0, 0.0, 0.0])
  37. xyzt_0 = np.array([0.0, 0.0, 0.0])
  38. xyz1_0 = np.array([1.0, 1.2, -0.0])
  39. xyz2_0 = np.array([1.2, 2.0, -0.0])
  40. xyz3_0 = np.array([-1.1, 2.6, -0.0])
  41. v_ned_0 = np.array([0.0, 0.0, 0.0])
  42. w_0 = np.array([0.0, 0.0, 0.0, 0.0])
  43.  
  44. # Setting quads
  45. qt = quad.quadrotor(0, m, l, J, CDl, CDr, kt, km, kw,
  46. att_0, pqr_0, xyzt_0, v_ned_0, w_0)
  47.  
  48. q1 = quad.quadrotor(1, m, l, J, CDl, CDr, kt, km, kw,
  49. att_0, pqr_0, xyz1_0, v_ned_0, w_0)
  50.  
  51. q2 = quad.quadrotor(2, m, l, J, CDl, CDr, kt, km, kw,
  52. att_0, pqr_0, xyz2_0, v_ned_0, w_0)
  53.  
  54. q3 = quad.quadrotor(3, m, l, J, CDl, CDr, kt, km, kw,
  55. att_0, pqr_0, xyz3_0, v_ned_0, w_0)
  56.  
  57.  
  58. # Simulation parameters
  59. tf = 400
  60. dt = 5e-2
  61. time = np.linspace(0, tf, tf/dt)
  62. it = 0
  63. frames = 100
  64.  
  65. # Data log
  66. qt_log = quadlog.quadlog(time)
  67. q1_log = quadlog.quadlog(time)
  68. q2_log = quadlog.quadlog(time)
  69. q3_log = quadlog.quadlog(time)
  70.  
  71. # Plots
  72. quadcolor = ['m', 'r', 'g', 'b']
  73. pl.close("all")
  74. pl.ion()
  75. fig = pl.figure(0)
  76. axis3d = fig.add_subplot(111, projection='3d')
  77.  
  78. init_area = 5
  79. s = 2
  80.  
  81. # Desired altitude and heading
  82. alt_d = 2
  83. qt.yaw_d = 0
  84. q1.yaw_d = 0
  85. q2.yaw_d = 0
  86. q3.yaw_d = 0
  87.  
  88.  
  89. def impPath3(qt, q1, q2, q3, r, a1, a2, a3):
  90. q1xyz = np.array([qt.xyz[0], qt.xyz[1] - r])
  91. q1xyz = q1xyz - np.array([q1.xyz[0], q1.xyz[1]])
  92. q2xyz = np.array([np.cos(a1-90)*r+qt.xyz[0], np.sin(a1-90)*r+qt.xyz[1]])
  93. q3xyz = np.array([np.cos((a1+a2)-90)*r+qt.xyz[0], np.sin((a1+a2)-90)*r+qt.xyz[1]])
  94. print("new: ", q3xyz)
  95. return (q1xyz, q2xyz, q3xyz)
  96.  
  97. def impPath2(qt, q1, q2, q3, r):
  98. q1xyz = np.array([qt.xyz[0], qt.xyz[1] - r])
  99. q1xyz = q1xyz - np.array([q1.xyz[0], q1.xyz[1]])
  100. q2xyz = np.array([qt.xyz[0] - 1.4142, qt.xyz[1] + 1.4142])
  101. q2xyz = q2xyz - np.array([q2.xyz[0], q2.xyz[1]])
  102. q3xyz = np.array([qt.xyz[0] + 1.4142, qt.xyz[1] + 1.4142])
  103. q3xyz = q3xyz - np.array([q3.xyz[0], q3.xyz[1]])
  104. print("old: ", q3xyz)
  105. return (q1xyz, q2xyz, q3xyz)
  106.  
  107.  
  108. for t in time:
  109.  
  110. print(q1.broadcast_rel_xyz(qt))
  111.  
  112. # Simulation
  113. X = np.append(q1.xyz[0:2], np.append(q2.xyz[0:2], q3.xyz[0:2]))
  114. V = np.append(q1.v_ned[0:2], np.append(q2.v_ned[0:2], q3.v_ned[0:2]))
  115.  
  116. gradF1 = np.array([X[0]*2, X[1]*2])
  117. gradF2 = np.array([X[2]*2, X[3]*2])
  118. gradF3 = np.array([X[4]*2, X[5]*2])
  119.  
  120. tangentHelp = np.array([[0, -1], [1, 0]])
  121. tangent1 = tangentHelp.dot((gradF1/la.norm(gradF1)))
  122. tangent2 = tangentHelp.dot((gradF2/la.norm(gradF2)))
  123. tangent3 = tangentHelp.dot((gradF3/la.norm(gradF3)))
  124.  
  125. #e1 = impPath(X[0], X[1], 2)
  126. #e2 = impPath(X[2], X[3], 2)
  127. #e3 = impPath(X[4], X[5], 2)
  128. ke = 0.012 # Gain for going towards circle
  129. kt = 0.035 # Gain for velocity
  130. kv = 0.02 # QT speed
  131. kvt = [kv,kv]
  132. kp = 0.1 # Proportional of error
  133.  
  134. # This small u is our circle following control input (velocity)
  135. #u1 = ke*(-e1)*gradF1 + kt*tangent1
  136. #u2 = ke*(-e2)*gradF2 + kt*tangent2
  137. #u3 = ke*(-e3)*gradF3 + kt*tangent3
  138. u1, u2, u3 = impPath2(qt,q1,q2,q3,2)
  139. #u1, u2, u3 = impPath3(qt,q1,q2,q3,2,120,120,120)
  140. u1 = u1 * kp
  141. u2 = u2 * kp
  142. u3 = u3 * kp
  143.  
  144.  
  145.  
  146. qt.set_v_2D_alt_lya(kvt, -alt_d)
  147. q1.set_v_2D_alt_lya(u1, -alt_d)
  148. q2.set_v_2D_alt_lya(u2, -alt_d)
  149. q3.set_v_2D_alt_lya(u3, -alt_d)
  150.  
  151. qt.step(dt)
  152. q1.step(dt)
  153. q2.step(dt)
  154. q3.step(dt)
  155.  
  156. # Animation
  157. if it % frames == 0:
  158.  
  159. pl.figure(0)
  160. axis3d.cla()
  161. ani.draw3d(axis3d, q1.xyz, q1.Rot_bn(), quadcolor[0])
  162. ani.draw3d(axis3d, q2.xyz, q2.Rot_bn(), quadcolor[1])
  163. ani.draw3d(axis3d, q3.xyz, q3.Rot_bn(), quadcolor[2])
  164. ani.draw3d(axis3d, qt.xyz, qt.Rot_bn(), quadcolor[3])
  165. axis3d.set_xlim(-5, 5)
  166. axis3d.set_ylim(-5, 5)
  167. axis3d.set_zlim(0, 10)
  168. axis3d.set_xlabel('South [m]')
  169. axis3d.set_ylabel('East [m]')
  170. axis3d.set_zlabel('Up [m]')
  171. axis3d.set_title("Time %.3f s" % t)
  172. pl.pause(0.001)
  173. pl.draw()
  174. # namepic = '%i'%it
  175. # digits = len(str(it))
  176. # for j in range(0, 5-digits):
  177. # namepic = '0' + namepic
  178. # pl.savefig("./images/%s.png"%namepic)
  179.  
  180.  
  181. # Log
  182. q1_log.xyz_h[it, :] = q1.xyz
  183. q1_log.att_h[it, :] = q1.att
  184. q1_log.w_h[it, :] = q1.w
  185. q1_log.v_ned_h[it, :] = q1.v_ned
  186.  
  187. q2_log.xyz_h[it, :] = q2.xyz
  188. q2_log.att_h[it, :] = q2.att
  189. q2_log.w_h[it, :] = q2.w
  190. q2_log.v_ned_h[it, :] = q2.v_ned
  191.  
  192. q3_log.xyz_h[it, :] = q3.xyz
  193. q3_log.att_h[it, :] = q3.att
  194. q3_log.w_h[it, :] = q3.w
  195. q3_log.v_ned_h[it, :] = q3.v_ned
  196.  
  197. qt_log.xyz_h[it, :] = qt.xyz
  198. qt_log.att_h[it, :] = qt.att
  199. qt_log.w_h[it, :] = qt.w
  200. qt_log.v_ned_h[it, :] = qt.v_ned
  201.  
  202. it += 1
  203.  
  204. # Stop if crash
  205. if (qt.crashed == 1 or q1.crashed == 1 or q2.crashed == 1 or q3.crashed == 1):
  206. break
  207.  
  208. pl.figure(1)
  209. pl.title("2D Position [m]")
  210. pl.plot(q1_log.xyz_h[:, 0], q1_log.xyz_h[:, 1], label="q1", color=quadcolor[0])
  211. pl.plot(q2_log.xyz_h[:, 0], q2_log.xyz_h[:, 1], label="q2", color=quadcolor[1])
  212. pl.plot(q3_log.xyz_h[:, 0], q3_log.xyz_h[:, 1], label="q3", color=quadcolor[2])
  213. pl.plot(qt_log.xyz_h[:, 0], qt_log.xyz_h[:, 1], label="qt", color=quadcolor[3])
  214. pl.xlabel("East")
  215. pl.ylabel("South")
  216. pl.legend()
  217.  
  218. pl.figure(2)
  219. pl.plot(time, q1_log.att_h[:, 2], label="yaw q1")
  220. pl.plot(time, q2_log.att_h[:, 2], label="yaw q2")
  221. pl.plot(time, q3_log.att_h[:, 2], label="yaw q3")
  222. pl.plot(time, qt_log.att_h[:, 2], label="yaw qt")
  223. pl.xlabel("Time [s]")
  224. pl.ylabel("Yaw [rad]")
  225. pl.grid()
  226. pl.legend()
  227.  
  228. pl.figure(3)
  229. pl.plot(time, -q1_log.xyz_h[:, 2], label="$q_1$")
  230. pl.plot(time, -q2_log.xyz_h[:, 2], label="$q_2$")
  231. pl.plot(time, -q3_log.xyz_h[:, 2], label="$q_3$")
  232. pl.plot(time, -qt_log.xyz_h[:, 2], label="$q_t$")
  233. pl.xlabel("Time [s]")
  234. pl.ylabel("Altitude [m]")
  235. pl.grid()
  236. pl.legend(loc=2)
  237.  
  238.  
  239. pl.pause(0)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement