ardupilot/libraries/AP_Scripting/examples/rover-set-turn-rate.lua

59 lines
1.7 KiB
Lua

-- This scirpt uses Rover's turn rate controller to make the vehicle move in circles of fixed radius
-- Edit these variables
local rad_xy_m = 0.5 -- circle radius in xy plane in m
local target_speed_xy_mps = 0.5 -- target speed in m/s
local rc_channel_switch = 7 -- switch this channel to "high" to get the script working
local cw_turn = true -- change this to false for ccw circle instead of default cw
-- Fixed variables
local omega_radps = target_speed_xy_mps/rad_xy_m
local rover_guided_mode_num = 15
local direction = 1
if not cw_turn then
direction = -1
end
-- Script Start --
gcs:send_text(0,"Script started")
gcs:send_text(0,"Trajectory period: " .. tostring(2 * math.rad(180) / omega_radps))
local circle_active = false
local last_mode = 0
function update()
if not circle_active then
last_mode = vehicle:get_mode()
end
if arming:is_armed() and rc:get_pwm(rc_channel_switch) > 1700 and not circle_active then
-- set guided mode since rc switch is now high
vehicle:set_mode(rover_guided_mode_num)
circle_active = true
elseif arming:is_armed() and rc:get_pwm(rc_channel_switch) < 1200 and circle_active then
-- set back to last mode since rc switch is low
vehicle:set_mode(last_mode)
circle_active = false
end
if circle_active then
--target turn rate in degrees including direction
local target_turn_rate = math.deg(omega_radps * direction)
-- send guided message
if not vehicle:set_desired_turn_rate_and_speed(target_turn_rate, target_speed_xy_mps) then
gcs:send_text(0, "Failed to send target ")
end
end
return update, 100
end
return update()