Advertisement
fuccpuff

waypoint_flight.py

Nov 17th, 2024 (edited)
23
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.82 KB | None | 0 0
  1. #!/usr/bin/env python3
  2. import rospy
  3. from clover import srv
  4. from std_srvs.srv import Trigger
  5. import time
  6. import csv
  7. import os
  8. import math
  9.  
  10. # запускаем ros-узел
  11. rospy.init_node('flight_simulation')
  12.  
  13. # подключаемся к сервисам
  14. get_telemetry = rospy.ServiceProxy('get_telemetry', srv.GetTelemetry)
  15. navigate = rospy.ServiceProxy('navigate', srv.Navigate)
  16. land = rospy.ServiceProxy('land', Trigger)
  17.  
  18. # пишем телеметрию в файл
  19. def log_telemetry(log_file):
  20. """запись текущей телеметрии в csv"""
  21. telemetry = get_telemetry(frame_id='map')
  22. with open(log_file, 'a', newline='') as csvfile:
  23. writer = csv.writer(csvfile)
  24. writer.writerow([time.time(), telemetry.x, telemetry.y, telemetry.z])
  25.  
  26. # основной сценарий полета
  27. def flight_task(log_file):
  28. """выполнение полетного задания с записью телеметрии"""
  29. # создаем или очищаем лог-файл
  30. with open(log_file, 'w', newline='') as csvfile:
  31. writer = csv.writer(csvfile)
  32. writer.writerow(['Time', 'X', 'Y', 'Z'])
  33.  
  34. rospy.loginfo("начало выполнения полетного задания")
  35.  
  36. # взлет на высоту 4 метра
  37. rospy.loginfo("взлет до 4 метров")
  38. navigate(x=0, y=0, z=4, speed=0.5, frame_id='body', auto_arm=True)
  39. rospy.sleep(5)
  40. log_telemetry(log_file)
  41.  
  42. # полет к точке (5, 5, 5)
  43. rospy.loginfo("летим в точку (5, 5, 5)")
  44. navigate(x=5, y=5, z=5, speed=0.5, frame_id='map')
  45. rospy.sleep(10)
  46. log_telemetry(log_file)
  47.  
  48. # полет к точке (3, 3, 3)
  49. rospy.loginfo("летим в точку (3, 3, 3)")
  50. navigate(x=3, y=3, z=3, speed=0.5, frame_id='map')
  51. rospy.sleep(7)
  52. log_telemetry(log_file)
  53.  
  54. # полет к точке (2, 2, 2)
  55. rospy.loginfo("летим в точку (2, 2, 2)")
  56. navigate(x=2, y=2, z=2, speed=0.5, frame_id='map')
  57. rospy.sleep(5)
  58. log_telemetry(log_file)
  59.  
  60. # возвращаемся в точку (0, 0, 1)
  61. rospy.loginfo("возвращаемся в точку (0, 0, 1)")
  62. navigate(x=0, y=0, z=1, speed=0.5, frame_id='map')
  63. rospy.sleep(7)
  64. log_telemetry(log_file)
  65.  
  66. # посадка
  67. rospy.loginfo("начинаем посадку")
  68. land()
  69. rospy.loginfo("полетное задание выполнено")
  70.  
  71. # анализ логов
  72. def analyze_logs(output_file):
  73. """анализ логов телеметрии после полетов с записью итогов в файл"""
  74. with open(output_file, 'w') as analysis_file:
  75. for i in range(1, 4):
  76. log_file = f'flight_log_{i}.csv'
  77. if not os.path.exists(log_file):
  78. rospy.logwarn(f"лог-файл {log_file} не найден")
  79. analysis_file.write(f"лог-файл {log_file} не найден\n")
  80. continue
  81.  
  82. with open(log_file, 'r') as csvfile:
  83. reader = csv.reader(csvfile)
  84. next(reader) # пропускаем заголовок
  85. positions = [(float(row[1]), float(row[2]), float(row[3])) for row in reader]
  86.  
  87. if positions:
  88. start_pos = positions[0]
  89. end_pos = positions[-1]
  90. total_distance = sum(
  91. math.dist(positions[j], positions[j-1])
  92. for j in range(1, len(positions))
  93. )
  94. result = (
  95. f"анализ полетного теста {i}:\n"
  96. f" всего записей: {len(positions)}\n"
  97. f" начальная позиция: {start_pos}\n"
  98. f" конечная позиция: {end_pos}\n"
  99. f" общее пройденное расстояние: {total_distance:.2f} метров\n"
  100. )
  101. rospy.loginfo(result)
  102. analysis_file.write(result + "\n")
  103. else:
  104. rospy.logwarn(f"в {log_file} нет данных телеметрии")
  105. analysis_file.write(f"в {log_file} нет данных телеметрии\n")
  106.  
  107. if __name__ == '__main__':
  108. try:
  109. for i in range(1, 4):
  110. rospy.loginfo(f"начинаем полетный тест {i}")
  111. flight_task(log_file=f'flight_log_{i}.csv')
  112. rospy.loginfo(f"полетный тест {i} завершен")
  113. rospy.sleep(2) # пауза перед следующим тестом
  114.  
  115. # анализ логов после всех тестов
  116. analyze_logs(output_file='flight_analysis.txt')
  117.  
  118. except rospy.ROSInterruptException:
  119. pass
  120.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement