|
|
|
@ -169,11 +169,11 @@ uint8_t Copter::avoid_area_detect(float dist)
@@ -169,11 +169,11 @@ uint8_t Copter::avoid_area_detect(float dist)
|
|
|
|
|
{ |
|
|
|
|
Proxy_Area area; |
|
|
|
|
if(dist < avoid.get_zr_avd_min()){ |
|
|
|
|
|
|
|
|
|
if(area != PROXY_TOO_CLOSE) // 前一个状态不是障碍物过近
|
|
|
|
|
if(area != PROXY_TOO_CLOSE && area != PROXY_FIND_BARRIER){ // 前一个状态不是障碍物过近
|
|
|
|
|
area = PROXY_OUTRANGE; |
|
|
|
|
area = PROXY_OUTRANGE; |
|
|
|
|
|
|
|
|
|
}else{ |
|
|
|
|
area = PROXY_TOO_CLOSE; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
else if(dist< avoid.get_zr_avd_trig()) |
|
|
|
|
area = PROXY_TOO_CLOSE; |
|
|
|
@ -208,17 +208,16 @@ void Copter::avoid_action(uint8_t area,uint8_t state,float dist)
@@ -208,17 +208,16 @@ void Copter::avoid_action(uint8_t area,uint8_t state,float dist)
|
|
|
|
|
{ |
|
|
|
|
static uint8_t delay_cnt; |
|
|
|
|
static Proxy_Action action; |
|
|
|
|
static const float get_org_max_speed = wp_nav->get_default_speed_xy(); |
|
|
|
|
static float avoid_slow_speed = 100.0f; |
|
|
|
|
|
|
|
|
|
Vector3f pos_neu_cm; |
|
|
|
|
static int32_t max_climb_alt = 0; |
|
|
|
|
|
|
|
|
|
int32_t turn_yaw; |
|
|
|
|
|
|
|
|
|
static uint32_t ctl_wait_time = AP_HAL::millis(); |
|
|
|
|
switch (action) |
|
|
|
|
{ |
|
|
|
|
case PROXY_WAIT: |
|
|
|
|
if(control_mode == Mode::Number::LAND ){ // 降落模式不触发避障
|
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
if(area == PROXY_FIND_BARRIER && state == PROXY_APPROACH) |
|
|
|
|
action = PROXY_SLOW_DOWN; |
|
|
|
|
if(area == PROXY_TOO_CLOSE) |
|
|
|
@ -226,13 +225,7 @@ void Copter::avoid_action(uint8_t area,uint8_t state,float dist)
@@ -226,13 +225,7 @@ void Copter::avoid_action(uint8_t area,uint8_t state,float dist)
|
|
|
|
|
break; |
|
|
|
|
case PROXY_SLOW_DOWN: |
|
|
|
|
if(state == PROXY_APPROACH){ |
|
|
|
|
|
|
|
|
|
avoid_slow_speed = (dist - avoid.get_zr_avd_trig())/(avoid.get_zr_avd_max() - avoid.get_zr_avd_trig())*loiter_nav->get_loiter_speed(); |
|
|
|
|
avoid_slow_speed = MAX(avoid_slow_speed,0); |
|
|
|
|
|
|
|
|
|
gcs().send_text(MAV_SEVERITY_INFO,"NOTICE: 发现障碍物,距离:%3.2fm,v:%.2f",dist,avoid_slow_speed); |
|
|
|
|
wp_nav->set_speed_xy(avoid_slow_speed); |
|
|
|
|
loiter_nav->set_loiter_speed(avoid_slow_speed); |
|
|
|
|
gcs().send_text(MAV_SEVERITY_INFO,"NOTICE: 发现障碍物,距离:%3.2fm",dist); |
|
|
|
|
// last_prx_diff = dist;
|
|
|
|
|
} |
|
|
|
|
if(area == PROXY_TOO_CLOSE) |
|
|
|
@ -285,6 +278,7 @@ void Copter::avoid_action(uint8_t area,uint8_t state,float dist)
@@ -285,6 +278,7 @@ void Copter::avoid_action(uint8_t area,uint8_t state,float dist)
|
|
|
|
|
// mode_guided.set_destination(pos_neu_cm, false, 0, false, 0, false);
|
|
|
|
|
if(current_loc.alt > max_climb_alt){ |
|
|
|
|
action = PROXY_NEED_CTL; |
|
|
|
|
ctl_wait_time = AP_HAL::millis(); |
|
|
|
|
gcs().send_text(MAV_SEVERITY_CRITICAL,"超出爬升高度限制:%d,请手动控制",current_loc.alt); |
|
|
|
|
|
|
|
|
|
} |
|
|
|
@ -315,17 +309,22 @@ void Copter::avoid_action(uint8_t area,uint8_t state,float dist)
@@ -315,17 +309,22 @@ void Copter::avoid_action(uint8_t area,uint8_t state,float dist)
|
|
|
|
|
}else{
|
|
|
|
|
gcs().send_text(MAV_SEVERITY_INFO,"NOTICE:开始返航"); |
|
|
|
|
set_mode(Mode::Number::RTL,ModeReason::AVOIDANCE); |
|
|
|
|
wp_nav->set_speed_xy(get_org_max_speed); |
|
|
|
|
loiter_nav->set_loiter_speed(get_org_max_speed); |
|
|
|
|
action = PROXY_WAIT; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
break; |
|
|
|
|
case PROXY_NEED_CTL: |
|
|
|
|
|
|
|
|
|
if(area == PROXY_OUTRANGE){ |
|
|
|
|
action = PROXY_WAIT; |
|
|
|
|
gcs().send_text(MAV_SEVERITY_INFO,"NOTICE:人为控制,已离开障碍"); |
|
|
|
|
{ |
|
|
|
|
uint32_t tnow = AP_HAL::millis(); |
|
|
|
|
if(area == PROXY_OUTRANGE){ |
|
|
|
|
action = PROXY_WAIT; |
|
|
|
|
gcs().send_text(MAV_SEVERITY_INFO,"NOTICE:人为控制,已离开障碍"); |
|
|
|
|
} |
|
|
|
|
if(tnow - ctl_wait_time > 30000){ |
|
|
|
|
action = PROXY_WAIT; |
|
|
|
|
gcs().send_text(MAV_SEVERITY_INFO,"NOTICE:等待超时,原地降落"); |
|
|
|
|
set_mode(Mode::Number::LAND,ModeReason::AVOIDANCE); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|