通过脚本访问/添加参数

LUA 脚本能够访问和更改固件设置的 ArduPilot 参数。

例如

当地 规范 = 调味料:获取('scr_enable';)

将获取 SCR_ENABLE 参数并将其赋值给变量 "parameter"(参数

不过,像上述代码那样通过名称搜索查找参数的速度很慢。您可以使用 "参数用户数据 "方法创建一个本地变量,这样就可以避免每次使用时都要进行名称搜索,速度也会快得多:

当地 SCR_ENABLE = 参数()      --创建 a 规范 反对
SCR_ENABLE:启动('scr_enable';)       --获取  物理 地点  参数 内存 地区 那么 没有 未来 名字 搜索  完成的
当地 规范 = SCR_ENABLE:获取()  --检索  参数 价值  分配  "参数";

当前参数访问/修改方法,使用名称搜索 param: methods:

  • get(name) -读取数值

  • set(name, value) - 设置值,但不存储在非易失性存储器中

  • set_and_save(name, value) - 设置值并保存在非易失性存储器中

  • set_default(name, value) - 更改默认值

对于参数对象,上述访问方法同样适用,但不需要名称参数,因为参数对象应该已经初始化,不需要进行缓慢的名称搜索:

  • init(name) -初始化参数对象

  • configured() -检查参数对象是否已初始化

添加参数

除了访问/修改固件创建的现有参数外,LUA 脚本还可以添加新参数,供任何 LUA 脚本使用。这些参数的行为与固件创建和使用的参数相同,可以读/写并保存到非易失性存储器中,并在重启和电源循环时持续存在。

不过,与固件参数不同的是,它们的行为略有不同。固件参数会在参数重置或将固件更改为不同载具类型时重置为默认值。而脚本创建的参数则不会。事实上,脚本创建的参数是不可见的,除非脚本在脚本中实际 "重新创建 "了这些参数。

下文将对此进行解释。 参数如何在 ArduPilot 中工作.只需说明的是,必须运行一个脚本,在每次启动时 "创建 "下面讨论的新参数,以便使用这些参数,并让地面控制站(如 Mission Planer)列出这些参数。

创建参数组

使用 "add_table "命令可在脚本中创建多达 63 个参数的参数组。

当地 参数表键 = 72
宣称(停止:添加表(参数表键, "AERO_";, 30), '无法添加参数表';)

这样就定义了一个唯一的表键(0 - 200)来标识内存中的参数存储区,这样不同的脚本就可以拥有不同的参数(如果需要的话)。下一条命令将为名称以 "AERO_"开头的参数创建一个 30 个插槽的表,如果由于某种原因(如内存空间不足或与试图添加具有相同键值表的其他脚本冲突)无法创建该表,则使用 LUA assert error 命令停止脚本的运行

接下来,可以添加单个参数。

宣称(停止:add_param(参数表键, 1,  'trick_id';, 0), '无法添加参数 1';)
宣称(停止:add_param(参数表键, 2,  'rpt_count';, 0), '无法添加参数 2';)

这将在该表中添加两个参数 AERO_TRICK_ID 和 AERO_RPT_COUNT,索引号分别为 1 和 2,初始值为 0。只要不与索引号重叠,其他同时运行的脚本也可以添加其他参数。这些脚本将使用具有相同前缀(上例中为 "AERO")和键的 "param:add_table "方法,然后使用上述 "param "add_param "方法添加参数。在两个同时运行的脚本中使用相同的键和前缀调用 "param:add_table "不会产生错误。

备注

如果有其他同时运行的脚本试图访问这些参数,由于每个脚本都在自己的线程中独立运行,因此一定要推迟它们的首次更新,直到添加参数的脚本有时间完成设置过程为止

现在可以像访问其他参数一样访问这些参数。

当地 TRICK_ID = 参数()
TRICK_ID:启动('AERO_TRICK_ID')
当地 窍门 = TRICK_ID:获取()

备注

所有脚本定义的参数都是 FLOAT 类型,即浮点数

参数如何在 ArduPilot 中工作

参数在固件中定义。每个参数都有一个名称、默认值和值类型(布尔、浮点、8 号整数等)。启动时,固件会为每个参数创建 RAM 变量,并用一个值对其进行初始化。如果用户从未更改过参数,则该值为默认值;如果更改过参数,则该值为(飞行)控制器 EEPROM 中存储的值。如果参数已被用户 "重置"(参见 参数重置则 EEPROM 中的更改存储为空,并使用所有默认值。

参数的字符串名称仅用于地面控制站和 LUA 脚本。在执行 C++ 代码时,将直接访问 RAM 中初始化参数变量的地址,而不是通过名称字符串。

LUA 创建参数的存在方式与固件创建参数相同。用户/脚本更改存储在非易失性存储器中。但只有在脚本启动后执行了 "param:add_table "和 "param:add_param "时,它们的名称才会存在,以供查询。这样,它们就会出现在 GCS 参数列表中,并可通过 LUA 脚本的名称进行访问。如果不这样做,这些数据仍将存在于非易失性内存中,但对所有意图和目的而言都是不可见和不存在的。

这也意味着,一个脚本创建的参数在被用户或脚本修改后,仍会保存在存储区内。如果删除该脚本,运行另一个具有不同参数的脚本,然后删除该脚本,再重新运行原来的脚本,这些已更改的参数将以其最后的值重新出现在 GCS 中,并可再次被脚本访问。将所有参数重置为默认值将清除这些更改,就像固件创建参数一样。

在 LUA 脚本中,您可以通过名称访问任何参数(由固件或 LUA 脚本创建)。但是,这样做速度很慢,因为 LUA 解释器每次都必须进行长字符串名称搜索。相反,使用 Parameter() 对象并对其进行初始化后,就可以获得指向该命名参数位置的地址指针,从而快速直接访问该参数。