Lua 脚本

ArduPilot 支持 Lua 脚本。脚本提供了一个安全的 "沙盒 "环境,可在不修改核心飞行代码的情况下为(飞行)控制器添加新行为。脚本存储在 SD 卡上,与飞行代码并行运行。

本页介绍了如何在(飞行)控制器上设置脚本、脚本 API、脚本小程序以及一些帮助入门的示例。

虽然编写脚本通常至少需要一些 LUA 编程和编辑,但也有一些 小程序 无需用户编辑即可使用。请参见以下链接。

备注

Lua 脚本支持已随 Copter-4.0、Rover-4.0 和 Plane-3.9.11 一起发布。

入门

  • 确保(飞行)控制器至少有 2 MB 闪存和 70 kB 内存。CubePilot Cube Orange 和 HolyBro Durandal 等高功率(飞行)控制器肯定能很好地工作,但请检查您的(飞行)控制器的规格。 (飞行)控制器.

  • 设置 SCR_ENABLE 为 1 以启用脚本(刷新或重启以查看所有 SCR_ 参数)。

  • 将脚本(扩展名为 .lua 的文件)上传到(飞行)控制器 SD 卡的 APM/ 脚本 文件夹。

    • 如果该文件夹不存在,可以通过设置 SCR_ENABLE 为 1 并重新启动。也可以在 SD 卡上手动创建该文件夹。

    • 如果使用Mission Planner地面站,则可使用 MAVFTP 完成此操作。

    • 如果使用模拟器,则 脚本 文件夹位于模拟器的启动目录中。在这种情况下,MAVFTP 也能正常工作。

    ./_images/scripting-MP-mavftp.png
  • 样本/示例脚本 可以找到 此处为稳定平面, 旋翼飞行器无人车UGV.最新的开发脚本如下所示 这里.

  • 小程序 这些脚本在使用前无需用户编辑,可在以下页面找到 这里 为 "最新 "固件分支,可能需要该分支中包含的扩展代码才能正常运行。每个扩展都有一个同名的 .md 文件,详细说明其功能、使用和设置。例如,有一个脚本允许用户从发射机通道更改具有 SmartAudio 功能的视频发射机的输出功率电平,并通过参数设置其开机值。请参见 脚本小程序.

  • 驾驶员 Lua 脚本实际上可以为 ArduPilot 固件不直接支持的新外围硬件(如新的 EFI 或云台)提供硬件驱动程序。可以找到这些例子 这里 为 "最新 "固件分支,可能需要该分支中包含的代码扩展才能正常运行。

备注

要从 github 下载,首先点击脚本名称,然后选择右上角的 "raw"(原始),再点击鼠标右键,将页面 "另存为 "扩展名为".lua "的文本文件。

  • 使用 "RCX_OPTION"="300-307 "选项,最多可将 8 个 RC 通道分配为脚本输入/控制,供脚本使用。此外,还提供四个专用脚本参数: SCR_USER1 通过 SCR_USER4 参数的访问方法与其他参数相同,但这些参数仅供脚本使用。脚本也可以生成自己的参数(参见 通过脚本访问/添加参数)将在脚本中使用。

  • (飞行)控制器开机后将加载并启动所有脚本。默认情况下,它将在 ROMFS 文件系统中查找制造商固件映像中包含的脚本,以及 SD 卡上的 APM/脚本目录(如果是 SITL 仿真,则是启动仿真的基本目录)。可以使用 scr_dir_disable 参数。

  • 信息和错误会发送到地面站,如果使用Mission Planner地面站,还可以在数据屏幕的 "信息 "选项卡中查看。

  • SCR_HEAP_SIZE 可以调整,以增加或减少脚本可用的内存量。默认内存从 43K 到 204.8K 不等,具体取决于所使用的 CPU。对于小型脚本来说,最小内存(43K)已经足够,但许多脚本需要更大的内存(一些小程序现在需要 300K)。(飞行)控制器的可用内存很大程度上取决于启用了哪些功能和外设。如果该参数设置过低,脚本可能无法运行,并出现内存不足的预启动错误。如果设置过高,地形跟踪甚至 EKF 等其他自动驾驶功能可能无法初始化。在使用 STM32F4 微控制器的(飞行)控制器上,智能 RTL(UGV无人车、旋翼飞行器)和地形跟踪(飞机、旋翼飞行器)几乎总是需要禁用。这些功能通常默认为启用,设置为 SRTL_POINTS = 0, TERRAIN_ENABLE = 0).另请参见 内存限制 节。

