Skip to content

Тестування інтеграції з використанням ROS

У цій темі пояснюється, як запускати (і розширювати) інтеграційні тести PX4 на основі ROS.

Під час написання нових тестів бажано тестування інтеграції MAVSDK. Використовуйте тестову інтеграційну структуру на основі ROS для випадків використання, які вимагають ROS (наприклад, уникнення об’єктів).

Усі тести інтеграції PX4 виконуються автоматично нашою системою Безперервної інтеграції.

Попередня підготовка:

Виконати тести

Щоб запустити тести MAVROS:

sh
source <catkin_ws>/devel/setup.bash
cd <PX4-Autopilot_clone>
make px4_sitl_default sitl_gazebo
make <test_target>

test_target – це цілі makefile із набору: tests_mission, tests_mission_coverage, tests_offboard і tests_avoidance.

Тест також можна виконати безпосередньо, запустивши тестові сценарії, розташовані в test/:

sh
source <catkin_ws>/devel/setup.bash
cd <PX4-Autopilot_clone>
make px4_sitl_default sitl_gazebo
./test/<test_bash_script> <test_launch_file>

Наприклад:

sh
./test/rostest_px4_run.sh mavros_posix_tests_offboard_posctl.test

Тести також можна запускати за допомогою графічного інтерфейсу користувача, щоб побачити, що відбувається (за замовчуванням тести виконуються без голови):

sh
./test/rostest_px4_run.sh mavros_posix_tests_offboard_posctl.test gui:=true headless:=false

Файли .test запускають відповідні тести Python, визначені в integrationtests/python_src/px4_it/mavros/

Напишіть новий MAVROS-тест (Python)

Цей розділ пояснює, як написати новий python тест з використанням ROS 1/MAVROS, протестувати його та додати до набору тестів PX4.

Ми рекомендуємо вам переглянути існуючі тести як приклади/натхнення (integrationtests/python_src/px4_it/mavros/). В офіційній документації ROS також міститься інформація про те, як використовувати unittest (на якому базується цей тестовий набір).

Щоб написати новий тест:

  1. Створити новий тестовий скрипт, копіюючи порожній тестовий каркас нижче:

    python
    #!/usr/bin/env python
    # [... LICENSE ...]
    
    #
    # @author Example Author <author@example.com>
    #
    PKG = 'px4'
    
    import unittest
    import rospy
    import rosbag
    
    from sensor_msgs.msg import NavSatFix
    
    class MavrosNewTest(unittest.TestCase):
     """
     Test description
     """
    
     def setUp(self):
         rospy.init_node('test_node', anonymous=True)
         rospy.wait_for_service('mavros/cmd/arming', 30)
    
         rospy.Subscriber("mavros/global_position/global", NavSatFix, self.global_position_callback)
         self.rate = rospy.Rate(10) # 10hz
         self.has_global_pos = False
    
     def tearDown(self):
         pass
    
     #
     # General callback functions used in tests
     #
     def global_position_callback(self, data):
         self.has_global_pos = True
    
     def test_method(self):
         """Test method description"""
    
         # FIXME: hack to wait for simulation to be ready
         while not self.has_global_pos:
             self.rate.sleep()
    
         # TODO: execute test
    
    if __name__ == '__main__':
     import rostest
     rostest.rosrun(PKG, 'mavros_new_test', MavrosNewTest)
  2. Запустити лише новий тест

    • Запустити симулятор

      sh
      cd <PX4-Autopilot_clone>
      source Tools/simulation/gazebo/setup_gazebo.bash
      roslaunch launch/mavros_posix_sitl.launch
    • Запустити тест (в новій оболонці):

      sh
      cd <PX4-Autopilot_clone>
      source Tools/simulation/gazebo/setup_gazebo.bash
      rosrun px4 mavros_new_test.py
  3. Додати новий тестовий вузол до файлу запуску

    • У test/ створіть новий файл запуску ROS <test_name>.test.
    • Викличте тестовий файл, використовуючи один з базових скриптів rostest_px4_run.sh або rostest_avoidancance_run.sh
  4. (Необов'язково) Створити нову ціль в Makefile

    • Відкрийте Makefile
    • Пошук Testing секції
    • Додати нову назву цілі та викликати тест

    Наприклад:

    sh
    tests_<new_test_target_name>: rostest
     @"$(SRC_DIR)"/test/rostest_px4_run.sh mavros_posix_tests_<new_test>.test

Запустити тести, як описані вище.