ardupilot/libraries/AP_Scripting/examples/copter_deploy.lua

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

85 lines
2.8 KiB
Lua
Raw Permalink Normal View History

--[[
script to auto-deploy a vehicle on descent after reaching a specified altitude
uses raw pressure to not depend on either GPS or on home alt
--]]
local PARAM_TABLE_KEY = 72
local PARAM_TABLE_PREFIX = "DEPL_"
local MAV_SEVERITY = {EMERGENCY=0, ALERT=1, CRITICAL=2, ERROR=3, WARNING=4, NOTICE=5, INFO=6, DEBUG=7}
---@diagnostic disable: missing-parameter
---@diagnostic disable: param-type-mismatch
-- bind a parameter to a variable
function bind_param(name)
local p = Parameter()
assert(p:init(name), string.format('could not find %s parameter', name))
return p
end
-- add a parameter and bind it to a variable
function bind_add_param(name, idx, default_value)
assert(param:add_param(PARAM_TABLE_KEY, idx, name, default_value), string.format('could not add param %s', name))
return bind_param(PARAM_TABLE_PREFIX .. name)
end
assert(param:add_table(PARAM_TABLE_KEY, PARAM_TABLE_PREFIX, 10), 'could not add param table')
local end_pos = bind_add_param('OPEN_POS', 1, 1200)
local offset = bind_add_param('OPEN_OFFSET', 2, 400)
local deployment_alt = bind_add_param('ALT', 3, 1)
local DEPL_CLIMB_ALT = bind_add_param('CLIMB_ALT', 4, 2)
local base_pressure = nil
local SERVO_FUNCTION = 94
local reached_climb_alt = false
local deployed = false
local MODE_LAND = 9
function update_state()
local pressure = baro:get_pressure()
if not pressure then
return
end
if not base_pressure then
base_pressure = pressure
end
local altitude = baro:get_altitude_difference(base_pressure, pressure)
if not altitude then
return
end
gcs:send_named_float('DALT',altitude)
logger.write("DEPL",'BP,P,Alt','fff',
base_pressure, pressure, altitude)
if not reached_climb_alt then
local start_pos = end_pos:get() + offset:get()
SRV_Channels:set_output_pwm(SERVO_FUNCTION, start_pos)
if altitude > DEPL_CLIMB_ALT:get() then
reached_climb_alt = true
gcs:send_text(MAV_SEVERITY.ERROR, "DEPL: Reached climb alt")
end
return
end
if deployed then
return
end
if altitude > deployment_alt:get() then
return
end
deployed = true
gcs:send_text(MAV_SEVERITY.INFO, "DEPL: deploying")
vehicle:set_mode(MODE_LAND)
arming:arm_force()
if not vehicle:get_mode() == MODE_LAND or not arming:is_armed() then
gcs:send_text(MAV_SEVERITY.INFO, "DEPL: Arming failed")
return
end
--SRV_Channels:set_output_pwm(SERVO_FUNCTION, end_pos:get())
gcs:send_text(MAV_SEVERITY.INFO, "DEPL: Deployed successfully")
end
function update() -- this is the loop which periodically runs
update_state()
return update, 20 -- Reschedules the loop at 50Hz
end
gcs:send_text(MAV_SEVERITY.INFO, "DEPL: loaded")
return update() -- Run immediately before starting to reschedule