轉載:Pixhawk源碼筆記八:添加新的參數

轉載:新浪@WalkAnthtml

 

Pixhawk源碼筆記八:添加新的參數

第九部分 添加新的參數

        英文參考:http://dev.ardupilot.com/wiki/code-overview-adding-a-new-parameter/git

        本節源自:http://liung.github.io/blog/apm/2014-09-02-APM-添加新的參數.htmlgithub

1 在主執行代碼中添加參數

        第一步:數組

        Step #1less

        在文件Parameters.h參數類中的枚舉變量(enum)的合適位置,像下面代碼塊最後一行同樣添加你本身的新的參數。你須要注意下面這些事情:ui

  • 儘可能在執行相似功能的參數區域添加新的參數,或者最壞的情形下就是在「Misc(混合)」區域的末尾添加。
  • 確保你添加的參數區域中還能夠有編號添加新的參數。檢查是否能繼續添加參數的方法是:檢查參數的計數,確保你所要添加的參數的上一個元素編號要小於你的下一部分代碼的編號。好比,Misc部分的第一個參數起始於#20,。my_new_parameter是#36。若是下一部分參數開始於#36,那麼咱們就不能在這裏添加這個新參數。
  • 不要在一個代碼塊的中間添加新的參數,那樣容易形成現存參數對應的信息的改變。
  • 不要在參數旁邊用「棄用(deprecated)」或「移除(remove)」作註解,這是由於一些使用者將此註釋用做在eeprom上的舊的參數的默認註解,若是你添加的新參數也是這樣註解,那麼就讓人就會看起來很奇怪和疑惑。 

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這樣來使用。

2 向庫中添加參數

        一樣可使用下列步驟向庫中添加新的參數。以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向用戶顯示來自地面站的關於該參數值的範圍設定。當添加新參數時應注意:

  • 本身添加的代碼編號(下面的編號9)必定要比以前變量的大。
  • 參數的名稱(如MY_NEW_P)包括對象自動添加的前綴要少於16個字符。好比羅盤對象的前綴爲「COMPASS_」。

 

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

};

相關文章
相關標籤/搜索