逐步设置和使用示例

脚本的作用

  • 可同时运行多个脚本

  • 监控载具状态

  • 开始操纵载具状态

Lua 是一种垃圾回收、命令式编程语言。脚本在系统中以低优先级运行,这样即使脚本处理时间较长,也能确保核心飞行代码继续执行。为了允许运行多个脚本,每个脚本都被分配了一个固定的时间块(以虚拟机指令为单位),预计在该时间块内完成处理。允许脚本指定一个新的回调函数和调用该函数的时间,这样脚本就可以连续运行。虽然这可以安全地约束最坏情况下的执行时间,但脚本并不能保证按可靠的时间表运行。

每个脚本都在自己的 "沙盒 "环境中运行。这样,每个脚本都可以操作自己想操作的全局变量,而不会给其他脚本带来问题,并允许脚本在调用回调时保持状态。不过,这样做的一个副作用是,脚本中大量内存的使用会导致其他脚本内存不足。

脚本样本

下面的脚本用于根据飞机与原点的距离改变伺服输出。

 1功能 更新 () -- 将被调用的定期函数
 2  当地 当前位置 = 小时:获取位置() -- 获取载具的当前位置
 3  当地 首页 = 小时:home()            -- 获取载具的原点位置
 4  如果 当前位置  首页             -- 检查载具位置和家庭位置是否可用
 5    当地 距离 = 当前位置:获取距离(首页) -- 以米为单位计算离家的距离
 6    如果 距离 >; 1000  -- 如果距离超过 1000 米
 7      距离 = 1000;      -- 将距离锁定为 1000 米
 8    最后
 9    伺服器.设置输出功率(96, 1000 + 距离) -- 将伺服分配功能 96(脚本 3)设置为比例值
10  最后
11
12  返回 更新, 1000 -- 请求从现在起 1000 毫秒(1 秒)后再次运行 "update"
13最后
14
15返回 更新, 1000   -- 要求在加载脚本 1000 毫秒(1 秒)后首次进行 "update" 更新

该脚本首先定义了更新函数,该函数将被定期调用。该函数将获取载具的当前位置和原点位置,并将其存储在本地变量 current_pos 和 home 中。现在,这两个变量要么保存 Location userdata(位置用户数据),要么为空(如果当前无法从载具获取信息)。然后,在计算位置之间的距离之前,会对变量进行检查,以确保它们确实已被提供。经过检查以确保测得的距离不会超过 1 公里后,该距离将用于设置伺服位置。函数的最后一行用于重新安排该函数的运行时间,使其在距当前时间 1000 毫秒后再次运行。脚本的最后一行也用于安排函数在加载后的 1000 毫秒内首次运行。

脚本崩溃和错误

如果脚本内存耗尽(或因任何原因出现慌乱),所有当前运行的脚本都会被终止。如果单个脚本出现错误,也会终止。如果这两种情况都发生在上膛之前,则会产生上膛前故障。要重新启动脚本或整个脚本,需要使用脚本重启命令或重新启动。

为了防止在脚本丢失(即 SD 卡弹出或文件损坏)或本应在上膛前运行一次然后终止的脚本没有运行的情况下上膛,可以启用两种校验和预上膛检查中的一种或两种:

  • scr_ld_checksum 会检查所有加载脚本的校验和是否与此值一致

  • scr_run_checksum 会检查所有运行脚本的校验和是否与此值一致

