概述
ArduPilot引入了对Lua脚本的支持;
可以同时运行多个脚本;
Lua脚本存放在 SD card 中;
Copter-4.0 及以上版本才支持Lua脚本;
scripting API ?
scripting applets ?
飞控条件:2 MB of flash and 70 kB of memory ;
使能:Set SCR_ENABLE to 1,然后 reboot ;
将Lua脚本上传到 SD card's APM/scripts 文件夹中;If using Mission Planner, this can be done using MAVFTP;
Lua的作用?
Multiple scripts can be run at once
Monitor the vehicle state
Start to manipulate vehicle state
什么时候开始执行Lua脚本?
当自动驾驶仪通电时,它将加载并启动所有脚本。
并在以下目录中寻找脚本:
- 它将在ROMFS文件系统
- SD卡上的 APM/scripts
- 如果是SITL模拟,则是启动模拟的 base directory
这可以通过使用SCR_DIR_DISABLE参数进行修改。
其他相关参数
- 此外,还有四个专用的脚本参数可用:SCR_USER1到SCR_USER4 ,使用与任何其他参数相同的方法访问,但这些参数是为脚本使用而保留的。脚本还可以生成自己的参数(请参阅Accessing/Adding Parameters via Scripts),以便在脚本中使用。
- 可以调整SCR_HEAP_SIZE以增加或减少可用于脚本的内存量。默认值从43K到204.8K不等,具体取决于使用的cpu,对于小脚本来说,最小值(43K)就足够了,但许多小程序需要更多(一些小程序现在需要300K)。自动驾驶仪的空闲内存在很大程度上取决于启用了哪些功能和外围设备。如果此参数设置得太低,脚本可能无法运行,并出现内存不足的预启动错误。如果设置过高,其他自动驾驶功能,如地形跟随,甚至EKF可能无法初始化。在配备STM32F4微控制器的自动驾驶仪上,几乎总是需要禁用Smart RTL(漫游者、科普特)和Terrain Following(飞机、科普特(Copter))。这些功能通常在默认情况下启用,设置SRTL_PPOINTS=0,TERRAIN_ENABLE=0)
RCx_OPTION 配置成 Scriptingx的用法
通过遥控器通道控制脚本的执行;
例如,300即Scripting1,301即Scripting2:
cpp
-- example of getting RC input
local scripting_rc_1 = rc:find_channel_for_option(300)
local scripting_rc_2 = rc:find_channel_for_option(301)
local flip_flop = 0
function update()
pwm1 = rc:get_pwm(1)
pwm2 = rc:get_pwm(2)
pwm3 = rc:get_pwm(3)
pwm4 = rc:get_pwm(4)
gcs:send_text(0, "RCIN 1:" .. tostring(pwm1) .. " 2:" .. tostring(pwm2).. " 3:" .. tostring(pwm3).. " 4:" .. tostring(pwm4))
-- read normalized input from designated scripting RCx_OPTION
if scripting_rc_1 then
gcs:send_text(0, "Scripting in 1:" .. tostring(scripting_rc_1:norm_input()))
end
-- read switch input from second designated scripting RCx_OPTION
if scripting_rc_2 then
local sw_pos = scripting_rc_2:get_aux_switch_pos()
if sw_pos == 0 then
gcs:send_text(0, "Scripting switch is low")
elseif sw_pos == 1 then
gcs:send_text(0, "Scripting switch is middle")
else
gcs:send_text(0, "Scripting switch is high")
end
end
-- we can also call functions that are available to RC switches
-- 28 is Relay one
rc:run_aux_function(28, flip_flop)
if (flip_flop == 0) then
flip_flop = 2 -- switch high
else
flip_flop = 0 -- switch low
end
return update, 1000 -- reschedules the loop
end
return update()
除了文档外,更多要参考例程
例程:ardupilot\libraries\AP_Scripting\examples