From a98f5d2ab2e7272fd14f25d40553f2ea560376be Mon Sep 17 00:00:00 2001 From: baumanta <baumanta@student.ethz.ch> Date: Thu, 29 Nov 2018 13:29:20 +0100 Subject: [PATCH] suggestion for treating obstacle avoidance heartbeats --- msg/telemetry_status.msg | 7 ++-- src/modules/commander/Commander.cpp | 53 +++++++++++++++++++++++- src/modules/commander/Commander.hpp | 12 +++++- src/modules/mavlink/mavlink_receiver.cpp | 11 ++++- src/modules/mavlink/mavlink_receiver.h | 1 + 5 files changed, 76 insertions(+), 8 deletions(-) diff --git a/msg/telemetry_status.msg b/msg/telemetry_status.msg index bce7ffc520..d9643c1bfa 100644 --- a/msg/telemetry_status.msg +++ b/msg/telemetry_status.msg @@ -6,9 +6,10 @@ uint8 LINK_TYPE_USB = 4 uint8 LINK_TYPE_IRIDIUM = 5 # MAV_COMPONENT (fill in as needed) -uint8 COMPONENT_ID_ALL = 0 -uint8 COMPONENT_ID_AUTOPILOT1 = 1 -uint8 COMPONENT_ID_CAMERA = 100 +uint8 COMPONENT_ID_ALL = 0 +uint8 COMPONENT_ID_AUTOPILOT1 = 1 +uint8 COMPONENT_ID_CAMERA = 100 +uint8 COMPONENT_ID_OBSTACLE_AVOIDANCE = 196 # MAV_TYPE (fill in as needed) uint8 MAV_TYPE_GENERIC = 0 diff --git a/src/modules/commander/Commander.cpp b/src/modules/commander/Commander.cpp index 6959b8e98f..544815c665 100644 --- a/src/modules/commander/Commander.cpp +++ b/src/modules/commander/Commander.cpp @@ -3903,7 +3903,18 @@ void Commander::data_link_check(bool &status_changed) case (telemetry_status_s::MAV_TYPE_ONBOARD_CONTROLLER): _datalink_last_heartbeat_onboard_controller = telemetry.heartbeat_time; - // TODO: FYI @baumanta + _onboard_controller_lost = false; + + if (telemetry.remote_component_id == telemetry_status_s::COMPONENT_ID_OBSTACLE_AVOIDANCE) { + if (telemetry.heartbeat_time != _datalink_last_heartbeat_avoidance_system) { + _avoidance_system_status_change = _datalink_last_status_avoidance_system != telemetry.remote_system_status; + } + + _datalink_last_heartbeat_avoidance_system = telemetry.heartbeat_time; + _datalink_last_status_avoidance_system = telemetry.remote_system_status; + _avoidance_system_lost = false; + } + break; } } @@ -3936,6 +3947,46 @@ void Commander::data_link_check(bool &status_changed) mavlink_log_critical(&mavlink_log_pub, "ONBOARD CONTROLLER LOST"); } + // AVOIDANCE SYSTEM state check (only if it is enabled) + if (_obs_avoid.get()) { + + //if avoidance never started + if (_datalink_last_heartbeat_avoidance_system == 0 && hrt_elapsed_time(&_avoidance_system_not_started) > 5_s) { + _avoidance_system_not_started = hrt_absolute_time(); + mavlink_log_critical(&mavlink_log_pub, "AVOIDANCE SYSTEM DID NOT START"); + } + + //if heartbeats stop + if ((_datalink_last_heartbeat_avoidance_system > 0) + && (hrt_elapsed_time(&_datalink_last_heartbeat_avoidance_system) > 5_s) && + (hrt_elapsed_time(&_avoidance_system_lost) > 5_s)) { + _avoidance_system_lost = hrt_absolute_time(); + mavlink_log_critical(&mavlink_log_pub, "AVOIDANCE SYSTEM LOST"); + } + + //if status changed + if (_avoidance_system_status_change) { + if (_datalink_last_status_avoidance_system == telemetry_status_s::MAV_STATE_BOOT) { + mavlink_log_info(&mavlink_log_pub, "AVOIDANCE SYSTEM STARTING"); + } + + if (_datalink_last_status_avoidance_system == telemetry_status_s::MAV_STATE_ACTIVE) { + mavlink_log_info(&mavlink_log_pub, "AVOIDANCE SYSTEM HEALTHY"); + } + + if (_datalink_last_status_avoidance_system == telemetry_status_s::MAV_STATE_CRITICAL) { + mavlink_log_critical(&mavlink_log_pub, "AVOIDANCE SYSTEM TIMEOUT"); + } + + if (_datalink_last_status_avoidance_system == telemetry_status_s::MAV_STATE_FLIGHT_TERMINATION) { + mavlink_log_critical(&mavlink_log_pub, "AVOIDANCE SYSTEM ABORT"); + } + + _avoidance_system_status_change = false; + } + } + + // high latency data link loss failsafe if (hrt_elapsed_time(&_high_latency_datalink_heartbeat) > (_high_latency_datalink_loss_threshold.get() * 1_s)) { _high_latency_datalink_lost = hrt_absolute_time(); diff --git a/src/modules/commander/Commander.hpp b/src/modules/commander/Commander.hpp index f6a8f4013d..345f739d06 100644 --- a/src/modules/commander/Commander.hpp +++ b/src/modules/commander/Commander.hpp @@ -116,7 +116,9 @@ private: (ParamInt<px4::params::COM_POS_FS_GAIN>) _failsafe_pos_gain, (ParamInt<px4::params::COM_LOW_BAT_ACT>) _low_bat_action, - (ParamFloat<px4::params::COM_DISARM_LAND>) _disarm_when_landed_timeout + (ParamFloat<px4::params::COM_DISARM_LAND>) _disarm_when_landed_timeout, + + (ParamInt<px4::params::MPC_OBS_AVOID>) _obs_avoid ) const int64_t POSVEL_PROBATION_MIN = 1_s; /**< minimum probation duration (usec) */ @@ -178,7 +180,13 @@ private: uint64_t _datalink_last_heartbeat_onboard_controller{0}; uint64_t _onboard_controller_lost{0}; - int _iridiumsbd_status_sub{-1}; + uint64_t _datalink_last_heartbeat_avoidance_system{0}; + uint64_t _avoidance_system_lost{0}; + uint64_t _avoidance_system_not_started{0}; + bool _avoidance_system_status_change{0}; + uint64_t _datalink_last_status_avoidance_system{9}; + + int _iridiumsbd_status_sub{-1}; uint64_t _high_latency_datalink_heartbeat{0}; uint64_t _high_latency_datalink_lost{0}; diff --git a/src/modules/mavlink/mavlink_receiver.cpp b/src/modules/mavlink/mavlink_receiver.cpp index 716c1791ff..9a4c81e6f9 100644 --- a/src/modules/mavlink/mavlink_receiver.cpp +++ b/src/modules/mavlink/mavlink_receiver.cpp @@ -1882,8 +1882,8 @@ MavlinkReceiver::handle_message_heartbeat(mavlink_message_t *msg) mavlink_heartbeat_t hb; mavlink_msg_heartbeat_decode(msg, &hb); - // ignore own heartbeats - if ((msg->sysid != mavlink_system.sysid) && (msg->compid != mavlink_system.compid)) { + /* ignore own heartbeats, accept only heartbeats from GCS */ + if (msg->sysid != mavlink_system.sysid || hb.type == MAV_TYPE_ONBOARD_CONTROLLER) { telemetry_status_s &tstatus = _mavlink->get_telemetry_status(); @@ -1895,6 +1895,13 @@ MavlinkReceiver::handle_message_heartbeat(mavlink_message_t *msg) tstatus.remote_component_id = msg->compid; tstatus.remote_type = hb.type; tstatus.remote_system_status = hb.system_status; + + if (_telem_status_pub == nullptr) { + _telem_status_pub = orb_advertise(ORB_ID(telemetry_status), &tstatus); + + } else { + orb_publish(ORB_ID(telemetry_status), _telem_status_pub, &tstatus); + } } } } diff --git a/src/modules/mavlink/mavlink_receiver.h b/src/modules/mavlink/mavlink_receiver.h index caa294ea6e..676b441d77 100644 --- a/src/modules/mavlink/mavlink_receiver.h +++ b/src/modules/mavlink/mavlink_receiver.h @@ -253,6 +253,7 @@ private: orb_advert_t _rc_pub{nullptr}; orb_advert_t _trajectory_waypoint_pub{nullptr}; orb_advert_t _transponder_report_pub{nullptr}; + orb_advert_t _telem_status_pub{nullptr}; orb_advert_t _visual_odometry_pub{nullptr}; static constexpr int _gps_inject_data_queue_size{6}; -- GitLab