跳转至

PARAM参数管理

定义参数

参数文件

参数定义文件是*_params.c为后缀的C文件,并需要#include "param.h

#include "param.h"

// 定义一个float型param
/**
 * Serial Configuration for MAVLink (instance 0)
 *
 * Configure on which serial port to run MAVLink.
 *
 *
 * @value 0 Disabled
 * @value 100 USB
 * @value 101 TELEM 1
 * @value 102 TELEM 2
 * @value 104 TELEM/SERIAL 4
 *
 * @group MAVLink
 * @reboot_required true
 */
PARAM_DEFINE_FALOT(name, default, flag)

# 定义一个INT32型param
PARAM_DEFINE_INT32(name, default, flag)

必要信息

飞控内部用于参数管理(查找、获取、设置、计算等)所必须的信息包括变量名、类型、取值和标志。

  • name:必须,变量名,最大长度16个字符,不要双引号,宏展开会自动添加双引号
  • type:必须,类型,支持UIN8/INT8/UINT16/INT16/UINT32/INT32/FLOAT
  • default:必须,默认值
  • flag:必须,标志位,bit0表示不允许用户修改,bit1表示修改需要重启,bit2表示解锁后不允许修改

通过PARAM_DEFINE_**(name, default, flag);宏来定义一个参数,其语法格式为:

# 定义一个float型param
PARAM_DEFINE_FALOT(name, default, flag);

# 定义一个INT32型param
PARAM_DEFINE_INT32(name, default, flag);

可选信息

可选信息主要是用于地面站参数显示、设置等

  • group
  • category
  • shortDesc
  • longDesc
  • board
  • boolean
  • @value value description,可选,允许值
// 表示允许取值0,1,2,3
@value 0 Disabled
@value 1 Joystick
@value 2 S.BUS
@value 3 DSM
  • @bit,可选
  • @min,可选,最小值
  • @max,可选,最大值
  • @increment,可选,修改步长
  • @decimal
  • @unit,可选,单位,允许以下取值:
'%', 'Hz', '1/s', 'mAh',
'rad', '%/rad', 'rad/s', 'rad/s^2', '%/rad/s', 'rad s^2/m', 'rad s/m',
'bit/s', 'B/s',
'deg', 'deg*1e7', 'deg/s',
'celcius', 'gauss', 'gauss/s', 'gauss^2',
'hPa', 'kg', 'kg/m^2', 'kg m^2',
'mm', 'm', 'm/s', 'm^2', 'm/s^2', 'm/s^3', 'm/s^2/sqrt(Hz)', 'm/s/rad',
'Ohm', 'V',
'us', 'ms', 's',
'S', 'A/%', '(m/s^2)^2', 'm/m',  'tan(rad)^2', '(m/s)^2', 'm/rad',
'm/s^3/sqrt(Hz)', 'm/s/sqrt(Hz)', 's/(1000*PWM)', '%m/s', 'min', 'us/C',
'N/(m/s)', 'Nm/rad', 'Nm/(rad/s)', 'Nm', 'N',
'normalized_thrust/s', 'normalized_thrust', 'norm', 'SD', ''
  • @reboot_required true/false,可选,修改是否需要重启飞控
  • volatile,可选,不允许用户修改

使用参数

查找参数

uint16_t param_find(const char* name)

获取参数

void param_get(uint16_t handle, void* value)

设置参数

void param_set(uint16_t handle, void* value)

基本原理

参数定义

#define PARAM_DEFINE_INT32(_name, _value, _flag) \
    __attribute__(used)                          \   // 防止被优化
    __attribute__(section("NextpilotParamTab"))  \   // 指定section
    param_info_t __param_info_##_name = {        \
        .name           = #_name,                \   // 变量名,全局唯一
        .type           = PARAM_TYPE_INT32,      \   // 类型
        .default_value  = {.i32 = _value},       \   // 默认值
        .airframe_value = {.i32 = _value},       \   // 机架取值
        .current_value  = {.i32 = _value},       \   // 当前值
        .flag           = _flag,                 \   // 标志位
        .status         = 0,                     \   // 状态位
    }

参数存储

机架参数

由于NextPilot支持多机架切换,但是不同机架之间有些参数是不一致的,因此切换机架的时候需要将参数重置为当前机架的默认值。