轉載:新浪@WalkAnthtml
英文參考:http://dev.ardupilot.com/wiki/code-overview-adding-a-new-parameter/git
本節源自:http://liung.github.io/blog/apm/2014-09-02-APM-添加新的參數.htmlgithub
第一步:數組
Step #1:less
在文件Parameters.h參數類中的枚舉變量(enum)的合適位置,像下面代碼塊最後一行同樣添加你本身的新的參數。你須要注意下面這些事情:ui
enum {this
// Miscurl
//spa
k_param_log_bitmask = 20,code
k_param_log_last_filenumber, // *** Deprecated - remove
// with next eeprom number
// change
k_param_toy_yaw_rate, // THOR The memory
// location for the
// Yaw Rate 1 = fast,
// 2 = med, 3 = slow
k_param_crosstrack_min_distance, // deprecated - remove with next eeprom number change
k_param_rssi_pin,
k_param_throttle_accel_enabled, // deprecated - remove
k_param_wp_yaw_behavior,
k_param_acro_trainer,
k_param_pilot_velocity_z_max,
k_param_circle_rate,
k_param_sonar_gain,
k_param_ch8_option,
k_param_arming_check_enabled,
k_param_sprayer,
k_param_angle_max,
k_param_gps_hdop_good, // 35
k_param_my_new_parameter, // 36
第二步:
Step #2:
在枚舉變量後面的參數類中聲明上面枚舉變種提到的參數。可以使用的類型包括AP_Int8,AP_Int16,AP_Float,AP_Int32,AP_Vector3(目前還不支持unsigned integer無符號整型)。新的枚舉變量的名稱應該保持一致,只是去掉了前綴k_param_。
// 254,255: reserved
};
AP_Int16 format_version;
AP_Int8 software_type;
// Telemetry control
//
AP_Int16 sysid_this_mav;
AP_Int16 sysid_my_gcs;
AP_Int8 serial3_baud;
AP_Int8 telem_delay;
AP_Int16 rtl_altitude;
AP_Int8 sonar_enabled;
AP_Int8 sonar_type; // 0 = XL, 1 = LV,
// 2 = XLL (XL with 10m range)
// 3 = HRLV
AP_Float sonar_gain;
AP_Int8 battery_monitoring; // 0=disabled, 3=voltage only,
// 4=voltage and current
AP_Float volt_div_ratio;
AP_Float curr_amp_per_volt;
AP_Int16 pack_capacity; // Battery pack capacity less reserve
AP_Int8 failsafe_battery_enabled; // battery failsafe enabled
AP_Int8 failsafe_gps_enabled; // gps failsafe enabled
AP_Int8 failsafe_gcs; // ground station failsafe behavior
AP_Int16 gps_hdop_good; // GPS Hdop value below which represent a good position
AP_Int16 my_new_parameter; // my new parameter's description goes here
第三步:
Step #3:
在Parameters.pde文件中向var_info表中添加變量的聲明信息。
// @Param: MY_NEW_PARAMETER
// @DisplayName: My New Parameter
// @Description: A description of my new parameter goes here
// @Range: -32768 32767
// @User: Advanced
GSCALAR(my_new_parameter, "MY_NEW_PARAMETER", MY_NEW_PARAMETER_DEFAULT),
地面站(如Mission Planner)中將使用@Param ~ @User
的註釋信息向使用者說明用戶所設置的變量的範圍等。
第四步:
Step #4:
在config.h中添加你的新參數。
#ifndef MY_NEW_PARAMETER_DEFAULT
# define MY_NEW_PARAMETER_DEFAULT 100 // default value for my new parameter
#endif
向主執行代碼添加參數的工做就完成了!添加到主代碼中(並不是庫中)的參數就能夠經過諸如g.my_new_parameter這樣來使用。
一樣可使用下列步驟向庫中添加新的參數。以AP_Compass庫爲例:
第一步:
Step #1:
首先在庫代碼的.h頭文件添加新的變量(如Compass.h)。可以使用的類型包括AP_Int8,AP_Int16,AP_Float,AP_Int32,AP_Vector3f。而後添加你的參數的默認值(咱們將在Step #2中使用)。
#define MY_NEW_PARAM_DEFAULT 100
class Compass
{
public:
int16_t product_id; /// product id
int16_t mag_x; ///< magnetic field strength along the X axis
int16_t mag_y; ///< magnetic field strength along the Y axis
int16_t mag_z; ///< magnetic field strength along the Z axis
uint32_t last_update; ///< micros() time of last update
bool healthy; ///< true if last read OK
/// Constructor
///
Compass();
protected:
AP_Int8 _orientation;
AP_Vector3f _offset;
AP_Float _declination;
AP_Int8 _use_for_yaw; ///
AP_Int8 _auto_declination; ///
AP_Int16 _my_new_lib_parameter; /// description of my new parameter
};
第二步:
Step #2:
而後在.cpp文件(如Compass.cpp)中添加變量包含有@Param ~ @Increment的var_info表信息,以便容許GCS向用戶顯示來自地面站的關於該參數值的範圍設定。當添加新參數時應注意:
const AP_Param::GroupInfo Compass::var_info[] PROGMEM = {
// index 0 was used for the old orientation matrix
// @Param: OFS_X
// @DisplayName: Compass offsets on the X axis
// @Description: Offset to be added to the compass x-axis values to compensate for metal in the frame
// @Range: -400 400
// @Increment: 1
// @Param: ORIENT
// @DisplayName: Compass orientation
// @Description: The orientation of the compass relative to the autopilot board.
// @Values: 0:None,1:Yaw45,2:Yaw90,3:Yaw135,4:Yaw180,5:Yaw225,6:Yaw270,7:Yaw315,8:Roll180
AP_GROUPINFO("ORIENT", 8, Compass, _orientation, ROTATION_NONE),
// @Param: MY_NEW_P
// @DisplayName: My New Library Parameter
// @Description: The new library parameter description goes here
// @Range: -32768 32767
// @User: Advanced
AP_GROUPINFO("MY_NEW_P", 9, Compass, _my_new_lib_parameter, MY_NEW_PARAM_DEFAULT),
AP_GROUPEND
};
這樣,新添加的參數將以_my_new_lib_parameter包含在庫中。須要指明的是:protected保護類型的參數是不可以在類外被訪問的。若是咱們將其變爲public類型,那麼咱們就能夠在主代碼中使用compass._my_new_lib_parameter參數了。
第三步:
Step #3:
前面提到的是在已經存在的類(好比AP_Compass)中定義一個新的變量。若是你從新定義了一個新類,在這個新類中添加參數。添加參數的方法如第二步。不過你還有一個工做要作,就是將這個新類,添加到Parameters.pde文件的var_info 數組列表中去。下面加粗的代碼就是一個示例。
const AP_Param::Info var_info[] PROGMEM = {
// @Param: SYSID_SW_MREV
// @DisplayName: Eeprom format version number
// @Description: This value is incremented when changes are made to the eeprom format
// @User: Advanced
GSCALAR(format_version, "SYSID_SW_MREV", 0),
// @Group: COMPASS_
// @Path: ../libraries/AP_Compass/Compass.cpp
GOBJECT(compass, "COMPASS_", Compass),
// @Group: INS_
// @Path: ../libraries/AP_InertialSensor/AP_InertialSensor.cpp
GOBJECT(ins, "INS_", AP_InertialSensor),
AP_VAREND
};