From e4115efa677b159f9312a9d47529b1ccb3db4b80 Mon Sep 17 00:00:00 2001 From: Clyde McQueen Date: Fri, 29 Mar 2024 10:32:37 -0700 Subject: [PATCH] Sub: publish filtered alt in mav msgs --- ArduSub/ArduSub.cpp | 50 +++++++++++++++++++++++++++++++++++++++++ ArduSub/GCS_Mavlink.cpp | 25 ++++++++++++--------- ArduSub/GCS_Mavlink.h | 1 + ArduSub/Sub.h | 2 ++ 4 files changed, 67 insertions(+), 11 deletions(-) diff --git a/ArduSub/ArduSub.cpp b/ArduSub/ArduSub.cpp index c6aa99373e..507a22fb1b 100644 --- a/ArduSub/ArduSub.cpp +++ b/ArduSub/ArduSub.cpp @@ -380,4 +380,54 @@ void Sub::stats_update(void) } #endif +// get the altitude relative to the home position or the ekf origin +float Sub::get_alt_rel() const +{ + if (!ap.depth_sensor_present) { + return 0; + } + + // get relative position + float posD; + if (ahrs.get_relative_position_D_origin(posD)) { + if (ahrs.home_is_set()) { + // adjust to the home position + auto home = ahrs.get_home(); + posD -= static_cast(home.alt) * 0.01f; + } + } else { + // fall back to the barometer reading + posD = -AP::baro().get_altitude(); + } + + // convert down to up + return -posD; +} + +// get the altitude above mean sea level +float Sub::get_alt_msl() const +{ + if (!ap.depth_sensor_present) { + return 0; + } + + Location origin; + if (!ahrs.get_origin(origin)) { + return 0; + } + + // get relative position + float posD; + if (!ahrs.get_relative_position_D_origin(posD)) { + // fall back to the barometer reading + posD = -AP::baro().get_altitude(); + } + + // add in the ekf origin altitude + posD -= static_cast(origin.alt) * 0.01f; + + // convert down to up + return -posD; +} + AP_HAL_MAIN_CALLBACKS(&sub); diff --git a/ArduSub/GCS_Mavlink.cpp b/ArduSub/GCS_Mavlink.cpp index 3ea5a72fa5..90e146760f 100644 --- a/ArduSub/GCS_Mavlink.cpp +++ b/ArduSub/GCS_Mavlink.cpp @@ -93,6 +93,11 @@ int16_t GCS_MAVLINK_Sub::vfr_hud_throttle() const return (int16_t)(sub.motors.get_throttle() * 100); } +float GCS_MAVLINK_Sub::vfr_hud_alt() const +{ + return sub.get_alt_msl(); +} + // Work around to get temperature sensor data out void GCS_MAVLINK_Sub::send_scaled_pressure3() { @@ -842,7 +847,8 @@ uint64_t GCS_MAVLINK_Sub::capabilities() const ); } -MAV_RESULT GCS_MAVLINK_Sub::handle_flight_termination(const mavlink_command_int_t &packet) { +MAV_RESULT GCS_MAVLINK_Sub::handle_flight_termination(const mavlink_command_int_t &packet) +{ if (packet.param1 > 0.5f) { sub.arming.disarm(AP_Arming::Method::TERMINATION); return MAV_RESULT_ACCEPTED; @@ -850,17 +856,14 @@ MAV_RESULT GCS_MAVLINK_Sub::handle_flight_termination(const mavlink_command_int_ return MAV_RESULT_FAILED; } -int32_t GCS_MAVLINK_Sub::global_position_int_alt() const { - if (!sub.ap.depth_sensor_present) { - return 0; - } - return GCS_MAVLINK::global_position_int_alt(); +int32_t GCS_MAVLINK_Sub::global_position_int_alt() const +{ + return static_cast(sub.get_alt_msl() * 1000.0f); } -int32_t GCS_MAVLINK_Sub::global_position_int_relative_alt() const { - if (!sub.ap.depth_sensor_present) { - return 0; - } - return GCS_MAVLINK::global_position_int_relative_alt(); + +int32_t GCS_MAVLINK_Sub::global_position_int_relative_alt() const +{ + return static_cast(sub.get_alt_rel() * 1000.0f); } #if HAL_HIGH_LATENCY2_ENABLED diff --git a/ArduSub/GCS_Mavlink.h b/ArduSub/GCS_Mavlink.h index 4b49f2246e..f02c782cd0 100644 --- a/ArduSub/GCS_Mavlink.h +++ b/ArduSub/GCS_Mavlink.h @@ -51,6 +51,7 @@ private: MAV_STATE vehicle_system_status() const override; int16_t vfr_hud_throttle() const override; + float vfr_hud_alt() const override; MAV_RESULT handle_MAV_CMD_CONDITION_YAW(const mavlink_command_int_t &packet); MAV_RESULT handle_MAV_CMD_MISSION_START(const mavlink_command_int_t &packet); diff --git a/ArduSub/Sub.h b/ArduSub/Sub.h index 483425f791..fee135282e 100644 --- a/ArduSub/Sub.h +++ b/ArduSub/Sub.h @@ -426,6 +426,8 @@ private: bool set_home_to_current_location(bool lock) WARN_IF_UNUSED; bool set_home(const Location& loc, bool lock) WARN_IF_UNUSED; bool far_from_EKF_origin(const Location& loc); + float get_alt_rel() const WARN_IF_UNUSED; + float get_alt_msl() const WARN_IF_UNUSED; void exit_mission(); bool verify_loiter_unlimited(); bool verify_loiter_time();