这些脚本可以在加载脚本后自动设置,并在上膛前运行所需的脚本。 SCR_DEBUG_OPTS 位 5,计算并设置这些参数的值,然后自动复位位 5。

脚本和参数

应用程序接口文档

这里描述的 API 文档并不是完整的列表,而是一些示例。对于 方法一览表 目前可用的 LUA 自动生成的文档文件是一份完整的清单,可在以下网址找到 这里 并列出所有可用绑定及其参数。

备注

如果您使用 VScode 作为编辑器,可通过安装 通过使用 lua 扩展(目前只有 2.4.1 版本),你可以在编辑器中获得集成为建议和自动完成的信息。

有关绑定如何工作的完整信息,请参阅 绑定发生器说明 .

参见 绑定说明 方法语法 以获取更多有关如何解码此处显示的方法的信息。ArduPilot 使用 5.3.5 版 Lua。

地点

位置是一个用户数据对象,用于保存以纬度、经度和高度表示的位置。海拔高度可以有几种不同的格式:相对于原点的高度、平均海平面以上的绝对高度或相对于地形的高度。要创建一个新的位置用户数据,可以调用 Location() 分配一个空的位置对象,或者调用一个返回位置对象的方法。

位置用户数据对象支持以下调用:

  • lat( [new_lat] ) - 如果调用时没有参数,则以整数形式返回当前纬度(度数 * 1e7)。如果调用时有一个参数,则会为纬度赋值。

  • lng( [new_lng] ) - 如果调用时没有参数,则以整数形式返回当前经度(度数 * 1e7)。如果调用时有一个参数,则会为经度赋值。

  • 另选 [new_alt] ) - 如果调用时没有参数,则以厘米为单位返回当前高度的整数。如果调用时有一个参数,它将为高度赋值。

  • relative_alt( [是相关的] ) - 如果调用时没有参数,则在计划位置为相对于原点时返回 true。如果调用布尔值,则会设置相对高度。

  • terrain_alt( [地形] ) - 如果调用时没有参数,则如果位置规划为相对于地形,则返回 true。如果使用布尔值调用,则会标记高度是否应与地形相对。

  • origin_alt( [原产地] ) - 如果调用时没有参数,则如果位置是以相对于平均海平面的绝对高度规划的,则返回 true。如果调用布尔值,则会将高度设置为相对于平均海平面的高度。

  • loiter_xtrack( [should_xtrack] ) - 如果该位置用于停机位置,则标明飞机应从停机中心点还是从停机出口位置开始跟踪。

  • get_distance( 其他位置 ) - 给定一个位置,计算两个位置之间的水平距离(以米为单位)。

  • 偏移( 偏北 ,  偏东 ) - 将该位置平移指定的米数。

  • get_vector_from_origin_NEU() - 返回 nil 或包含从 EKF 原点到此位置的偏移量的 Vector3f。如果调用时 EKF 原点不可用,则返回 nil。

  • get_bearing( 其他位置 ) - 给定一个位置,以弧度为单位计算该位置的相对方位

  • get_distance_NED( 其他位置 ) - 返回 nil 或 Vector3f,其中包含以米为单位的三维向量。

  • get_distance_NE( 其他位置 ) - 返回 nil 或 Vector2f,其中包含到另一个位置的 2D 向量(以米为单位)。

向量2f

Vector2f 是一个用户数据对象,用于保存二维矢量。其分量以浮点数形式存储。要创建一个新的 Vector2f,可以调用 Vector2f() 分配一个新的向量,或者调用一个方法返回一个新的向量。

