diff --git a/test/mavsdk_tests/autopilot_tester.cpp b/test/mavsdk_tests/autopilot_tester.cpp index 2ce3c3e12a..0baf2b0622 100644 --- a/test/mavsdk_tests/autopilot_tester.cpp +++ b/test/mavsdk_tests/autopilot_tester.cpp @@ -62,7 +62,7 @@ void AutopilotTester::wait_until_ready() { std::cout << "Waiting for system to be ready" << std::endl; CHECK(poll_condition_with_timeout( - [this]() { return _telemetry->health_all_ok(); }, std::chrono::seconds(20))); + [this]() { return _telemetry->health_all_ok(); }, std::chrono::seconds(30))); // FIXME: workaround to prevent race between PX4 switching to Hold mode // and us trying to arm and take off. If PX4 is not in Hold mode yet, @@ -159,7 +159,7 @@ void AutopilotTester::wait_until_disarmed(std::chrono::seconds timeout_duration) void AutopilotTester::wait_until_hovering() { REQUIRE(poll_condition_with_timeout( - [this]() { return _telemetry->landed_state() == Telemetry::LandedState::InAir; }, std::chrono::seconds(20))); + [this]() { return _telemetry->landed_state() == Telemetry::LandedState::InAir; }, std::chrono::seconds(30))); } void AutopilotTester::prepare_square_mission(MissionOptions mission_options) @@ -235,7 +235,7 @@ void AutopilotTester::execute_mission_and_lose_gps() CHECK(_param->set_param_int("SYS_FAILURE_EN", 1) == Param::Result::Success); _mission->subscribe_mission_progress([this](Mission::MissionProgress progress) { - std::cout << "Progress: " << progress.current << "/" << progress.total; + std::cout << "Progress: " << progress.current << "/" << progress.total << std::endl; if (progress.current == 1) { std::thread([this]() { @@ -258,7 +258,7 @@ void AutopilotTester::execute_mission_and_lose_gps() [this]() { auto flight_mode = _telemetry->flight_mode(); return flight_mode == Telemetry::FlightMode::Land; - }, std::chrono::seconds(60))); + }, std::chrono::seconds(90))); } void AutopilotTester::execute_mission_and_lose_mag() @@ -266,7 +266,7 @@ void AutopilotTester::execute_mission_and_lose_mag() CHECK(_param->set_param_int("SYS_FAILURE_EN", 1) == Param::Result::Success); _mission->subscribe_mission_progress([this](Mission::MissionProgress progress) { - std::cout << "Progress: " << progress.current << "/" << progress.total; + std::cout << "Progress: " << progress.current << "/" << progress.total << std::endl; if (progress.current == 1) { std::thread([this]() { @@ -289,7 +289,7 @@ void AutopilotTester::execute_mission_and_lose_mag() [this]() { auto progress = _mission->mission_progress(); return progress.current == progress.total; - }, std::chrono::seconds(60))); + }, std::chrono::seconds(90))); } @@ -298,7 +298,7 @@ void AutopilotTester::execute_mission_and_lose_baro() CHECK(_param->set_param_int("SYS_FAILURE_EN", 1) == Param::Result::Success); _mission->subscribe_mission_progress([this](Mission::MissionProgress progress) { - std::cout << "Progress: " << progress.current << "/" << progress.total; + std::cout << "Progress: " << progress.current << "/" << progress.total << std::endl; if (progress.current == 1) { std::thread([this]() { @@ -321,7 +321,7 @@ void AutopilotTester::execute_mission_and_lose_baro() [this]() { auto progress = _mission->mission_progress(); return progress.current == progress.total; - }, std::chrono::seconds(60))); + }, std::chrono::seconds(90))); } void AutopilotTester::execute_mission_and_get_baro_stuck() @@ -329,7 +329,7 @@ void AutopilotTester::execute_mission_and_get_baro_stuck() CHECK(_param->set_param_int("SYS_FAILURE_EN", 1) == Param::Result::Success); _mission->subscribe_mission_progress([this](Mission::MissionProgress progress) { - std::cout << "Progress: " << progress.current << "/" << progress.total; + std::cout << "Progress: " << progress.current << "/" << progress.total << std::endl; if (progress.current == 1) { std::thread([this]() { @@ -352,7 +352,7 @@ void AutopilotTester::execute_mission_and_get_baro_stuck() [this]() { auto progress = _mission->mission_progress(); return progress.current == progress.total; - }, std::chrono::seconds(60))); + }, std::chrono::seconds(90))); } void AutopilotTester::execute_mission_and_get_mag_stuck() @@ -360,7 +360,7 @@ void AutopilotTester::execute_mission_and_get_mag_stuck() CHECK(_param->set_param_int("SYS_FAILURE_EN", 1) == Param::Result::Success); _mission->subscribe_mission_progress([this](Mission::MissionProgress progress) { - std::cout << "Progress: " << progress.current << "/" << progress.total; + std::cout << "Progress: " << progress.current << "/" << progress.total << std::endl; if (progress.current == 1) { std::thread([this]() { @@ -383,7 +383,7 @@ void AutopilotTester::execute_mission_and_get_mag_stuck() [this]() { auto progress = _mission->mission_progress(); return progress.current == progress.total; - }, std::chrono::seconds(60))); + }, std::chrono::seconds(120))); } CoordinateTransformation AutopilotTester::get_coordinate_transformation() @@ -480,9 +480,16 @@ void AutopilotTester::offboard_land() bool AutopilotTester::estimated_position_close_to(const Offboard::PositionNedYaw &target_pos, float acceptance_radius_m) { Telemetry::PositionNed est_pos = _telemetry->position_velocity_ned().position; - return sq(est_pos.north_m - target_pos.north_m) + - sq(est_pos.east_m - target_pos.east_m) + - sq(est_pos.down_m - target_pos.down_m) < sq(acceptance_radius_m); + const float distance_m = std::sqrt(sq(est_pos.north_m - target_pos.north_m) + + sq(est_pos.east_m - target_pos.east_m) + + sq(est_pos.down_m - target_pos.down_m)); + const bool pass = distance_m < acceptance_radius_m; + + if (!pass) { + std::cout << "distance: " << distance_m << ", " << "acceptance: " << acceptance_radius_m << std::endl; + } + + return pass; } bool AutopilotTester::estimated_horizontal_position_close_to(const Offboard::PositionNedYaw &target_pos, @@ -538,6 +545,12 @@ std::chrono::milliseconds AutopilotTester::adjust_to_lockstep_speed(std::chrono: auto speed_factor = _info->get_speed_factor(); if (speed_factor.first == Info::Result::Success) { + // FIXME: Remove this again: + // Sanitize speed factor to avoid test failures. + if (speed_factor.second > 20.0f) { + speed_factor.second = 20.0f; + } + return static_cast( static_cast( std::round( diff --git a/test/mavsdk_tests/autopilot_tester.h b/test/mavsdk_tests/autopilot_tester.h index f6d391a7c7..4040e129e6 100644 --- a/test/mavsdk_tests/autopilot_tester.h +++ b/test/mavsdk_tests/autopilot_tester.h @@ -79,7 +79,7 @@ public: void land(); void transition_to_fixedwing(); void transition_to_multicopter(); - void wait_until_disarmed(std::chrono::seconds timeout_duration = std::chrono::seconds(90)); + void wait_until_disarmed(std::chrono::seconds timeout_duration = std::chrono::seconds(60)); void wait_until_hovering(); void prepare_square_mission(MissionOptions mission_options); void prepare_straight_mission(MissionOptions mission_options); @@ -116,13 +116,13 @@ private: std::function fun, std::chrono::duration duration) { // We need millisecond resolution for sleeping. - std::chrono::milliseconds duration_ms(duration); - adjust_to_lockstep_speed(duration_ms); + const std::chrono::milliseconds duration_ms(duration); + const auto duration_ms_adjusted = adjust_to_lockstep_speed(duration_ms); unsigned iteration = 0; while (!fun()) { - std::this_thread::sleep_for(duration_ms / 100); + std::this_thread::sleep_for(duration_ms_adjusted / 100); if (iteration++ >= 100) { return false; diff --git a/test/mavsdk_tests/test_multicopter_failsafe.cpp b/test/mavsdk_tests/test_multicopter_failsafe.cpp index 09d1a70f98..8d06204df3 100644 --- a/test/mavsdk_tests/test_multicopter_failsafe.cpp +++ b/test/mavsdk_tests/test_multicopter_failsafe.cpp @@ -52,7 +52,8 @@ TEST_CASE("Land on GPS lost during mission (baro height mode)", "[multicopter][v tester.prepare_square_mission(mission_options); tester.arm(); tester.execute_mission_and_lose_gps(); - tester.wait_until_disarmed(); + std::chrono::seconds until_disarmed_timeout = std::chrono::seconds(30); + tester.wait_until_disarmed(until_disarmed_timeout); } TEST_CASE("Land on GPS lost during mission (GPS height mode)", "[multicopter][vtol]") @@ -68,7 +69,8 @@ TEST_CASE("Land on GPS lost during mission (GPS height mode)", "[multicopter][vt tester.prepare_square_mission(mission_options); tester.arm(); tester.execute_mission_and_lose_gps(); - tester.wait_until_disarmed(); + std::chrono::seconds until_disarmed_timeout = std::chrono::seconds(30); + tester.wait_until_disarmed(until_disarmed_timeout); } TEST_CASE("Continue on mag lost during mission", "[multicopter][vtol]") @@ -82,7 +84,8 @@ TEST_CASE("Continue on mag lost during mission", "[multicopter][vtol]") tester.prepare_square_mission(mission_options); tester.arm(); tester.execute_mission_and_lose_mag(); - tester.wait_until_disarmed(); + std::chrono::seconds until_disarmed_timeout = std::chrono::seconds(120); + tester.wait_until_disarmed(until_disarmed_timeout); } TEST_CASE("Continue on mag stuck during mission", "[multicopter][vtol]") @@ -96,7 +99,8 @@ TEST_CASE("Continue on mag stuck during mission", "[multicopter][vtol]") tester.prepare_square_mission(mission_options); tester.arm(); tester.execute_mission_and_get_mag_stuck(); - tester.wait_until_disarmed(); + std::chrono::seconds until_disarmed_timeout = std::chrono::seconds(90); + tester.wait_until_disarmed(until_disarmed_timeout); } TEST_CASE("Continue on baro lost during mission (baro height mode)", "[multicopter][vtol]") @@ -111,7 +115,8 @@ TEST_CASE("Continue on baro lost during mission (baro height mode)", "[multicopt tester.prepare_square_mission(mission_options); tester.arm(); tester.execute_mission_and_lose_baro(); - tester.wait_until_disarmed(); + std::chrono::seconds until_disarmed_timeout = std::chrono::seconds(90); + tester.wait_until_disarmed(until_disarmed_timeout); } TEST_CASE("Continue on baro lost during mission (GPS height mode)", "[multicopter][vtol]") @@ -126,7 +131,8 @@ TEST_CASE("Continue on baro lost during mission (GPS height mode)", "[multicopte tester.prepare_square_mission(mission_options); tester.arm(); tester.execute_mission_and_lose_baro(); - tester.wait_until_disarmed(); + std::chrono::seconds until_disarmed_timeout = std::chrono::seconds(90); + tester.wait_until_disarmed(until_disarmed_timeout); } TEST_CASE("Continue on baro stuck during mission (baro height mode)", "[multicopter][vtol]") @@ -141,7 +147,8 @@ TEST_CASE("Continue on baro stuck during mission (baro height mode)", "[multicop tester.prepare_square_mission(mission_options); tester.arm(); tester.execute_mission_and_get_baro_stuck(); - tester.wait_until_disarmed(); + std::chrono::seconds until_disarmed_timeout = std::chrono::seconds(90); + tester.wait_until_disarmed(until_disarmed_timeout); } TEST_CASE("Continue on baro stuck during mission (GPS height mode)", "[multicopter][vtol]") @@ -156,5 +163,6 @@ TEST_CASE("Continue on baro stuck during mission (GPS height mode)", "[multicopt tester.prepare_square_mission(mission_options); tester.arm(); tester.execute_mission_and_get_baro_stuck(); - tester.wait_until_disarmed(); + std::chrono::seconds until_disarmed_timeout = std::chrono::seconds(90); + tester.wait_until_disarmed(until_disarmed_timeout); } diff --git a/test/mavsdk_tests/test_multicopter_mission.cpp b/test/mavsdk_tests/test_multicopter_mission.cpp index 9292a1a5bd..c171d458d8 100644 --- a/test/mavsdk_tests/test_multicopter_mission.cpp +++ b/test/mavsdk_tests/test_multicopter_mission.cpp @@ -48,36 +48,41 @@ TEST_CASE("Takeoff and Land", "[multicopter][vtol]") tester.takeoff(); tester.wait_until_hovering(); tester.land(); - std::chrono::seconds until_disarmed_timeout = std::chrono::seconds(15); + std::chrono::seconds until_disarmed_timeout = std::chrono::seconds(30); tester.wait_until_disarmed(until_disarmed_timeout); } -TEST_CASE("Fly square Multicopter Missions", "[multicopter][vtol]") +TEST_CASE("Fly square Multicopter Missions including RTL", "[multicopter][vtol]") { AutopilotTester tester; tester.connect(connection_url); tester.wait_until_ready(); - SECTION("Mission including RTL") { - AutopilotTester::MissionOptions mission_options; - mission_options.rtl_at_end = true; - tester.prepare_square_mission(mission_options); - tester.arm(); - tester.execute_mission(); - tester.wait_until_disarmed(); - } + AutopilotTester::MissionOptions mission_options; + mission_options.rtl_at_end = true; + tester.prepare_square_mission(mission_options); + tester.arm(); + tester.execute_mission(); + std::chrono::seconds until_disarmed_timeout = std::chrono::seconds(180); + tester.wait_until_disarmed(until_disarmed_timeout); +} - SECTION("Mission with manual RTL") { - AutopilotTester::MissionOptions mission_options; - mission_options.rtl_at_end = false; - tester.prepare_square_mission(mission_options); - tester.check_tracks_mission(); - tester.arm(); - tester.execute_mission(); - tester.wait_until_hovering(); - tester.execute_rtl(); - tester.wait_until_disarmed(); - } +TEST_CASE("Fly square Multicopter Missions with manual RTL", "[multicopter][vtol]") +{ + AutopilotTester tester; + tester.connect(connection_url); + tester.wait_until_ready(); + + AutopilotTester::MissionOptions mission_options; + mission_options.rtl_at_end = false; + tester.prepare_square_mission(mission_options); + tester.check_tracks_mission(); + tester.arm(); + tester.execute_mission(); + tester.wait_until_hovering(); + tester.execute_rtl(); + std::chrono::seconds until_disarmed_timeout = std::chrono::seconds(180); + tester.wait_until_disarmed(until_disarmed_timeout); } TEST_CASE("Fly straight Multicopter Mission", "[multicopter]") @@ -96,5 +101,6 @@ TEST_CASE("Fly straight Multicopter Mission", "[multicopter]") tester.execute_mission(); tester.wait_until_hovering(); tester.execute_rtl(); - tester.wait_until_disarmed(); + std::chrono::seconds until_disarmed_timeout = std::chrono::seconds(60); + tester.wait_until_disarmed(until_disarmed_timeout); } diff --git a/test/mavsdk_tests/test_multicopter_offboard.cpp b/test/mavsdk_tests/test_multicopter_offboard.cpp index 3f9cb650b5..f1fd7f7efc 100644 --- a/test/mavsdk_tests/test_multicopter_offboard.cpp +++ b/test/mavsdk_tests/test_multicopter_offboard.cpp @@ -47,7 +47,7 @@ TEST_CASE("Offboard takeoff and land", "[multicopter][offboard][nogps]") tester.wait_until_ready_local_position_only(); tester.store_home(); tester.arm(); - std::chrono::seconds goto_timeout = std::chrono::seconds(20); + std::chrono::seconds goto_timeout = std::chrono::seconds(30); tester.offboard_goto(takeoff_position, 0.1f, goto_timeout); tester.offboard_land(); tester.wait_until_disarmed(goto_timeout); @@ -65,7 +65,7 @@ TEST_CASE("Offboard position control", "[multicopter][offboard][nogps]") tester.wait_until_ready_local_position_only(); tester.store_home(); tester.arm(); - std::chrono::seconds goto_timeout = std::chrono::seconds(20); + std::chrono::seconds goto_timeout = std::chrono::seconds(30); tester.offboard_goto(takeoff_position, 0.1f, goto_timeout); tester.offboard_goto(setpoint_1, 0.1f, goto_timeout); tester.offboard_goto(setpoint_2, 0.1f, goto_timeout);