VTOL: take home_position into account for ground clearance (#20683)

* VTOL: take home_position into account for ground clearance

For approximating distance to ground in case there is no valid distance sensor
data, subtract the home position altitude from the local position altitude.

Signed-off-by: Silvan Fuhrer <silvan@auterion.com>
Co-authored-by: Matthias Grob <maetugr@gmail.com>
This commit is contained in:
Silvan Fuhrer 2022-12-06 13:19:35 +01:00 committed by GitHub
parent f1ff47c088
commit ac28c6b7e2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 27 additions and 3 deletions

View File

@ -320,6 +320,18 @@ VtolAttitudeControl::Run()
_airspeed_validated_sub.update(&_airspeed_validated);
_tecs_status_sub.update(&_tecs_status);
_land_detected_sub.update(&_land_detected);
if (_home_position_sub.updated()) {
home_position_s home_position;
if (_home_position_sub.copy(&home_position) && home_position.valid_alt) {
_home_position_z = home_position.z;
} else {
_home_position_z = NAN;
}
}
vehicle_status_poll();
action_request_poll();
vehicle_cmd_poll();

View File

@ -67,6 +67,7 @@
#include <uORB/topics/action_request.h>
#include <uORB/topics/actuator_controls.h>
#include <uORB/topics/airspeed_validated.h>
#include <uORB/topics/home_position.h>
#include <uORB/topics/vehicle_air_data.h>
#include <uORB/topics/parameter_update.h>
#include <uORB/topics/position_setpoint_triplet.h>
@ -153,6 +154,7 @@ public:
struct vehicle_thrust_setpoint_s *get_thrust_setpoint_0() {return &_thrust_setpoint_0;}
struct vehicle_thrust_setpoint_s *get_thrust_setpoint_1() {return &_thrust_setpoint_1;}
struct vtol_vehicle_status_s *get_vtol_vehicle_status() {return &_vtol_vehicle_status;}
float get_home_position_z() { return _home_position_z; }
private:
void Run() override;
@ -165,6 +167,7 @@ private:
uORB::Subscription _action_request_sub{ORB_ID(action_request)};
uORB::Subscription _airspeed_validated_sub{ORB_ID(airspeed_validated)};
uORB::Subscription _fw_virtual_att_sp_sub{ORB_ID(fw_virtual_attitude_setpoint)};
uORB::Subscription _home_position_sub{ORB_ID(home_position)};
uORB::Subscription _land_detected_sub{ORB_ID(vehicle_land_detected)};
uORB::Subscription _local_pos_sp_sub{ORB_ID(vehicle_local_position_setpoint)};
uORB::Subscription _local_pos_sub{ORB_ID(vehicle_local_position)};
@ -212,6 +215,7 @@ private:
vehicle_local_position_setpoint_s _local_pos_sp{};
vehicle_status_s _vehicle_status{};
vtol_vehicle_status_s _vtol_vehicle_status{};
float _home_position_z{NAN};
float _air_density{CONSTANTS_AIR_DENSITY_SEA_LEVEL_15C}; // [kg/m^3]

View File

@ -286,11 +286,19 @@ void VtolType::check_quadchute_condition()
float VtolType::pusher_assist()
{
// Altitude above ground is distance sensor altitude if available, otherwise local z-position
float dist_to_ground = -_local_pos->z;
// Altitude above ground is local z-position or altitude above home or distance sensor altitude depending on what's available
float dist_to_ground = 0.f;
const float home_position_z = _attc->get_home_position_z();
if (_local_pos->dist_bottom_valid) {
dist_to_ground = _local_pos->dist_bottom;
} else if (PX4_ISFINITE(home_position_z)) {
dist_to_ground = -(_local_pos->z - home_position_z);
} else {
dist_to_ground = -_local_pos->z;
}
// disable pusher assist depending on setting of forward_thrust_enable_mode:

View File

@ -188,7 +188,7 @@ protected:
struct actuator_controls_s *_actuators_fw_in; //actuator controls from fw_att_control
struct vehicle_local_position_s *_local_pos;
struct vehicle_local_position_setpoint_s *_local_pos_sp;
struct airspeed_validated_s *_airspeed_validated; // airspeed
struct airspeed_validated_s *_airspeed_validated; // airspeed
struct tecs_status_s *_tecs_status;
struct vehicle_land_detected_s *_land_detected;