Vector2f 对象支持以下调用:

  • x( [new_x] ) - 如果调用时没有参数,则以浮点数形式返回当前设置的 X 分量。如果调用时有一个参数,则会为 X 分量赋值。

  • y( [new_y] ) - 如果调用时没有参数,将以浮点数形式返回当前设置的 Y 分量。如果调用时有一个参数,则会为 Y 分量赋值。

  • 长度() - 以浮点数形式返回向量的长度。

  • 正常化() - 将向量归一化为单位向量。

  • is_nan() - 如果向量包含任何 NaN 成员,则返回 true。

  • is_inf() - 如果向量包含任何无穷大成员,则返回 true。

  • is_zero() - 如果所有向量场都为 0,则返回 true。

Vector2f 支持以下操作符:

  • + - 将两个向量按分量相加。

  • - - 减去两个矢量的分量。

向量3f

Vector3f 是一个用户数据对象,用于保存三维矢量。其分量以浮点数形式存储。要创建一个新的 Vector3f,可以调用 Vector3f() 分配一个新的向量,或者调用一个方法返回一个新的向量。

Vector3f 对象支持以下调用:

  • x( [new_x] ) - 如果调用时没有参数,则以浮点数形式返回当前设置的 X 分量。如果调用时有一个参数,则会为 X 分量赋值。

  • y( [new_y] ) - 如果调用时没有参数,将以浮点数形式返回当前设置的 Y 分量。如果调用时有一个参数,则会为 Y 分量赋值。

  • z( [new_z] ) - 如果调用时没有参数,将以浮点数形式返回当前设置的 Z 分量。如果调用时有一个参数,则会为 Z 分量赋值。

  • 长度() - 以浮点数形式返回向量的长度。

  • 正常化() - 将向量归一化为单位向量。

  • is_nan() - 如果向量包含任何 NaN 成员,则返回 true。

  • is_inf() - 如果向量包含任何无穷大成员,则返回 true。

  • is_zero() - 如果所有向量场都为 0,则返回 true。

Vector3f 支持以下操作符:

  • + - 将两个向量按分量相加。

  • - - 减去两个矢量的分量。

AHRS (ahrs:)

ahrs 库代表(飞行)控制器计算的姿态方位参考系统。它提供载具姿态和位置的估计值。

  • get_roll() - 以弧度为单位返回当前的载具滚动角度。

  • get_pitch() - 以弧度为单位返回当前载具俯仰角。

  • get_yaw() - 以弧度为单位返回当前载具的偏航角度。

  • get_position() - 返回 nil 或包含载具当前位置的位置用户数据。注意:只有当系统认为当前估计位置合理时,才会返回位置信息。

  • get_home() - 返回包含载具当前原点的位置。

  • get_gyro() - 返回包含当前平滑和滤波陀螺仪速率(以弧度/秒为单位)的 Vector3f。

  • get_hagl() - 返回 "无 "或最新估计的离地面高度(以米为单位)。

  • wind_estimate() - 返回包含载具当前风速估计值的 Vector3f。

  • groundspeed_vector() - 返回一个 Vector2f 向量,其中包含载具的速度(以米/秒为单位,向北和向东分量)。

  • get_velocity_NED() - 返回 nil,或一个包含当前 NED 载具速度(米/秒)的 Vector3f(向北、向东和向下分量)。

  • get_velocity_NE() - 返回 nil 或一个 Vector2f,其中包含当前东北方向载具速度(米/秒)的北向和东向分量。

  • home_is_set() - 如果已设置原点位置,则返回 true。

  • prearm_healthy() - 如果当前的预设检查通过,则返回 true。

  • 空速估计( ) - 以米/秒或零为单位返回当前空速估计值。

上膛(上膛:)

上膛库提供对上膛状态和命令的访问。

  • 解除警报() - 在所有情况下解除载具上膛。只有在已经撤膛的情况下才会返回 false。

  • is_armed() -如果载具当前处于上膛状态,则返回 true。

  • arm() - 尝试上膛载具。如果成功则返回 true。

电池(电池:)

