diff --git a/ROMFS/px4fmu_common/init.d-posix/airframes/10043_sihsim_standard_vtol b/ROMFS/px4fmu_common/init.d-posix/airframes/10043_sihsim_standard_vtol index 4abc9de264..48f48884d8 100644 --- a/ROMFS/px4fmu_common/init.d-posix/airframes/10043_sihsim_standard_vtol +++ b/ROMFS/px4fmu_common/init.d-posix/airframes/10043_sihsim_standard_vtol @@ -61,9 +61,9 @@ param set-default CA_SV_CS1_TYPE 3 # elevator param set-default CA_SV_CS2_TRQ_Y 1 param set-default CA_SV_CS2_TYPE 4 # rudder -param set-default FW_AIRSPD_MIN 7 -param set-default FW_AIRSPD_TRIM 10 -param set-default FW_AIRSPD_MAX 12 +param set-default FW_AIRSPD_MIN 10 +param set-default FW_AIRSPD_TRIM 15 +param set-default FW_AIRSPD_MAX 20 param set-default PWM_MAIN_FUNC1 101 param set-default PWM_MAIN_FUNC2 102 @@ -81,8 +81,35 @@ param set-default MAV_TYPE 22 param set-default SENS_DPRES_OFF 0.001 + +# +# # gazebo model: +# # https://github.com/PX4/PX4-gazebo-models/blob/main/models/standard_vtol/model.sdf +# # notes about gazebo models: +# # https://github.com/mvernacc/gazebo_motor_model_docs/blob/master/notes.pdf +# +# # max thrust = maxRotVelocity**2 * motorConstant +# param set SIH_T_MAX 45 +# +# # max torque = ?? +# param set SIH_Q_MAX 0.0165 +# +# # = base_link mass (rest irrelevant) +# param set SIH_MASS 5 +# +# param set SIH_IXX 0.4777 +# param set SIH_IYY 0.3417 +# param set SIH_IZZ 0.8110 +# param set SIH_IXZ 0 +# +# param set SIH_KDV 0.2 +# +# param set SIH_T_MAX 6.5 +# param set SIH_MASS 0.65 + param set SIH_T_MAX 2.0 param set SIH_Q_MAX 0.0165 + param set SIH_MASS 0.2 # IXX and IZZ are inverted from the thesis as the body frame is pitched by 90 deg param set SIH_IXX 0.00354 diff --git a/src/modules/simulation/simulator_sih/sih.cpp b/src/modules/simulation/simulator_sih/sih.cpp index e2fc41c4b4..de8c4de9bc 100644 --- a/src/modules/simulation/simulator_sih/sih.cpp +++ b/src/modules/simulation/simulator_sih/sih.cpp @@ -217,13 +217,13 @@ void Sih::sensor_step() reconstruct_sensors_signals(now); - if ((_vehicle == VehicleType::FixedWing - || _vehicle == VehicleType::TailsitterVTOL - || _vehicle == VehicleType::StandardVTOL) - && now - _airspeed_time >= 50_ms) { - _airspeed_time = now; - send_airspeed(now); - } + // if ((_vehicle == VehicleType::FixedWing + // || _vehicle == VehicleType::TailsitterVTOL + // || _vehicle == VehicleType::StandardVTOL) + // && now - _airspeed_time >= 50_ms) { + // _airspeed_time = now; + // send_airspeed(now); + // } // distance sensor published at 50 Hz if (now - _dist_snsr_time >= 20_ms @@ -362,14 +362,20 @@ void Sih::generate_force_and_torques(const float dt) } else if (_vehicle == VehicleType::StandardVTOL) { + // Pusher motor is usually stronger than one individual MC motor. + // matching this standard VTOL model here + // https://github.com/PX4/PX4-gazebo-models/blob/main/models/standard_vtol/model.sdf + // we have for the MC rotors (in sdf rotor_0 ... rotor_3, here _u[0]..._u[3]): + // max thrust = maxRotVelocity ** 2 * motorConstant = 1500**2 * 2e-5 = 45 N + // and for the pusher (in sdf rotor_puller, here _u[7]): + // max thrust = maxRotVelocity ** 2 * motorConstant = 3500**2 * 8.54858e-06 = 105 N + float T_MAX_PUSHER = 2 * _T_MAX * 105.f / 45.f; - _T_B = Vector3f(_T_MAX * 2 * _u[7], 0.0f, -_T_MAX * (+_u[0] + _u[1] + _u[2] + _u[3])); + _T_B = Vector3f(T_MAX_PUSHER * _u[7], 0.0f, -_T_MAX * (+_u[0] + _u[1] + _u[2] + _u[3])); _Mt_B = Vector3f(_L_ROLL * _T_MAX * (-_u[0] + _u[1] + _u[2] - _u[3]), _L_PITCH * _T_MAX * (+_u[0] - _u[1] + _u[2] - _u[3]), _Q_MAX * (+_u[0] + _u[1] - _u[2] - _u[3])); - // thrust 0 because it is already contained in _T_B. in - // equations_of_motion they are all summed into sum_of_forces_E generate_fw_aerodynamics(_u[4], _u[5], _u[6], _u[7]); } else if (_vehicle == VehicleType::RoverAckermann) { diff --git a/test/mavsdk_tests/test_multicopter_offboard.cpp b/test/mavsdk_tests/test_multicopter_offboard.cpp index 84d75ad049..2a405d22cc 100644 --- a/test/mavsdk_tests/test_multicopter_offboard.cpp +++ b/test/mavsdk_tests/test_multicopter_offboard.cpp @@ -34,7 +34,7 @@ #include "autopilot_tester.h" #include -static constexpr float acceptance_radius = 0.3f; +static constexpr float acceptance_radius = 0.5f; TEST_CASE("Offboard takeoff and land", "[multicopter][offboard]") { diff --git a/test/mavsdk_tests/test_vtol_loiter_airspeed_failure_blockage.cpp b/test/mavsdk_tests/test_vtol_loiter_airspeed_failure_blockage.cpp index a1e12c4933..70a338da5d 100644 --- a/test/mavsdk_tests/test_vtol_loiter_airspeed_failure_blockage.cpp +++ b/test/mavsdk_tests/test_vtol_loiter_airspeed_failure_blockage.cpp @@ -44,7 +44,7 @@ TEST_CASE("Fly VTOL Loiter with airspeed failure", "[vtol_airspeed_fail]") tester.enable_fixedwing_mectrics(); // configuration - const float takeoff_altitude = 10.f; + const float takeoff_altitude = 30.f; tester.set_takeoff_altitude(takeoff_altitude); tester.load_qgc_mission_raw_and_move_here("test/mavsdk_tests/vtol_mission.plan"); @@ -53,6 +53,7 @@ TEST_CASE("Fly VTOL Loiter with airspeed failure", "[vtol_airspeed_fail]") tester.takeoff(); tester.wait_until_altitude(takeoff_altitude, std::chrono::seconds(30)); tester.transition_to_fixedwing(); + tester.wait_until_fixedwing(std::chrono::seconds(10)); // tester.wait_until_altitude(50.f, std::chrono::seconds(30)); diff --git a/test/mavsdk_tests/test_vtol_rtl.cpp b/test/mavsdk_tests/test_vtol_rtl.cpp index 75e28d3820..b8df7bbf1e 100644 --- a/test/mavsdk_tests/test_vtol_rtl.cpp +++ b/test/mavsdk_tests/test_vtol_rtl.cpp @@ -45,7 +45,7 @@ TEST_CASE("RTL direct Home", "[vtol]") tester.set_rtl_appr_force(0); tester.arm(); tester.execute_rtl_when_reaching_mission_sequence(2); - tester.wait_until_disarmed(std::chrono::seconds(120)); + tester.wait_until_disarmed(std::chrono::seconds(180)); tester.check_home_within(5.0f); } @@ -60,7 +60,7 @@ TEST_CASE("RTL direct Mission Land", "[vtol]") tester.set_rtl_type(1); tester.arm(); tester.execute_rtl_when_reaching_mission_sequence(2); - tester.wait_until_disarmed(std::chrono::seconds(120)); + tester.wait_until_disarmed(std::chrono::seconds(180)); tester.check_mission_land_within(5.0f); }