Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Copter/AC_PosControl/Scripting: slung payload oscillation suppression #27783

Merged
merged 26 commits into from
Oct 4, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
744719e
AC_PosControl: support 3D pos, vel, accel offsets
lthall Aug 2, 2024
928f262
AC_PosControl: implement singleton
rmackay9 Sep 17, 2024
3777db5
AC_WPNav: support pos vel accel offsets
rmackay9 Aug 2, 2024
55efc86
AC_WPNav: get_closest_point_on_circle uses is_positive
lthall Oct 1, 2024
58242ed
AC_Circle: integrate pos vel accel offsets
rmackay9 Sep 2, 2024
e368560
AC_Circle: get-closest-point-on-circle returns dist
rmackay9 Sep 11, 2024
a45fa81
AC_Loiter: optimise get-posvelaccel-target usage
rmackay9 Sep 17, 2024
d3190e6
AC_Loiter: updates to offset handling
lthall Oct 3, 2024
d82cac8
Copter: minor comment fix to auto mode
rmackay9 Sep 11, 2024
e727476
Copter: auto integrates get-closest-point-on-edge dist
rmackay9 Sep 11, 2024
e59ba8e
Copter: support set_posvelaccel_offset in auto
rmackay9 Aug 2, 2024
f6b53ed
Copter: RTL path subtracts offsets
rmackay9 Oct 1, 2024
fd5fb9f
Copter: payload place uses desired alt instead of actual
rmackay9 Oct 2, 2024
05f90e4
Copter: PosHold supports offsets
lthall Oct 3, 2024
723697b
AP_Scripting: add set_posvelaccel_offset binding
rmackay9 Aug 3, 2024
5a85500
AP_Scripting: add copter-posoffset example script
rmackay9 Aug 3, 2024
66d8fd3
AP_Scripting: mavlink_msgs global-position-int and heartbeat
rmackay9 Jul 26, 2024
9714409
AP_Scripting: copter-slung-payload suppresses oscillation
rmackay9 Jul 26, 2024
31f4634
Sub: auto integrates get-closest-point-on-edge dist
rmackay9 Sep 11, 2024
4cdade4
Plane: updates for offset handling
lthall Sep 17, 2024
2307f72
Sub: updates for offset handling
lthall Sep 17, 2024
fa582b5
Blimp: integrate PSC logging update
lthall Sep 29, 2024
543b484
AC_PID: AC_P_2D comment fix
lthall Sep 19, 2024
3ff2fe9
AR_PosControl: integrate PSC logging update
lthall Sep 30, 2024
75a4943
Tools: add copter pos offset test
rmackay9 Sep 13, 2024
24fd0b1
Copter: zigzag uses desired xy instead of actual
rmackay9 Oct 3, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions ArduCopter/Copter.h
Original file line number Diff line number Diff line change
Expand Up @@ -266,9 +266,9 @@ class Copter : public AP_Vehicle {
// measured ground or ceiling level measured using the range finder.
void update_surface_offset();

// get/set target altitude (in cm) above ground
bool get_target_alt_cm(float &target_alt_cm) const;
void set_target_alt_cm(float target_alt_cm);
// target has already been set by terrain following so do not initalise again
// this should be called by flight modes when switching from terrain following to surface tracking (e.g. ZigZag)
void external_init();

// get target and actual distances (in m) for logging purposes
bool get_target_dist_for_logging(float &target_dist) const;
Expand Down
10 changes: 4 additions & 6 deletions ArduCopter/mode.h
Original file line number Diff line number Diff line change
Expand Up @@ -182,12 +182,6 @@ class Mode {
// altitude fence
float get_avoidance_adjusted_climbrate(float target_rate);

const Vector3f& get_vel_desired_cms() {
// note that position control isn't used in every mode, so
// this may return bogus data:
return pos_control->get_vel_desired_cms();
}

// send output to the motors, can be overridden by subclasses
virtual void output_to_motors();

Expand Down Expand Up @@ -651,6 +645,10 @@ class ModeAuto : public Mode {

bool shift_alt_to_current_alt(Location& target_loc) const;

// subtract position controller offsets from target location
// should be used when the location will be used as a target for the position controller
void subtract_pos_offsets(Location& target_loc) const;

void do_takeoff(const AP_Mission::Mission_Command& cmd);
void do_nav_wp(const AP_Mission::Mission_Command& cmd);
bool set_next_wp(const AP_Mission::Mission_Command& current_cmd, const Location &default_loc);
Expand Down
83 changes: 49 additions & 34 deletions ArduCopter/mode_auto.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -498,7 +498,7 @@ void ModeAuto::land_start()
set_submode(SubMode::LAND);
}

// auto_circle_movetoedge_start - initialise waypoint controller to move to edge of a circle with it's center at the specified location
// circle_movetoedge_start - initialise waypoint controller to move to edge of a circle with it's center at the specified location
// we assume the caller has performed all required GPS_ok checks
void ModeAuto::circle_movetoedge_start(const Location &circle_center, float radius_m, bool ccw_turn)
{
Expand All @@ -517,8 +517,8 @@ void ModeAuto::circle_movetoedge_start(const Location &circle_center, float radi

// check our distance from edge of circle
Vector3f circle_edge_neu;
copter.circle_nav->get_closest_point_on_circle(circle_edge_neu);
float dist_to_edge = (inertial_nav.get_position_neu_cm() - circle_edge_neu).length();
float dist_to_edge;
copter.circle_nav->get_closest_point_on_circle(circle_edge_neu, dist_to_edge);

// if more than 3m then fly to edge
if (dist_to_edge > 300.0f) {
Expand Down Expand Up @@ -1251,7 +1251,6 @@ void PayloadPlace::run()

auto &g2 = copter.g2;
const auto &g = copter.g;
auto &inertial_nav = copter.inertial_nav;
auto *attitude_control = copter.attitude_control;
const auto &pos_control = copter.pos_control;
const auto &wp_nav = copter.wp_nav;
Expand Down Expand Up @@ -1293,7 +1292,7 @@ void PayloadPlace::run()
case State::Descent_Start:
gcs().send_text(MAV_SEVERITY_INFO, "%s Abort: Gripper Open", prefix_str);
// Descent_Start has not run so we must also initalise descent_start_altitude_cm
descent_start_altitude_cm = inertial_nav.get_position_z_up_cm();
descent_start_altitude_cm = pos_control->get_pos_desired_z_cm();
state = State::Done;
break;
case State::Descent:
Expand All @@ -1320,7 +1319,7 @@ void PayloadPlace::run()

case State::Descent_Start:
descent_established_time_ms = now_ms;
descent_start_altitude_cm = inertial_nav.get_position_z_up_cm();
descent_start_altitude_cm = pos_control->get_pos_desired_z_cm();
// limiting the decent rate to the limit set in wp_nav is not necessary but done for safety
descent_speed_cms = MIN((is_positive(g2.pldp_descent_speed_ms)) ? g2.pldp_descent_speed_ms * 100.0 : abs(g.land_speed), wp_nav->get_default_speed_down());
descent_thrust_level = 1.0;
Expand All @@ -1330,7 +1329,7 @@ void PayloadPlace::run()
case State::Descent:
// check maximum decent distance
if (!is_zero(descent_max_cm) &&
descent_start_altitude_cm - inertial_nav.get_position_z_up_cm() > descent_max_cm) {
descent_start_altitude_cm - pos_control->get_pos_desired_z_cm() > descent_max_cm) {
state = State::Ascent_Start;
gcs().send_text(MAV_SEVERITY_WARNING, "%s Reached maximum descent", prefix_str);
break;
Expand Down Expand Up @@ -1419,7 +1418,7 @@ void PayloadPlace::run()
// vel_threshold_fraction * max velocity
const float vel_threshold_fraction = 0.1;
const float stop_distance = 0.5 * sq(vel_threshold_fraction * copter.pos_control->get_max_speed_up_cms()) / copter.pos_control->get_max_accel_z_cmss();
bool reached_altitude = copter.pos_control->get_pos_target_z_cm() >= descent_start_altitude_cm - stop_distance;
bool reached_altitude = pos_control->get_pos_desired_z_cm() >= descent_start_altitude_cm - stop_distance;
if (reached_altitude) {
state = State::Done;
}
Expand Down Expand Up @@ -1472,6 +1471,8 @@ bool ModeAuto::shift_alt_to_current_alt(Location& target_loc) const
(wp_nav->get_terrain_source() == AC_WPNav::TerrainSource::TERRAIN_FROM_RANGEFINDER)) {
int32_t curr_rngfnd_alt_cm;
if (copter.get_rangefinder_height_interpolated_cm(curr_rngfnd_alt_cm)) {
// subtract position offset (if any)
curr_rngfnd_alt_cm -= pos_control->get_pos_offset_z_cm();
// wp_nav is using rangefinder so use current rangefinder alt
target_loc.set_alt_cm(MAX(curr_rngfnd_alt_cm, 200), Location::AltFrame::ABOVE_TERRAIN);
return true;
Expand All @@ -1486,11 +1487,21 @@ bool ModeAuto::shift_alt_to_current_alt(Location& target_loc) const
return false;
}

// set target_loc's alt
target_loc.set_alt_cm(currloc.alt, currloc.get_alt_frame());
// set target_loc's alt minus position offset (if any)
target_loc.set_alt_cm(currloc.alt - pos_control->get_pos_offset_z_cm(), currloc.get_alt_frame());
return true;
}

// subtract position controller offsets from target location
// should be used when the location will be used as a target for the position controller
void ModeAuto::subtract_pos_offsets(Location& target_loc) const
{
// subtract position controller offsets from target location
const Vector3p& pos_ofs_neu_cm = pos_control->get_pos_offset_cm();
Vector3p pos_ofs_ned_m = Vector3p{pos_ofs_neu_cm.x * 0.01, pos_ofs_neu_cm.y * 0.01, -pos_ofs_neu_cm.z * 0.01};
target_loc.offset(-pos_ofs_ned_m);
}

/********************************************************************************/
// Nav (Must) commands
/********************************************************************************/
Expand Down Expand Up @@ -1531,6 +1542,10 @@ void ModeAuto::do_nav_wp(const AP_Mission::Mission_Command& cmd)
{
// calculate default location used when lat, lon or alt is zero
Location default_loc = copter.current_loc;

// subtract position offsets
subtract_pos_offsets(default_loc);

if (wp_nav->is_active() && wp_nav->reached_wp_destination()) {
if (!wp_nav->get_wp_destination_loc(default_loc)) {
// this should never happen
Expand Down Expand Up @@ -1651,33 +1666,23 @@ void ModeAuto::do_land(const AP_Mission::Mission_Command& cmd)
// note: caller should set yaw_mode
void ModeAuto::do_loiter_unlimited(const AP_Mission::Mission_Command& cmd)
{
// convert back to location
Location target_loc(cmd.content.location);
// calculate default location used when lat, lon or alt is zero
Location default_loc = copter.current_loc;

// use current location if not provided
if (target_loc.lat == 0 && target_loc.lng == 0) {
// To-Do: make this simpler
Vector3f temp_pos;
copter.wp_nav->get_wp_stopping_point_xy(temp_pos.xy());
const Location temp_loc(temp_pos, Location::AltFrame::ABOVE_ORIGIN);
target_loc.lat = temp_loc.lat;
target_loc.lng = temp_loc.lng;
}

// use current altitude if not provided
// To-Do: use z-axis stopping point instead of current alt
if (target_loc.alt == 0) {
// set to current altitude but in command's alt frame
int32_t curr_alt;
if (copter.current_loc.get_alt_cm(target_loc.get_alt_frame(),curr_alt)) {
target_loc.set_alt_cm(curr_alt, target_loc.get_alt_frame());
} else {
// default to current altitude as alt-above-home
target_loc.set_alt_cm(copter.current_loc.alt,
copter.current_loc.get_alt_frame());
// subtract position offsets
subtract_pos_offsets(default_loc);

// use previous waypoint destination as default if available
if (wp_nav->is_active() && wp_nav->reached_wp_destination()) {
if (!wp_nav->get_wp_destination_loc(default_loc)) {
// this should never happen
INTERNAL_ERROR(AP_InternalError::error_t::flow_of_control);
}
}

// get waypoint's location from command and send to wp_nav
rmackay9 marked this conversation as resolved.
Show resolved Hide resolved
const Location target_loc = loc_from_cmd(cmd, default_loc);

// start way point navigator and provide it the desired location
if (!wp_start(target_loc)) {
// failure to set next destination can only be because of missing terrain data
Expand All @@ -1689,7 +1694,13 @@ void ModeAuto::do_loiter_unlimited(const AP_Mission::Mission_Command& cmd)
// do_circle - initiate moving in a circle
void ModeAuto::do_circle(const AP_Mission::Mission_Command& cmd)
{
const Location circle_center = loc_from_cmd(cmd, copter.current_loc);
// calculate default location used when lat, lon or alt is zero
Location default_loc = copter.current_loc;

// subtract position offsets
subtract_pos_offsets(default_loc);

const Location circle_center = loc_from_cmd(cmd, default_loc);

// calculate radius
uint16_t circle_radius_m = HIGHBYTE(cmd.p1); // circle radius held in high byte of p1
Expand Down Expand Up @@ -1757,6 +1768,10 @@ void ModeAuto::do_spline_wp(const AP_Mission::Mission_Command& cmd)
{
// calculate default location used when lat, lon or alt is zero
Location default_loc = copter.current_loc;

// subtract position offsets
subtract_pos_offsets(default_loc);

if (wp_nav->is_active() && wp_nav->reached_wp_destination()) {
if (!wp_nav->get_wp_destination_loc(default_loc)) {
// this should never happen
Expand Down
20 changes: 8 additions & 12 deletions ArduCopter/mode_guided.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -383,10 +383,10 @@ bool ModeGuided::set_destination(const Vector3f& destination, bool use_yaw, floa
// convert origin to alt-above-terrain if necessary
if (!guided_pos_terrain_alt) {
// new destination is alt-above-terrain, previous destination was alt-above-ekf-origin
pos_control->set_pos_offset_z_cm(origin_terr_offset);
pos_control->init_pos_terrain_cm(origin_terr_offset);
}
} else {
pos_control->set_pos_offset_z_cm(0.0);
pos_control->init_pos_terrain_cm(0.0);
}

// set yaw state
Expand Down Expand Up @@ -496,10 +496,10 @@ bool ModeGuided::set_destination(const Location& dest_loc, bool use_yaw, float y
// convert origin to alt-above-terrain if necessary
if (!guided_pos_terrain_alt) {
// new destination is alt-above-terrain, previous destination was alt-above-ekf-origin
pos_control->set_pos_offset_z_cm(origin_terr_offset);
pos_control->init_pos_terrain_cm(origin_terr_offset);
}
} else {
pos_control->set_pos_offset_z_cm(0.0);
pos_control->init_pos_terrain_cm(0.0);
}

guided_pos_target_cm = pos_target_f.topostype();
Expand Down Expand Up @@ -825,8 +825,7 @@ void ModeGuided::velaccel_control_run()

if (!stabilizing_vel_xy() && !do_avoid) {
// set the current commanded xy vel to the desired vel
guided_vel_target_cms.x = pos_control->get_vel_desired_cms().x;
guided_vel_target_cms.y = pos_control->get_vel_desired_cms().y;
guided_vel_target_cms.xy() = pos_control->get_vel_desired_cms().xy();
}
pos_control->input_vel_accel_xy(guided_vel_target_cms.xy(), guided_accel_target_cmss.xy(), false);
if (!stabilizing_vel_xy() && !do_avoid) {
Expand Down Expand Up @@ -903,14 +902,11 @@ void ModeGuided::posvelaccel_control_run()
// send position and velocity targets to position controller
if (!stabilizing_vel_xy()) {
// set the current commanded xy pos to the target pos and xy vel to the desired vel
guided_pos_target_cm.x = pos_control->get_pos_target_cm().x;
guided_pos_target_cm.y = pos_control->get_pos_target_cm().y;
guided_vel_target_cms.x = pos_control->get_vel_desired_cms().x;
guided_vel_target_cms.y = pos_control->get_vel_desired_cms().y;
guided_pos_target_cm.xy() = pos_control->get_pos_desired_cm().xy();
guided_vel_target_cms.xy() = pos_control->get_vel_desired_cms().xy();
} else if (!stabilizing_pos_xy()) {
// set the current commanded xy pos to the target pos
guided_pos_target_cm.x = pos_control->get_pos_target_cm().x;
guided_pos_target_cm.y = pos_control->get_pos_target_cm().y;
guided_pos_target_cm.xy() = pos_control->get_pos_desired_cm().xy();
}
pos_control->input_pos_vel_accel_xy(guided_pos_target_cm.xy(), guided_vel_target_cms.xy(), guided_accel_target_cmss.xy(), false);
if (!stabilizing_vel_xy()) {
Expand Down
2 changes: 1 addition & 1 deletion ArduCopter/mode_poshold.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -377,7 +377,7 @@ void ModePosHold::run()
pitch_mode = RPMode::BRAKE_TO_LOITER;
brake.to_loiter_timer = POSHOLD_BRAKE_TO_LOITER_TIMER;
// init loiter controller
loiter_nav->init_target(inertial_nav.get_position_xy_cm());
loiter_nav->init_target(inertial_nav.get_position_xy_cm() - pos_control->get_pos_offset_cm().xy().tofloat());
// set delay to start of wind compensation estimate updates
wind_comp_start_timer = POSHOLD_WIND_COMP_START_TIMER;
}
Expand Down
9 changes: 7 additions & 2 deletions ArduCopter/mode_rtl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -405,8 +405,11 @@ void ModeRTL::compute_return_target()
rtl_path.return_target = ahrs.get_home();
#endif

// get position controller Z-axis offset in cm above EKF origin
int32_t pos_offset_z = pos_control->get_pos_offset_z_cm();

// curr_alt is current altitude above home or above terrain depending upon use_terrain
int32_t curr_alt = copter.current_loc.alt;
int32_t curr_alt = copter.current_loc.alt - pos_offset_z;

// determine altitude type of return journey (alt-above-home, alt-above-terrain using range finder or alt-above-terrain using terrain database)
ReturnTargetAltType alt_type = ReturnTargetAltType::RELATIVE;
Expand All @@ -430,6 +433,8 @@ void ModeRTL::compute_return_target()
// set curr_alt and return_target.alt from range finder
if (alt_type == ReturnTargetAltType::RANGEFINDER) {
if (copter.get_rangefinder_height_interpolated_cm(curr_alt)) {
// subtract position controller offset
curr_alt -= pos_offset_z;
// set return_target.alt
rtl_path.return_target.set_alt_cm(MAX(curr_alt + MAX(0, g.rtl_climb_min), MAX(g.rtl_altitude, RTL_ALT_MIN)), Location::AltFrame::ABOVE_TERRAIN);
} else {
Expand All @@ -448,7 +453,7 @@ void ModeRTL::compute_return_target()
int32_t curr_terr_alt;
if (copter.current_loc.get_alt_cm(Location::AltFrame::ABOVE_TERRAIN, curr_terr_alt) &&
rtl_path.return_target.change_alt_frame(Location::AltFrame::ABOVE_TERRAIN)) {
curr_alt = curr_terr_alt;
curr_alt = curr_terr_alt - pos_offset_z;
} else {
// fallback to relative alt and warn user
alt_type = ReturnTargetAltType::RELATIVE;
Expand Down
4 changes: 2 additions & 2 deletions ArduCopter/mode_throw.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,9 +72,9 @@ void ModeThrow::run()
// initialise the demanded height to 3m above the throw height
// we want to rapidly clear surrounding obstacles
if (g2.throw_type == ThrowType::Drop) {
pos_control->set_pos_target_z_cm(inertial_nav.get_position_z_up_cm() - 100);
pos_control->set_pos_desired_z_cm(inertial_nav.get_position_z_up_cm() - 100);
} else {
pos_control->set_pos_target_z_cm(inertial_nav.get_position_z_up_cm() + 300);
pos_control->set_pos_desired_z_cm(inertial_nav.get_position_z_up_cm() + 300);
}

// Set the auto_arm status to true to avoid a possible automatic disarm caused by selection of an auto mode with throttle at minimum
Expand Down
35 changes: 10 additions & 25 deletions ArduCopter/mode_zigzag.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ void ModeZigZag::run()
void ModeZigZag::save_or_move_to_destination(Destination ab_dest)
{
// get current position as an offset from EKF origin
const Vector2f curr_pos {inertial_nav.get_position_xy_cm()};
const Vector2f curr_pos = pos_control->get_pos_desired_cm().xy().tofloat();

// handle state machine changes
switch (stage) {
Expand Down Expand Up @@ -245,8 +245,8 @@ void ModeZigZag::return_to_manual_control(bool maintain_target)
const Vector3f& wp_dest = wp_nav->get_wp_destination();
loiter_nav->init_target(wp_dest.xy());
#if AP_RANGEFINDER_ENABLED
if (wp_nav->origin_and_destination_are_terrain_alt()) {
copter.surface_tracking.set_target_alt_cm(wp_dest.z);
if (copter.rangefinder_alt_ok() && wp_nav->rangefinder_used_and_healthy()) {
copter.surface_tracking.external_init();
}
#endif
} else {
Expand Down Expand Up @@ -431,7 +431,7 @@ bool ModeZigZag::calculate_next_dest(Destination ab_dest, bool use_wpnav_alt, Ve
}

// get distance from vehicle to start_pos
const Vector2f curr_pos2d {inertial_nav.get_position_xy_cm()};
const Vector2f curr_pos2d = pos_control->get_pos_desired_cm().xy().tofloat();
Vector2f veh_to_start_pos = curr_pos2d - start_pos;

// lengthen AB_diff so that it is at least as long as vehicle is from start point
Expand All @@ -455,16 +455,10 @@ bool ModeZigZag::calculate_next_dest(Destination ab_dest, bool use_wpnav_alt, Ve
terrain_alt = wp_nav->origin_and_destination_are_terrain_alt();
next_dest.z = wp_nav->get_wp_destination().z;
} else {
// if we have a downward facing range finder then use terrain altitude targets
terrain_alt = copter.rangefinder_alt_ok() && wp_nav->rangefinder_used_and_healthy();
if (terrain_alt) {
#if AP_RANGEFINDER_ENABLED
if (!copter.surface_tracking.get_target_alt_cm(next_dest.z)) {
next_dest.z = copter.rangefinder_state.alt_cm_filt.get();
}
#endif
} else {
next_dest.z = pos_control->is_active_z() ? pos_control->get_pos_target_z_cm() : inertial_nav.get_position_z_up_cm();
next_dest.z = pos_control->get_pos_desired_z_cm();
if (!terrain_alt) {
next_dest.z += pos_control->get_pos_terrain_cm();
}
}

Expand Down Expand Up @@ -505,21 +499,12 @@ bool ModeZigZag::calculate_side_dest(Vector3f& next_dest, bool& terrain_alt) con
float scalar = constrain_float(_side_dist, 0.1f, 100.0f) * 100 / safe_sqrt(AB_side.length_squared());

// get distance from vehicle to start_pos
const Vector2f curr_pos2d {inertial_nav.get_position_xy_cm()};
next_dest.x = curr_pos2d.x + (AB_side.x * scalar);
next_dest.y = curr_pos2d.y + (AB_side.y * scalar);
const Vector2f curr_pos2d = pos_control->get_pos_desired_cm().xy().tofloat();
next_dest.xy() = curr_pos2d + (AB_side * scalar);

// if we have a downward facing range finder then use terrain altitude targets
terrain_alt = copter.rangefinder_alt_ok() && wp_nav->rangefinder_used_and_healthy();
if (terrain_alt) {
#if AP_RANGEFINDER_ENABLED
if (!copter.surface_tracking.get_target_alt_cm(next_dest.z)) {
next_dest.z = copter.rangefinder_state.alt_cm_filt.get();
}
#endif
} else {
next_dest.z = pos_control->is_active_z() ? pos_control->get_pos_target_z_cm() : inertial_nav.get_position_z_up_cm();
}
next_dest.z = pos_control->get_pos_desired_z_cm();

return true;
}
Expand Down
Loading
Loading