diff --git a/libraries/AP_Scripting/examples/set-target-location.lua b/libraries/AP_Scripting/examples/set-target-location.lua new file mode 100644 index 0000000000..701a9f036e --- /dev/null +++ b/libraries/AP_Scripting/examples/set-target-location.lua @@ -0,0 +1,53 @@ +-- performs the equivalent of a simple RTL in Guided mode using set_target_location +-- +-- CAUTION: This script only works for Copter +-- this script checks for RC input > 1800 and then: +-- a) switches to Guided mode +-- b) sets the target location to be 10m above home +-- c) switches the vehicle to land once it is within a couple of meters of home + +local wp_radius = 2 +local target_alt_above_home = 10 +local copter_guided_mode_num = 4 +local copter_land_mode_num = 9 +local sent_target = false + +-- the main update function that is used to decide when we should do a failsafe +function update() + if not arming:is_armed() then -- reset state when disarmed + sent_target = false + else + pwm7 = rc:get_pwm(7) + if pwm7 and pwm7 > 1800 then -- check if RC input 7 has moved high + local mode = vehicle:get_mode() -- get current mode + if not sent_target then -- if we haven't sent the target yet + if not (mode == copter_guided_mode_num) then -- change to guided mode + vehicle:set_mode(copter_guided_mode_num) + else + local above_home = ahrs:get_home() -- get home location + if above_home then + above_home:alt(above_home:alt() + (target_alt_above_home * 100)) + sent_target = vehicle:set_target_location(above_home) -- set target above home + end + end + else + + -- change to land mode when within 2m of home + if not (mode == copter_land_mode_num) then + local home = ahrs:get_home() + local curr_loc = ahrs:get_position() + if home and curr_loc then + local home_dist = curr_loc:get_distance(home) -- get horizontal distance to home + if (home_dist < wp_radius) then -- change to land mode if close + vehicle:set_mode(copter_land_mode_num) + end + end + end + end + end + end + + return update, 1000 +end + +return update()