ardupilot/libraries/AP_Scripting/examples/6DoF_roll_pitch.lua

61 lines
1.9 KiB
Lua

-- A script for controlling the roll and pitch of 6DoF vehicles
-- The script sets the target roll and pitch to the current value when arming or when E-stop is removed
-- this allows the vehicle to be placed upside-down on the ground and to take off as normal
-- its is also possible to setup a switch with option 300 to use either 4 or 6DoF control
-- make sure the vehicle is capable of 6DoF control
assert(param:get('FRAME_CLASS') == 16, "script requires a 6DoF vehicle")
local e_stop = rc:find_channel_for_option(31)
local sw = rc:find_channel_for_option(300)
local motors_spinning = false
function update() -- this is the loop which periodically runs
-- motor state
local current_motors_spinning = false
if arming:is_armed() then
-- if armed then motors are spinning
current_motors_spinning = true
end
if e_stop then
-- if E-stop switch is setup
if e_stop:get_aux_switch_pos() == 2 then
-- E-stop on, motors stopped
current_motors_spinning = false
end
end
if not motors_spinning and current_motors_spinning then
-- Just armed or removed E-stop
-- set offsets to current attitude
local roll = math.deg(ahrs:get_roll())
local pitch = math.deg(ahrs:get_pitch())
attitude_control:set_offset_roll_pitch(roll,pitch)
gcs:send_text(0, string.format("Set Offsets Roll: %0.1f, Pitch: %0.1f",roll,pitch))
if sw then
if sw:get_aux_switch_pos() == 2 then
-- switch to 'normal' 4 DoF attitude control
gcs:send_text(0, "4 DoF attitude control")
attitude_control:set_lateral_enable(false)
attitude_control:set_forward_enable(false)
else
-- 6DoF attutude control
gcs:send_text(0, "6 DoF attitude control")
attitude_control:set_lateral_enable(true)
attitude_control:set_forward_enable(true)
end
end
end
motors_spinning = current_motors_spinning
return update, 100 -- 10hz
end
return update()