通过电池库可以访问载具上当前连接的电池信息。

  • num_instances() - 返回当前可用电池实例的数量。

  • 健康( 实例 ) - 如果请求的电池实例是健康的,则返回 true。健康表示 ArduPilot 目前能够监控电池。

  • 电压( 实例 ) - 返回所选电池实例的电压。

  • 电压恢复( 实例 ) - 如果没有负载,则返回估计的电池电压。

  • current_amps( 实例 ) - 返回电池当前消耗的电流(以安培为单位),如果无法进行电流监控,则为零。

  • 消耗的马赫( 实例 ) - 返回电池电量(以毫安小时为单位),如果无法进行电流监控,则为零。

  • 消耗量_wh( 实例 ) - 返回电池使用的瓦特小时数,如果没有能源监控功能,则为零。

  • 剩余容量百分比( 实例 ) - 返回电池剩余电量的百分比(从 0 到 100)

  • pack_capacity_mah( 实例 ) - 返回电池组的全部容量(以毫安小时为单位)。

  • has_failsafed() - 如果监控的任何电池触发了故障安全,则返回 true。

  • 检测到 实例 ) - 如果受监控的电池电量过大,则返回 true。

  • get_temperature( 实例 ) - 如果电池支持温度监控,则以摄氏度为单位返回电池的温度。

  • get_cycle_count( 实例 ) - 返回电池的循环次数,如果没有则为零。

全球定位系统 (gps:)

通过 GPS 库可以访问载具上 GPS 的相关信息。

  • num_sensors() - 返回已连接 GPS 设备的数量。如果开启了 GPS 混合功能,则会显示为第三个传感器,并在此处报告。

  • 主传感器() - 返回当前哪个 GPS 被用作主 GPS 设备。

  • status(instance) - 返回 GPS 定位状态。将其与 GPS 定位类型(GPS.NO_GPS、GPS.GPS_OK_FIX_2D、GPS.GPS_OK_FIX_3D、GPS.GPS_OK_FIX_3D_DGPS、GPS.GPS_OK_FIX_3D_RTK_FLOAT、GPS.GPS_OK_FIX_3D_RTK_FIXED)之一进行比较。

  • 位置( 实例 ) - 返回最后一次 GPS 定位的位置用户数据。您必须检查状态以了解位置是否仍然有效,如果状态为 NO_GPS 或 NO_FIX,则将返回旧数据。

  • 速度精度( 实例 ) - 如果 GPS 实例有相关信息,则返回 nil 或 GPS 的速度精度(单位:米/秒)。

  • 水平精度( 实例 ) - 如果 GPS 实例有可用信息,则返回 nil 或 GPS 的水平精度(以米为单位)。

  • 垂直精度( 实例 ) - 如果 GPS 实例有相关信息,则返回零或以米为单位的 GPS 垂直精度。

  • 速度( 实例 ) - 返回一个 Vector3f,其中包含 GPS 观测到的速度。您必须检查状态才能知道速度是否仍然有效。

  • 地面速度( 实例 ) - 返回载具的地面速度(米/秒)。您必须检查状态才能知道地面速度是否仍然有效。

  • 地道( 实例 ) - 以度数为单位返回载具的地面航线。您必须检查状态才能知道地面航线是否仍然有效。

  • 数_sats( 实例 ) - 返回 GPS 当前跟踪的卫星数量。

  • time_week( 实例 ) - 返回 GPS 周数。

  • time_week_ms( 实例 ) - 返回当前星期的毫秒数。

  • get_hdop( 实例 ) - 返回 GPS 实例精度的水平稀释值。

  • get_vdop( 实例 ) - 返回 GPS 实例精度的垂直稀释值。

  • last_fix_time_ms( 实例 ) - 以系统毫秒为单位返回最后一次修复的时间。

  • have_vertical_velocity( 实例 ) - 如果 GPS 实例可以报告垂直速度,则返回 true。

  • get_antenna_offset( 实例 ) - 返回一个 Vector3f,其中包含 GPS 在车身框架内的偏移量(以米为单位)。

  • first_unconfigured_gps() - 返回 nil 或第一个尚未完全配置的 GPS 的实例编号。如果所有 GPS 都已配置,则返回 255。

