Advertisement
fuccpuff

Untitled

Nov 21st, 2024
9
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.08 KB | None | 0 0
  1. import rospy
  2. from clover import srv
  3. from std_srvs.srv import Trigger
  4. import math
  5. import csv
  6.  
  7. rospy.init_node('flight')
  8.  
  9. get_telemetry = rospy.ServiceProxy('get_telemetry', srv.GetTelemetry)
  10. navigate = rospy.ServiceProxy('navigate', srv.Navigate)
  11. land = rospy.ServiceProxy('land', Trigger)
  12.  
  13. def wait_arrival(tolerance=0.2, debug=False, log_writer=None):
  14. rate = rospy.Rate(5)
  15. while not rospy.is_shutdown():
  16. telem = get_telemetry(frame_id='navigate_target')
  17. distance = math.sqrt(telem.x ** 2 + telem.y ** 2 + telem.z ** 2)
  18.  
  19. if debug:
  20. rospy.loginfo(f"текущее расстояние до цели: {distance}")
  21.  
  22. if log_writer:
  23. global_telem = get_telemetry(frame_id='map')
  24. log_writer.writerow([rospy.get_time(), global_telem.x, global_telem.y, global_telem.z, global_telem.yaw])
  25.  
  26. if distance < tolerance:
  27. break
  28. rate.sleep()
  29. rospy.sleep(2)
  30.  
  31. def navigate_and_wait(x, y, z, frame_id='body', auto_arm=False, debug=False, log_writer=None):
  32. navigate(x=x, y=y, z=z, frame_id=frame_id, auto_arm=auto_arm)
  33. if debug:
  34. rospy.loginfo(f"навигация к: x={x}, y={y}, z={z}, frame_id={frame_id}")
  35. wait_arrival(debug=debug, log_writer=log_writer)
  36.  
  37. for flight_num in range(1, 4):
  38. rospy.loginfo(f"начинаю тестовый полет {flight_num}")
  39.  
  40. filename = f'flight_log_{flight_num}.csv'
  41. with open(filename, 'w', newline='') as csvfile:
  42. log_writer = csv.writer(csvfile)
  43. log_writer.writerow(['time', 'x', 'y', 'z', 'yaw'])
  44.  
  45. navigate_and_wait(x=0, y=0, z=1, frame_id='body', auto_arm=True, debug=True, log_writer=log_writer)
  46. rospy.loginfo("достиг высоты 1 метр")
  47.  
  48. navigate_and_wait(x=1, y=0, z=1, frame_id='map', debug=True, log_writer=log_writer)
  49. rospy.loginfo("достиг точки (1, 0, 1)")
  50.  
  51. navigate_and_wait(x=1, y=1, z=1, frame_id='map', debug=True, log_writer=log_writer)
  52. rospy.loginfo("достиг точки (1, 1, 1)")
  53.  
  54. navigate_and_wait(x=0, y=1, z=1, frame_id='map', debug=True, log_writer=log_writer)
  55. rospy.loginfo("достиг точки (0, 1, 1)")
  56.  
  57.  
  58. navigate_and_wait(x=0, y=0, z=0.5, frame_id='map', debug=True, log_writer=log_writer)
  59. land()
  60. rospy.loginfo("посадка в точке (0, 0, 0)")
  61.  
  62. rospy.loginfo(f"завершил тестовый полет {flight_num}")
  63. rospy.sleep(5)
  64.  
  65. # анализ данных полетов
  66. for flight_num in range(1, 4):
  67. filename = f'flight_log_{flight_num}.csv'
  68. rospy.loginfo(f"анализ данных полета из файла {filename}")
  69.  
  70. with open(filename, 'r') as csvfile:
  71. log_reader = csv.reader(csvfile)
  72. next(log_reader) # пропускаю заголовок
  73.  
  74. times = []
  75. xs = []
  76. ys = []
  77. zs = []
  78. yaws = []
  79.  
  80. for row in log_reader:
  81. times.append(float(row[0]))
  82. xs.append(float(row[1]))
  83. ys.append(float(row[2]))
  84. zs.append(float(row[3]))
  85. yaws.append(float(row[4]))
  86.  
  87. if times:
  88. total_time = times[-1] - times[0]
  89. rospy.loginfo(f"общая длительность полета {flight_num}: {total_time:.2f} секунд")
  90.  
  91. total_distance = 0
  92. for i in range(1, len(xs)):
  93. dx = xs[i] - xs[i-1]
  94. dy = ys[i] - ys[i-1]
  95. dz = zs[i] - zs[i-1]
  96. total_distance += math.sqrt(dx**2 + dy**2 + dz**2)
  97. rospy.loginfo(f"общая пройденная дистанция {flight_num}: {total_distance:.2f} метров")
  98.  
  99. average_speed = total_distance / total_time if total_time > 0 else 0
  100. rospy.loginfo(f"средняя скорость полета {flight_num}: {average_speed:.2f} м/с")
  101. else:
  102. rospy.loginfo(f"данные для полета {flight_num} не записаны")
  103.  
  104. rospy.loginfo("миссия завершена")
  105.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement