ardupilot开发 --- Lua脚本篇

概述

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

相关推荐
干了这碗汤4 天前
被裁20240927 --- 嵌入式硬件开发 前篇
ardupilot
EmotionFlying18 天前
(11)(2.3.1) ESC遥测(一)
copter·ardupilot·电调和电机
EmotionFlying2 个月前
(11)(2.1.6) Hobbywing DroneCAN ESC(一)
copter·ardupilot·1024程序员节·电调和电机
EmotionFlying2 个月前
(11)(2.1.7) FETtec OneWire ESCs(一)
copter·ardupilot·电调和电机
EmotionFlying2 个月前
(11)(2.1.4) DroneCAN ESCs
外设硬件·copter·ardupilot
EmotionFlying3 个月前
(11)(2.1.3) KDE CAN ESCs(二)
外设硬件·copter·ardupilot
EmotionFlying3 个月前
(11)(2.1.2) DShot ESCs(四)
外设硬件·copter·ardupilot
EmotionFlying3 个月前
(11)(2.1.2) DShot ESCs(一)
外设硬件·copter·ardupilot
干了这碗汤4 个月前
ardupilot开发 --- C嘎嘎 篇
ardupilot
EmotionFlying4 个月前
(24)(24.2) Minim OSD快速安装指南(二)
外设硬件·copter·ardupilot