@ -1976,6 +1976,8 @@ Commander::run()
@@ -1976,6 +1976,8 @@ Commander::run()
// data link checks which update the status
data_link_check ( ) ;
avoidance_check ( ) ;
// engine failure detection
// TODO: move out of commander
if ( _actuator_controls_sub . updated ( ) ) {
@ -3614,7 +3616,6 @@ void Commander::data_link_check()
@@ -3614,7 +3616,6 @@ void Commander::data_link_check()
_datalink_last_status_avoidance_system = telemetry . remote_system_status ;
if ( _avoidance_system_lost ) {
mavlink_log_info ( & mavlink_log_pub , " Avoidance system regained " ) ;
_status_changed = true ;
_avoidance_system_lost = false ;
status_flags . avoidance_system_valid = true ;
@ -3654,42 +3655,29 @@ void Commander::data_link_check()
@@ -3654,42 +3655,29 @@ void Commander::data_link_check()
// AVOIDANCE SYSTEM state check (only if it is enabled)
if ( status_flags . avoidance_system_required & & ! _onboard_controller_lost ) {
//if avoidance never started
if ( _datalink_last_heartbeat_avoidance_system = = 0
& & hrt_elapsed_time ( & _datalink_last_heartbeat_avoidance_system ) > _param_com_oa_boot_t . get ( ) * 1 _s ) {
if ( ! _print_avoidance_msg_once ) {
mavlink_log_critical ( & mavlink_log_pub , " Avoidance system not available " ) ;
_print_avoidance_msg_once = true ;
}
}
//if heartbeats stop
if ( ! _avoidance_system_lost & & ( _datalink_last_heartbeat_avoidance_system > 0 )
& & ( hrt_elapsed_time ( & _datalink_last_heartbeat_avoidance_system ) > 5 _s ) ) {
_avoidance_system_lost = true ;
mavlink_log_critical ( & mavlink_log_pub , " Avoidance system lost " ) ;
status_flags . avoidance_system_valid = false ;
_print_avoidance_msg_once = false ;
}
//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 " ) ;
status_flags . avoidance_system_valid = false ;
}
if ( _datalink_last_status_avoidance_system = = telemetry_status_s : : MAV_STATE_ACTIVE ) {
mavlink_log_info ( & mavlink_log_pub , " Avoidance system connected " ) ;
status_flags . avoidance_system_valid = true ;
}
if ( _datalink_last_status_avoidance_system = = telemetry_status_s : : MAV_STATE_CRITICAL ) {
mavlink_log_info ( & mavlink_log_pub , " Avoidance system timed out " ) ;
status_flags . avoidance_system_valid = false ;
_status_changed = true ;
}
if ( _datalink_last_status_avoidance_system = = telemetry_status_s : : MAV_STATE_FLIGHT_TERMINATION ) {
mavlink_log_critical ( & mavlink_log_pub , " Avoidance system rejected " ) ;
status_flags . avoidance_system_valid = false ;
_status_changed = true ;
}
@ -3712,6 +3700,46 @@ void Commander::data_link_check()
@@ -3712,6 +3700,46 @@ void Commander::data_link_check()
}
}
void Commander : : avoidance_check ( )
{
for ( unsigned i = 0 ; i < ORB_MULTI_MAX_INSTANCES ; i + + ) {
if ( _sub_distance_sensor [ i ] . updated ( ) ) {
distance_sensor_s distance_sensor { } ;
_sub_distance_sensor [ i ] . copy ( & distance_sensor ) ;
if ( ( distance_sensor . orientation ! = distance_sensor_s : : ROTATION_DOWNWARD_FACING ) & &
( distance_sensor . orientation ! = distance_sensor_s : : ROTATION_UPWARD_FACING ) ) {
_valid_distance_sensor_time_us = distance_sensor . timestamp ;
}
}
}
const bool cp_enabled = _param_cp_dist . get ( ) > 0.f ;
const bool distance_sensor_valid = hrt_elapsed_time ( & _valid_distance_sensor_time_us ) < 500 _ms ;
const bool cp_healthy = status_flags . avoidance_system_valid | | distance_sensor_valid ;
const bool sensor_oa_present = cp_healthy | | status_flags . avoidance_system_required | | cp_enabled ;
const bool auto_mode = _internal_state . main_state = = commander_state_s : : MAIN_STATE_AUTO_MISSION
| | _internal_state . main_state = = commander_state_s : : MAIN_STATE_AUTO_LOITER
| | _internal_state . main_state = = commander_state_s : : MAIN_STATE_AUTO_RTL
| | _internal_state . main_state = = commander_state_s : : MAIN_STATE_OFFBOARD
| | _internal_state . main_state = = commander_state_s : : MAIN_STATE_AUTO_TAKEOFF
| | _internal_state . main_state = = commander_state_s : : MAIN_STATE_AUTO_LAND ;
const bool pos_ctl_mode = _internal_state . main_state = = commander_state_s : : MAIN_STATE_POSCTL ;
const bool sensor_oa_enabled = ( ( auto_mode & & status_flags . avoidance_system_required ) | | ( pos_ctl_mode
& & cp_enabled ) ) ? true : false ;
const bool sensor_oa_healthy = ( ( auto_mode & & status_flags . avoidance_system_valid ) | | ( pos_ctl_mode
& & cp_healthy ) ) ? true : false ;
set_health_flags ( subsystem_info_s : : SUBSYSTEM_TYPE_OBSTACLE_AVOIDANCE , sensor_oa_present , sensor_oa_enabled ,
sensor_oa_healthy , status ) ;
}
void Commander : : battery_status_check ( )
{
bool battery_sub_updated = false ;