全球监控系统 (gcs:)

  • send_text( 严重性 ,  文本 ) - 将发送包含信息严重性级别的文本字符串。严重程度为 :

严重程度

类型

0

紧急情况

1

警报

2

关键

3

错误

4

警告

5

通知

6

信息

7

调试

  • set_message_interval( 串行通道 ,  消息类型 ,  费率 ) - 设置信息类型在 SERIAL(serial_channel)上的更新速率。例如,gcs:set_message_interval(0, 30, 500000) 将 ATTITUDE 信息流(30)的 SERIAL0 速率设置为 2.0 Hz(500,000 微秒)。

串行 LED 指示灯(serialLED:)

该库允许通过预留的脚本输出控制 WS8212B RGB LED 灯串,脚本输出由 SERVOx_FUNCTION = 94 至 109(脚本输出 1 至 16)选择。

  • set_num_LEDs( 输出编号 ,  LED 数量 ) - 设置伺服输出端字符串中的 LED 数量。output_number 是伺服输出端编号 1-16,字符串与具有 <number_of_LEDs>的字符串相连。

  • set_RGB( 输出编号 ,  LED 编号 ,  r , g , b ) - 将附加伺服输出编号(1-16)输出字符串上的 LED_编号(1-32)数据设置为 r、g、b 值(0-255)。

  • 发送() - 向 LED 灯串发送数据

通知 (notify:)

  • play_tune( 曲调 ) - 通过车上的蜂鸣器播放 MML 曲调。曲调以字符串形式提供。

在线 飞行稳定调整测试仪可在此处找到

载具(载具:)

  • set_mode(模式编号) - 尝试将载具(本例中为 Plane)模式更改为 mode_number。成功则返回 true,失败则返回 false。

  • get_mode() - 按 mode_number 返回当前载具模式。

每种载具类型的模式编号可以是 在这里找到

  • get_likely_flying() - 如果(飞行)控制器认为自己正在飞行,则返回 true。不保证准确。

  • get_flying_time_ms() - 以毫秒为单位返回(飞行)控制器认为开始飞行后的时间,如果当前没有飞行,则返回零。

  • start_takeoff(altitude) - 开始自动起飞到指定的高度(以米为单位)。如果不可用,则返回假值。

  • set_target_location(Location) - 使用位置对象设置目标位置。如果不成功,则返回 false。

  • get_target_location() - 返回当前目标位置的位置对象。如果不可用,则返回 false。

  • set_target_velocity_NED() - 使用 Vector3f 对象设置目标速度。如果不可用,则返回 false。

地形(地形)

地形库提供了根据地形数据库检查高度的功能。

  • enabled() - 如果启用了地形,则返回 true。

  • 状态() - 返回测距仪的当前状态。将其与地形状态(terrain.TerrainStatusDisabled、terrain.TerrainStatusUnhealthy、terrain.TerrainStatusOK)之一进行比较。

  • height_amsl( 地点 ) - 返回所提供的用户数据位置处平均海平面以上的高度(以米为单位),如果没有用户数据,则返回 nil。

  • 地形高差原点( 差异、 外推) - 找出原点地形高度与地形高度之间的差值

    当前位置的高度(米)。如果不可用,则返回 false。如果外推法为 true,将根据最后有效的地形数据返回。

  • height_above_terrain() - 返回载具当前距离地形的高度(以米为单位),如果没有,则返回 null。

继电器(继电器:)

继电器库可用于控制继电器输出。

  • on(relay_num) - 打开所请求的继电器。

  • off(relay_num) - 关闭所请求的继电器。

  • enabled(relay_num) - 如果请求的中继已启用,则返回 true。

  • 切换(继电器编号) - 打开或关闭所请求的继电器。

