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 也能正常工作。
小程序 这些脚本在使用前无需用户编辑,可在以下页面找到 这里 为 "最新 "固件分支,可能需要该分支中包含的扩展代码才能正常运行。每个扩展都有一个同名的 .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。
伺服输出¶
该方法独立存在,直接调用,如下图所示。
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 的演示文稿。