|
|
|
@ -1187,6 +1187,9 @@ FixedwingPositionControl::control_auto_position(const hrt_abstime &now, const fl
@@ -1187,6 +1187,9 @@ FixedwingPositionControl::control_auto_position(const hrt_abstime &now, const fl
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
float target_airspeed = get_auto_airspeed_setpoint(now, pos_sp_curr.cruising_speed, ground_speed, dt); |
|
|
|
|
Vector2f curr_pos_local{_local_pos.x, _local_pos.y}; |
|
|
|
|
Vector2f curr_wp_local = _global_local_proj_ref.project(curr_wp(0), curr_wp(1)); |
|
|
|
|
Vector2f prev_wp_local = _global_local_proj_ref.project(prev_wp(0), prev_wp(1)); |
|
|
|
|
|
|
|
|
|
if (_param_fw_use_npfg.get()) { |
|
|
|
|
_npfg.setAirspeedNom(target_airspeed * _eas2tas); |
|
|
|
@ -1197,20 +1200,17 @@ FixedwingPositionControl::control_auto_position(const hrt_abstime &now, const fl
@@ -1197,20 +1200,17 @@ FixedwingPositionControl::control_auto_position(const hrt_abstime &now, const fl
|
|
|
|
|
matrix::Vector2f velocity_2d(pos_sp_curr.vx, pos_sp_curr.vy); |
|
|
|
|
float curvature = PX4_ISFINITE(_pos_sp_triplet.current.loiter_radius) ? 1 / _pos_sp_triplet.current.loiter_radius : |
|
|
|
|
0.0f; |
|
|
|
|
_npfg.navigatePathTangent(curr_pos, curr_wp, velocity_2d.normalized(), get_nav_speed_2d(ground_speed), _wind_vel, |
|
|
|
|
curvature); |
|
|
|
|
_npfg.navigatePathTangent(curr_pos_local, curr_wp_local, velocity_2d.normalized(), get_nav_speed_2d(ground_speed), |
|
|
|
|
_wind_vel, curvature); |
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
_npfg.navigateWaypoints(prev_wp, curr_wp, curr_pos, get_nav_speed_2d(ground_speed), _wind_vel); |
|
|
|
|
_npfg.navigateWaypoints(prev_wp_local, curr_wp_local, curr_pos_local, get_nav_speed_2d(ground_speed), _wind_vel); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
_att_sp.roll_body = _npfg.getRollSetpoint(); |
|
|
|
|
target_airspeed = _npfg.getAirspeedRef() / _eas2tas; |
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
Vector2f curr_pos_local{_local_pos.x, _local_pos.y}; |
|
|
|
|
Vector2f curr_wp_local = _global_local_proj_ref.project(curr_wp(0), curr_wp(1)); |
|
|
|
|
Vector2f prev_wp_local = _global_local_proj_ref.project(prev_wp(0), prev_wp(1)); |
|
|
|
|
_l1_control.navigate_waypoints(prev_wp_local, curr_wp_local, curr_pos_local, get_nav_speed_2d(ground_speed)); |
|
|
|
|
_att_sp.roll_body = _l1_control.get_roll_setpoint(); |
|
|
|
|
} |
|
|
|
@ -1372,16 +1372,18 @@ FixedwingPositionControl::control_auto_loiter(const hrt_abstime &now, const floa
@@ -1372,16 +1372,18 @@ FixedwingPositionControl::control_auto_loiter(const hrt_abstime &now, const floa
|
|
|
|
|
|
|
|
|
|
float target_airspeed = get_auto_airspeed_setpoint(now, airspeed_sp, ground_speed, dt); |
|
|
|
|
|
|
|
|
|
Vector2f curr_pos_local{_local_pos.x, _local_pos.y}; |
|
|
|
|
Vector2f curr_wp_local = _global_local_proj_ref.project(curr_wp(0), curr_wp(1)); |
|
|
|
|
|
|
|
|
|
if (_param_fw_use_npfg.get()) { |
|
|
|
|
_npfg.setAirspeedNom(target_airspeed * _eas2tas); |
|
|
|
|
_npfg.setAirspeedMax(_param_fw_airspd_max.get() * _eas2tas); |
|
|
|
|
_npfg.navigateLoiter(curr_wp, curr_pos, loiter_radius, loiter_direction, get_nav_speed_2d(ground_speed), _wind_vel); |
|
|
|
|
_npfg.navigateLoiter(curr_wp_local, curr_pos_local, loiter_radius, loiter_direction, get_nav_speed_2d(ground_speed), |
|
|
|
|
_wind_vel); |
|
|
|
|
_att_sp.roll_body = _npfg.getRollSetpoint(); |
|
|
|
|
target_airspeed = _npfg.getAirspeedRef() / _eas2tas; |
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
Vector2f curr_pos_local{_local_pos.x, _local_pos.y}; |
|
|
|
|
Vector2f curr_wp_local = _global_local_proj_ref.project(curr_wp(0), curr_wp(1)); |
|
|
|
|
_l1_control.navigate_loiter(curr_wp_local, curr_pos_local, loiter_radius, loiter_direction, |
|
|
|
|
get_nav_speed_2d(ground_speed)); |
|
|
|
|
_att_sp.roll_body = _l1_control.get_roll_setpoint(); |
|
|
|
@ -1478,18 +1480,19 @@ FixedwingPositionControl::control_auto_takeoff(const hrt_abstime &now, const flo
@@ -1478,18 +1480,19 @@ FixedwingPositionControl::control_auto_takeoff(const hrt_abstime &now, const flo
|
|
|
|
|
* Update navigation: _runway_takeoff returns the start WP according to mode and phase. |
|
|
|
|
* If we use the navigator heading or not is decided later. |
|
|
|
|
*/ |
|
|
|
|
Vector2f curr_pos_local{_local_pos.x, _local_pos.y}; |
|
|
|
|
Vector2f curr_wp_local = _global_local_proj_ref.project(curr_wp(0), curr_wp(1)); |
|
|
|
|
Vector2f prev_wp_local = _global_local_proj_ref.project(_runway_takeoff.getStartWP()(0), |
|
|
|
|
_runway_takeoff.getStartWP()(1)); |
|
|
|
|
|
|
|
|
|
if (_param_fw_use_npfg.get()) { |
|
|
|
|
_npfg.setAirspeedNom(target_airspeed * _eas2tas); |
|
|
|
|
_npfg.setAirspeedMax(_param_fw_airspd_max.get() * _eas2tas); |
|
|
|
|
_npfg.navigateWaypoints(_runway_takeoff.getStartWP(), curr_wp, curr_pos, ground_speed, _wind_vel); |
|
|
|
|
_npfg.navigateWaypoints(prev_wp_local, curr_wp_local, curr_pos_local, ground_speed, _wind_vel); |
|
|
|
|
_att_sp.roll_body = _runway_takeoff.getRoll(_npfg.getRollSetpoint()); |
|
|
|
|
target_airspeed = _npfg.getAirspeedRef() / _eas2tas; |
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
Vector2f curr_pos_local{_local_pos.x, _local_pos.y}; |
|
|
|
|
Vector2f curr_wp_local = _global_local_proj_ref.project(curr_wp(0), curr_wp(1)); |
|
|
|
|
Vector2f prev_wp_local = _global_local_proj_ref.project(_runway_takeoff.getStartWP()(0), |
|
|
|
|
_runway_takeoff.getStartWP()(1)); |
|
|
|
|
_l1_control.navigate_waypoints(prev_wp_local, curr_wp_local, curr_pos_local, ground_speed); |
|
|
|
|
_att_sp.roll_body = _runway_takeoff.getRoll(_l1_control.get_roll_setpoint()); |
|
|
|
|
} |
|
|
|
@ -1552,18 +1555,19 @@ FixedwingPositionControl::control_auto_takeoff(const hrt_abstime &now, const flo
@@ -1552,18 +1555,19 @@ FixedwingPositionControl::control_auto_takeoff(const hrt_abstime &now, const flo
|
|
|
|
|
float target_airspeed = get_auto_airspeed_setpoint(now, _param_fw_airspd_trim.get(), ground_speed, |
|
|
|
|
dt); |
|
|
|
|
|
|
|
|
|
Vector2f curr_pos_local{_local_pos.x, _local_pos.y}; |
|
|
|
|
Vector2f curr_wp_local = _global_local_proj_ref.project(curr_wp(0), curr_wp(1)); |
|
|
|
|
Vector2f prev_wp_local = _global_local_proj_ref.project(_runway_takeoff.getStartWP()(0), |
|
|
|
|
_runway_takeoff.getStartWP()(1)); |
|
|
|
|
|
|
|
|
|
if (_param_fw_use_npfg.get()) { |
|
|
|
|
_npfg.setAirspeedNom(target_airspeed * _eas2tas); |
|
|
|
|
_npfg.setAirspeedMax(_param_fw_airspd_max.get() * _eas2tas); |
|
|
|
|
_npfg.navigateWaypoints(prev_wp, curr_wp, curr_pos, ground_speed, _wind_vel); |
|
|
|
|
_npfg.navigateWaypoints(prev_wp_local, curr_wp_local, curr_pos_local, ground_speed, _wind_vel); |
|
|
|
|
_att_sp.roll_body = _npfg.getRollSetpoint(); |
|
|
|
|
target_airspeed = _npfg.getAirspeedRef() / _eas2tas; |
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
Vector2f curr_pos_local{_local_pos.x, _local_pos.y}; |
|
|
|
|
Vector2f curr_wp_local = _global_local_proj_ref.project(curr_wp(0), curr_wp(1)); |
|
|
|
|
Vector2f prev_wp_local = _global_local_proj_ref.project(_runway_takeoff.getStartWP()(0), |
|
|
|
|
_runway_takeoff.getStartWP()(1)); |
|
|
|
|
_l1_control.navigate_waypoints(prev_wp_local, curr_wp_local, curr_pos_local, ground_speed); |
|
|
|
|
_att_sp.roll_body = _l1_control.get_roll_setpoint(); |
|
|
|
|
} |
|
|
|
@ -1807,8 +1811,12 @@ FixedwingPositionControl::control_auto_landing(const hrt_abstime &now, const flo
@@ -1807,8 +1811,12 @@ FixedwingPositionControl::control_auto_landing(const hrt_abstime &now, const flo
|
|
|
|
|
_npfg.navigateHeading(_target_bearing, ground_speed, _wind_vel); |
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
Vector2f curr_pos_local{_local_pos.x, _local_pos.y}; |
|
|
|
|
Vector2f curr_wp_local = _global_local_proj_ref.project(curr_wp(0), curr_wp(1)); |
|
|
|
|
Vector2f prev_wp_local = _global_local_proj_ref.project(prev_wp(0), |
|
|
|
|
prev_wp(1)); |
|
|
|
|
// normal navigation
|
|
|
|
|
_npfg.navigateWaypoints(prev_wp, curr_wp, curr_pos, ground_speed, _wind_vel); |
|
|
|
|
_npfg.navigateWaypoints(prev_wp_local, curr_wp_local, curr_pos_local, ground_speed, _wind_vel); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
target_airspeed = _npfg.getAirspeedRef() / _eas2tas; |
|
|
|
@ -1927,7 +1935,12 @@ FixedwingPositionControl::control_auto_landing(const hrt_abstime &now, const flo
@@ -1927,7 +1935,12 @@ FixedwingPositionControl::control_auto_landing(const hrt_abstime &now, const flo
|
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
// normal navigation
|
|
|
|
|
_npfg.navigateWaypoints(prev_wp, curr_wp, curr_pos, ground_speed, _wind_vel); |
|
|
|
|
Vector2f curr_pos_local{_local_pos.x, _local_pos.y}; |
|
|
|
|
Vector2f curr_wp_local = _global_local_proj_ref.project(curr_wp(0), curr_wp(1)); |
|
|
|
|
Vector2f prev_wp_local = _global_local_proj_ref.project(prev_wp(0), |
|
|
|
|
prev_wp(1)); |
|
|
|
|
// normal navigation
|
|
|
|
|
_npfg.navigateWaypoints(prev_wp_local, curr_wp_local, curr_pos_local, ground_speed, _wind_vel); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
target_airspeed = _npfg.getAirspeedRef() / _eas2tas; |
|
|
|
@ -2099,19 +2112,20 @@ FixedwingPositionControl::control_manual_position(const hrt_abstime &now, const
@@ -2099,19 +2112,20 @@ FixedwingPositionControl::control_manual_position(const hrt_abstime &now, const
|
|
|
|
|
Vector2d prev_wp{_hdg_hold_prev_wp.lat, _hdg_hold_prev_wp.lon}; |
|
|
|
|
Vector2d curr_wp{_hdg_hold_curr_wp.lat, _hdg_hold_curr_wp.lon}; |
|
|
|
|
|
|
|
|
|
Vector2f curr_pos_local{_local_pos.x, _local_pos.y}; |
|
|
|
|
Vector2f curr_wp_local = _global_local_proj_ref.project(curr_wp(0), curr_wp(1)); |
|
|
|
|
Vector2f prev_wp_local = _global_local_proj_ref.project(prev_wp(0), |
|
|
|
|
prev_wp(1)); |
|
|
|
|
|
|
|
|
|
if (_param_fw_use_npfg.get()) { |
|
|
|
|
_npfg.setAirspeedNom(target_airspeed * _eas2tas); |
|
|
|
|
_npfg.setAirspeedMax(_param_fw_airspd_max.get() * _eas2tas); |
|
|
|
|
_npfg.navigateWaypoints(prev_wp, curr_wp, curr_pos, ground_speed, _wind_vel); |
|
|
|
|
_npfg.navigateWaypoints(prev_wp_local, curr_wp_local, curr_pos_local, ground_speed, _wind_vel); |
|
|
|
|
_att_sp.roll_body = _npfg.getRollSetpoint(); |
|
|
|
|
target_airspeed = _npfg.getAirspeedRef() / _eas2tas; |
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
/* populate l1 control setpoint */ |
|
|
|
|
Vector2f curr_pos_local{_local_pos.x, _local_pos.y}; |
|
|
|
|
Vector2f curr_wp_local = _global_local_proj_ref.project(curr_wp(0), curr_wp(1)); |
|
|
|
|
Vector2f prev_wp_local = _global_local_proj_ref.project(prev_wp(0), |
|
|
|
|
prev_wp(1)); |
|
|
|
|
_l1_control.navigate_waypoints(prev_wp_local, curr_wp_local, curr_pos_local, ground_speed); |
|
|
|
|
_att_sp.roll_body = _l1_control.get_roll_setpoint(); |
|
|
|
|
} |
|
|
|
|