伺服通道 (SRV_Channels:)

  • find_channel(output_function) - 返回指定 output_function 的第一个伺服输出编号-1(见 SERVOx_FUNCTION 参数 ) 。如果没有指定参数,则为 False。

  • get_output_pwm(output_function) - 返回分配给 output_function 的第一个伺服输出 PWM 值(见 SERVOx_FUNCTION 参数 ) 。如果没有指定参数,则为 False。

  • set_output_pwm_chan_timeout(channel、 pwm、 超时) - 在以毫秒为单位的时间内将伺服通道设置为指定的 PWM。这将覆盖(飞行)控制器发出的任何指令,直到超时结束。

遥控通道 (rc:)

  • get_pwm() - 返回给定通道编号的 RC 输入 PWM 值。如果通道不可用,则返回 false。

串行/UART(串行:)

  • find_serial(instance) - 返回允许从脚本(带有 SERIALx_PROTOCOL = 28).对于 实例 = 0,首先返回 UART,其次返回 实例 = 1等等。如果没有找到这样的实例,则返回 .

    • UART:begin(baud) - 以给定波特率启动串行连接。

    • UART:read() - 从 UART 实例返回字节序列。

    • UART:write(number) - 将字节序列写入 UART 实例。

    • UART:available() - 返回当前可用字节的整数。

    • UART:set_flow_control(flow_control) - 为 UART 实例设置流量控制。

气压计

  • get_pressure() - 以帕斯卡为单位返回压力值。

  • get_temperature() - 以摄氏度为单位返回温度。

  • get_external_temperature() - 返回外部温度(摄氏度)。

电调遥测 (esc_telem:)

  • get_usage_seconds(channel) - 以秒为单位返回单个 ESC 的使用时间,如果不可用,则返回 false。

参数 (param:)

  • 获取(参数名) - 如果有参数,则返回参数值;如果找不到,则返回 nil。

  • 设置(参数名) - 通过名称设置参数(如果有)。如果找到参数,则返回 true。

  • set_and_save(参数名) 设置并保存参数(如果有)。如果找到参数,则返回 true。

转速 (RPM:)

  • get_rpm(instance) - 返回给定实例的 RPM,如果不可用,则返回 nil。

按钮 (button:)

  • get_button_state(button_number) - 如果可用,返回按钮状态。按钮以 1 为索引。

伺服输出

该方法独立存在,直接调用,如下图所示。

  • servo.set_output (function_number、 PWM) -将 function_number 类型的伺服输出设置为 PWM 值(通常介于 1000 和 2000 之间)。

实例

参见 代码示例文件夹

如何添加新绑定

为了让 Lua 脚本访问 ArduPilot 的更多功能,可以通过创建新绑定来扩展 API。具体过程如下:

  • 找到您想向 Lua 公开的方法或函数。例如,如果您想公开 AHRS 的一个附加功能,您可以首先在 libraries/AP_AHRS/AP_AHRS.h.这可以是一个已经存在的方法(函数),也可以是一个新添加到代码中的方法(函数)。

  • 编辑 libraries/AP_Scripting/generator/description/bindings.desc 并在相应章节中为该方法添加一行新内容,如果要添加一个新类,则按照其他章节的示例添加一个新章节。

  • 将方法或函数添加到 libraries/AP_Scripting/docs/docs.lua.

  • 适用于 Copter/Rover/Plane 4.1 之前的版本:打开命令行提示符并 cd 到 /libraries/AP_Scripting/generator 目录,然后键入 "make run"。

  • 对于 4.1 及以后的版本,请清除发行版(./waf distclean),然后像往常一样重新启动编译。

在固件中直接包含 Lua 脚本

Lua 脚本可直接嵌入固件二进制文件,而不是放在外部 SD 卡中。这对于制造商为所含外设提供脚本或(飞行)控制器不支持 SD 卡时非常有用。相关说明请参见 此链接.

更多信息

有关在此之前所做技术决策的更多背景信息,您可以参考 2019 ArduPilot Unconference 的演示文稿。