添加_添加用户 - CSDN
精华内容
参与话题
  • 本节主要记录自己这套ardupilot多旋翼无人机的添加一个新的参数显示到地面站,并实现美国手与日本手切换的过程。欢迎批评指正!!! 一.ardupilot官网增加一个新的参数 1.官方链接 增加一个新的参数...

    目录

    摘要

    本节主要记录自己在ardupilot多旋翼无人机代码中添加一个新的参数,并显示到地面站上;同时实现美国手与日本手切换的过程。欢迎批评指正!!!



    一.ardupilot官网增加一个新的参数


    1.官方链接

    增加一个新的参数网址



    2.文档翻译


    参数既可以是主代码的一部分,也可以是库的一部分。



    1.增加一个参数到主代码


    第1步:在这个文件(Parameters.h)中找到参数类的枚举的备用间隙,并添加新参数(也就是找个没有被占用的枚举数据,添加自己的参数),如下面所示的红色。

    enum {
        // Misc
        //
        k_param_log_bitmask = 20,
        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_开头,当然这个代码已经比较古老了,可以看下怎么添加最新的,我也贴出自己添加的参数
    

    k_param_my_new_parameter, // 36


    官网上的文档太古老了,这里重新写个代码(直接使用254,最后一个枚举数)



    enum {
            // Layout version number, always key zero.
            //
            k_param_format_version = 0,
            k_param_software_type,
            k_param_ins_old,                        // *** Deprecated, remove with next eeprom number change
            k_param_ins,                            // libraries/AP_InertialSensor variables
            k_param_NavEKF2_old, // deprecated - remove
            k_param_NavEKF2,
            k_param_g2, // 2nd block of parameters
            k_param_NavEKF3,
    
            // simulation
            k_param_sitl = 10,
    
            // barometer object (needed for SITL)
            k_param_barometer,
    
            // scheduler object (for debugging)
            k_param_scheduler,
    
            // relay object
            k_param_relay,
    
            // (old) EPM object
            k_param_epm_unused,
    
            // BoardConfig object
            k_param_BoardConfig,
    
            // GPS object
            k_param_gps,
    
            // Parachute object
            k_param_parachute,
    
            // Landing gear object
            k_param_landinggear,    // 18
    
            // Input Management object
            k_param_input_manager,  // 19
    
            // Misc
            //
            k_param_log_bitmask_old = 20,           // Deprecated
            k_param_log_last_filenumber,            // *** Deprecated - remove
                                                    // with next eeprom number
                                                    // change
            k_param_toy_yaw_rate,                   // deprecated - remove
            k_param_crosstrack_min_distance,    // deprecated - remove with next eeprom number change
            k_param_rssi_pin,                   // unused, replaced by rssi_ library parameters
            k_param_throttle_accel_enabled,     // deprecated - remove
            k_param_wp_yaw_behavior,
            k_param_acro_trainer,
            k_param_pilot_speed_up,
            k_param_circle_rate,                // deprecated - remove
            k_param_rangefinder_gain,
            k_param_ch8_option,
            k_param_arming_check_old,       // deprecated - remove
            k_param_sprayer,
            k_param_angle_max,
            k_param_gps_hdop_good,
            k_param_battery,
            k_param_fs_batt_mah,
            k_param_angle_rate_max,         // remove
            k_param_rssi_range,             // unused, replaced by rssi_ library parameters
            k_param_rc_feel_rp,
            k_param_NavEKF,                 // deprecated - remove
            k_param_mission,                // mission library
            k_param_rc_13_old,
            k_param_rc_14_old,
            k_param_rally,
            k_param_poshold_brake_rate,
            k_param_poshold_brake_angle_max,
            k_param_pilot_accel_z,
            k_param_serial0_baud,           // deprecated - remove
            k_param_serial1_baud,           // deprecated - remove
            k_param_serial2_baud,           // deprecated - remove
            k_param_land_repositioning,
            k_param_rangefinder, // rangefinder object
            k_param_fs_ekf_thresh,
            k_param_terrain,
            k_param_acro_rp_expo,
            k_param_throttle_deadzone,
            k_param_optflow,
            k_param_dcmcheck_thresh,        // deprecated - remove
            k_param_log_bitmask,
            k_param_cli_enabled,
            k_param_throttle_filt,
            k_param_throttle_behavior,
            k_param_pilot_takeoff_alt, // 64
    
            // 65: AP_Limits Library
            k_param_limits = 65,            // deprecated - remove
            k_param_gpslock_limit,          // deprecated - remove
            k_param_geofence_limit,         // deprecated - remove
            k_param_altitude_limit,         // deprecated - remove
            k_param_fence,
            k_param_gps_glitch,             // deprecated
            k_param_baro_glitch,            // 71 - deprecated
    
            // AP_ADSB Library
            k_param_adsb,                   // 72
            k_param_notify,                 // 73
    
            // 74: precision landing object
            k_param_precland = 74,
    
            //
            // 75: Singlecopter, CoaxCopter
            //
            k_param_single_servo_1 = 75,    // remove
            k_param_single_servo_2,         // remove
            k_param_single_servo_3,         // remove
            k_param_single_servo_4,         // 78 - remove
    
            //
            // 80: Heli
            //
            k_param_heli_servo_1 = 80,  // remove
            k_param_heli_servo_2,       // remove
            k_param_heli_servo_3,       // remove
            k_param_heli_servo_4,       // remove
            k_param_heli_pitch_ff,      // remove
            k_param_heli_roll_ff,       // remove
            k_param_heli_yaw_ff,        // remove
            k_param_heli_stab_col_min,  // remove
            k_param_heli_stab_col_max,  // remove
            k_param_heli_servo_rsc,     // 89 = full! - remove
    
            //
            // 90: misc2
            //
            k_param_motors = 90,
            k_param_disarm_delay,
            k_param_fs_crash_check,
            k_param_throw_motor_start,
            k_param_terrain_follow,    // 94
            k_param_avoid,
            k_param_avoidance_adsb,
    
            // 97: RSSI
            k_param_rssi = 97,
    
            //
            // 100: Inertial Nav
            //
            k_param_inertial_nav = 100, // deprecated
            k_param_wp_nav,
            k_param_attitude_control,
            k_param_pos_control,
            k_param_circle_nav,     // 104
            k_param_loiter_nav,     // 105
    
            // 110: Telemetry control
            //
            k_param_gcs0 = 110,
            k_param_gcs1,
            k_param_sysid_this_mav,
            k_param_sysid_my_gcs,
            k_param_serial1_baud_old, // deprecated
            k_param_telem_delay,
            k_param_gcs2,
            k_param_serial2_baud_old, // deprecated
            k_param_serial2_protocol, // deprecated
            k_param_serial_manager,
            k_param_ch9_option,
            k_param_ch10_option,
            k_param_ch11_option,
            k_param_ch12_option,
            k_param_takeoff_trigger_dz,
            k_param_gcs3,
            k_param_gcs_pid_mask,    // 126
    
            //
            // 135 : reserved for Solo until features merged with master
            //
            k_param_rtl_speed_cms = 135,
            k_param_fs_batt_curr_rtl,
            k_param_rtl_cone_slope, // 137
    
            //
            // 140: Sensor parameters
            //
            k_param_imu = 140, // deprecated - can be deleted
            k_param_battery_monitoring = 141,   // deprecated - can be deleted
            k_param_volt_div_ratio, // deprecated - can be deleted
            k_param_curr_amp_per_volt,  // deprecated - can be deleted
            k_param_input_voltage,  // deprecated - can be deleted
            k_param_pack_capacity,  // deprecated - can be deleted
            k_param_compass_enabled,
            k_param_compass,
            k_param_rangefinder_enabled_old, // deprecated
            k_param_frame_type,
            k_param_optflow_enabled,    // deprecated
            k_param_fs_batt_voltage,
            k_param_ch7_option,
            k_param_auto_slew_rate,     // deprecated - can be deleted
            k_param_rangefinder_type_old,     // deprecated
            k_param_super_simple = 155,
            k_param_axis_enabled = 157, // deprecated - remove with next eeprom number change
            k_param_copter_leds_mode,   // deprecated - remove with next eeprom number change
            k_param_ahrs, // AHRS group // 159
    
            //
            // 160: Navigation parameters
            //
            k_param_rtl_altitude = 160,
            k_param_crosstrack_gain,    // deprecated - remove with next eeprom number change
            k_param_rtl_loiter_time,
            k_param_rtl_alt_final,
            k_param_tilt_comp,  //164   deprecated - remove with next eeprom number change
    
    
            //
            // Camera and mount parameters
            //
            k_param_camera = 165,
            k_param_camera_mount,
            k_param_camera_mount2,      // deprecated
    
            //
            // Batery monitoring parameters
            //
            k_param_battery_volt_pin = 168, // deprecated - can be deleted
            k_param_battery_curr_pin,   // 169 deprecated - can be deleted
    
            //
            // 170: Radio settings
            //
            k_param_rc_1_old = 170,
            k_param_rc_2_old,
            k_param_rc_3_old,
            k_param_rc_4_old,
            k_param_rc_5_old,
            k_param_rc_6_old,
            k_param_rc_7_old,
            k_param_rc_8_old,
            k_param_rc_10_old,
            k_param_rc_11_old,
            k_param_throttle_min,           // remove
            k_param_throttle_max,           // remove
            k_param_failsafe_throttle,
            k_param_throttle_fs_action,     // remove
            k_param_failsafe_throttle_value,
            k_param_throttle_trim,          // remove
            k_param_esc_calibrate,
            k_param_radio_tuning,
            k_param_radio_tuning_high,
            k_param_radio_tuning_low,
            k_param_rc_speed = 192,
            k_param_failsafe_battery_enabled,
            k_param_throttle_mid,           // remove
            k_param_failsafe_gps_enabled,   // remove
            k_param_rc_9_old,
            k_param_rc_12_old,
            k_param_failsafe_gcs,
            k_param_rcmap, // 199
    
            //
            // 200: flight modes
            //
            k_param_flight_mode1 = 200,
            k_param_flight_mode2,
            k_param_flight_mode3,
            k_param_flight_mode4,
            k_param_flight_mode5,
            k_param_flight_mode6,
            k_param_simple_modes,
    
    
    
            //
            // 210: Waypoint data
            //
            k_param_waypoint_mode = 210, // remove
            k_param_command_total,       // remove
            k_param_command_index,       // remove
            k_param_command_nav_index,   // remove
            k_param_waypoint_radius,     // remove
            k_param_circle_radius,       // remove
            k_param_waypoint_speed_max,  // remove
            k_param_land_speed,
            k_param_auto_velocity_z_min, // remove
            k_param_auto_velocity_z_max, // remove - 219
            k_param_land_speed_high,
    
            //
            // 220: PI/D Controllers
            //
            k_param_acro_rp_p = 221,
            k_param_axis_lock_p,    // remove
            k_param_pid_rate_roll,      // remove
            k_param_pid_rate_pitch,     // remove
            k_param_pid_rate_yaw,       // remove
            k_param_p_stabilize_roll,   // remove
            k_param_p_stabilize_pitch,  // remove
            k_param_p_stabilize_yaw,    // remove
            k_param_p_pos_xy,
            k_param_p_loiter_lon,       // remove
            k_param_pid_loiter_rate_lat,    // remove
            k_param_pid_loiter_rate_lon,    // remove
            k_param_pid_nav_lat,        // remove
            k_param_pid_nav_lon,        // remove
            k_param_p_alt_hold,
            k_param_p_vel_z,
            k_param_pid_optflow_roll,       // remove
            k_param_pid_optflow_pitch,      // remove
            k_param_acro_balance_roll_old,  // remove
            k_param_acro_balance_pitch_old, // remove
            k_param_pid_accel_z,
            k_param_acro_balance_roll,
            k_param_acro_balance_pitch,
            k_param_acro_yaw_p,
            k_param_autotune_axis_bitmask,
            k_param_autotune_aggressiveness,
            k_param_pi_vel_xy,
            k_param_fs_ekf_action,
            k_param_rtl_climb_min,
            k_param_rpm_sensor,
            k_param_autotune_min_d, // 251
            k_param_arming, // 252  - AP_Arming
            k_param_DataFlash = 253, // 253 - Logging Group
            /********************这里是我自己添加的参数****************/
            k_param_radio_mode = 254, // 254 - radio mode American or japan arm
           /********************这里是我自己添加的参数****************/
            // the k_param_* space is 9-bits in size
            // 511: reserved
        };


    需要注意的:

    (1)尽量在执行类似功能的参数区域添加新的参数,或者最坏的情形下就是在“Misc(混合)”区域的末尾添加。(个人建议可以在最后添加好点)
    2)确保你添加的参数区域中还可以有编号添加新的参数。检查是否能继续添加参数的方法是:检查参数的计数,确保你所要添加的参数的上一个元素编号要小于你的下一部分代码的编号。比如,Misc部分的第一个参数起始于#20,。my_new_parameter是#36。如果下一部分参数开始于#36,那么我们就不能在这里添加这个新参数。
    3)不要在一个代码块的中间添加新的参数,那样容易造成现存参数对应的信息的改变。
    4)不要在参数旁边用“弃用(deprecated)”或“移除(remove)”做注解这是因为一些使用者将此注释用作在eeprom上的旧的参数的默认注解,如果你添加的新参数也是这样注解,那么就让人就会看起来很奇怪和疑惑。



    第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

                   我自己添加的参数  


       AP_Int16        format_version;
        AP_Int8         software_type;
    
        // Telemetry control
        //
        AP_Int16        sysid_this_mav;
        AP_Int16        sysid_my_gcs;
        AP_Int8         telem_delay;
    #if CLI_ENABLED == ENABLED
        AP_Int8         cli_enabled;
    #endif
    
        AP_Float        throttle_filt;
        AP_Int16        throttle_behavior;
        AP_Int16        takeoff_trigger_dz;
        AP_Float        pilot_takeoff_alt;
    
        AP_Int16        rtl_altitude;
        AP_Int16        rtl_speed_cms;
        AP_Float        rtl_cone_slope;
        AP_Float        rangefinder_gain;
    
        AP_Int8         failsafe_battery_enabled;   // battery failsafe enabled
        AP_Float        fs_batt_voltage;            // battery voltage below which failsafe will be triggered
        AP_Float        fs_batt_mah;                // battery capacity (in mah) below which failsafe will be triggered
    
        AP_Int8         failsafe_gcs;               // ground station failsafe behavior
        AP_Int16        gps_hdop_good;              // GPS Hdop value at or below this value represent a good position
    
        AP_Int8         compass_enabled;
        AP_Int8         super_simple;
        AP_Int16        rtl_alt_final;
        AP_Int16        rtl_climb_min;              // rtl minimum climb in cm
    
        AP_Int8         wp_yaw_behavior;            // controls how the autopilot controls yaw during missions
        //AP_Int8         rc_feel_rp;                 // controls vehicle response to user input with 0 being extremely soft and 100 begin extremely crisp
    
        AP_Int16        poshold_brake_rate;         // PosHold flight mode's rotation rate during braking in deg/sec
        AP_Int16        poshold_brake_angle_max;    // PosHold flight mode's max lean angle during braking in centi-degrees
    
        // Waypoints
        //
        AP_Int32        rtl_loiter_time;
        AP_Int16        land_speed;
        AP_Int16        land_speed_high;
        AP_Int16        pilot_speed_up;        // rename pilot_speed_up  maximum vertical velocity the pilot may request
        AP_Int16        pilot_accel_z;               // vertical acceleration the pilot may request
    
        // Throttle
        //
        AP_Int8         failsafe_throttle;
        AP_Int16        failsafe_throttle_value;
        AP_Int16        throttle_deadzone;
    
        // Flight modes
        //
        AP_Int8         flight_mode1;
        AP_Int8         flight_mode2;
        AP_Int8         flight_mode3;
        AP_Int8         flight_mode4;
        AP_Int8         flight_mode5;
        AP_Int8         flight_mode6;
        AP_Int8         simple_modes;
    
    
        // Misc
        //
        AP_Int32        log_bitmask;
        AP_Int8         esc_calibrate;
        AP_Int8         radio_tuning;
        AP_Int16        radio_tuning_high;
        AP_Int16        radio_tuning_low;
        AP_Int8         frame_type;
        AP_Int8         ch7_option;
        AP_Int8         ch8_option;
        AP_Int8         ch9_option;
        AP_Int8         ch10_option;
        AP_Int8         ch11_option;
        AP_Int8         ch12_option;
        AP_Int8         disarm_delay;
    
        AP_Int8         land_repositioning;
        AP_Int8         fs_ekf_action;
        AP_Int8         fs_crash_check;
        AP_Float        fs_ekf_thresh;
        AP_Int16        gcs_pid_mask;
    
        AP_Int8         throw_motor_start;
        AP_Int8         terrain_follow;
    
        AP_Int16                rc_speed; // speed of fast RC Channels in Hz
    
        // Acro parameters
        AP_Float                acro_rp_p;
        AP_Float                acro_yaw_p;
        AP_Float                acro_balance_roll;
        AP_Float                acro_balance_pitch;
        AP_Int8                 acro_trainer;
        AP_Float                acro_rp_expo;
    
    
        // Autotune
        AP_Int8                 autotune_axis_bitmask;
        AP_Float                autotune_aggressiveness;
        AP_Float                autotune_min_d;
    
        AP_Int32                Zigzag_time;
        AP_Int8                 Zigzag_width;
        AP_Int8                 radio_type;
    
        //增加新的遥控器类型参数
        AP_Int8         radio_mode ;
    

    第3步:
    将变量声明添加到Parameters.cpp的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),

    自己添加代码

    
        // @Group: 
        // @Path: Parameters.cpp
        GOBJECT(g2, "",  ParametersG2),
        //增加遥控器模式参数
        GSCALAR(radio_mode, "radio_mode",  RADIO_MODE),
        AP_VAREND

    地面站(如Mission Planner)中将使用@Param ~ @User的注释信息向使用者说明用户所设置的变量的范围等。


    第4步:
    在config.h中添加你的新参数。

    #ifndef MY_NEW_PARAMETER_DEFAULT
     # define MY_NEW_PARAMETER_DEFAULT      100     // default value for my new parameter
    #endif

    自己添加代码

    #ifndef RADIO_MODE
     # define RADIO_MODE                  2
    #endif

    最后在地面站可以看到参数

    这里写图片描述


    向主执行代码添加参数的工作就完成了!添加到主代码中(并非库中)的参数就可以通过诸如g.my_new_parameter这样来使用。



    2.增加一个参数到库


    同样可以使用下列步骤向库中添加新的参数。以AP_Compass库为例:


    第一步:


    首先在库代码的.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;                       ///<enable use for yaw calculation
        AP_Int8 _auto_declination;                  ///<enable automatic declination code
        //这里是增加的变量
        AP_Int16 _my_new_lib_parameter;              /// description of my new parameter
    };

    自己添加代码


    (第一步)

    class AP_Proximity
    {
      public:
       ..............................
       //增加参数
        AP_Int8  MY_DATA;
       ..............................
     private:
        Proximity_State state[PROXIMITY_MAX_INSTANCES];
        AP_Proximity_Backend *drivers[PROXIMITY_MAX_INSTANCES];
        const RangeFinder *_rangefinder;
        uint8_t primary_instance:3;
        uint8_t num_instances:3;
        AP_SerialManager &serial_manager;
    
        // parameters for all instances
        AP_Int8  _type[PROXIMITY_MAX_INSTANCES];
        AP_Int8  _orientation[PROXIMITY_MAX_INSTANCES];
        AP_Int16 _yaw_correction[PROXIMITY_MAX_INSTANCES];
        AP_Int16 _ignore_angle_deg[PROXIMITY_MAX_IGNORE];   // angle (in degrees) of area that should be ignored by sensor (i.e. leg shows up)
        AP_Int8 _ignore_width_deg[PROXIMITY_MAX_IGNORE];    // width of beam (in degrees) that should be ignored
    
        void detect_instance(uint8_t instance);
        void update_instance(uint8_t instance);  
    
    };

    第二步:


    然后在.cpp文件(如Compass.cpp)中添加变量包含有@Param ~ @Increment的var_info表信息,以便允许GCS向用户显示来自地面站的关于该参数值的范围设定。当添加新参数时应注意:
    (1)自己添加的代码编号(下面的编号9)一定要比之前变量的大。
    (2)参数的名称(如MY_NEW_P)包括对象自动添加的前缀要少于16个字符。比如罗盘对象的前缀为“COMPASS_”。//这里要注意,起的名字不能太长!!!


    const AP_Param::GroupInfo Compass::var_info[] = {
        // 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
    
    <snip>
    
        // @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参数了。


    第三步:


    除了compass.cpp文件中的定义之外,还将var_info的声明添加到新库类的compass.h文件的公共部分:


    static const struct AP_Param::GroupInfo var_info[];


    第四步:


    前面提到的是在已经存在的类(比如AP_Compass)中定义一个新的变量。如果你重新定义了一个新类,在这个新类中添加参数。添加参数的方法如第二步。不过你还有一个工作要做,就是将这个新类,添加到Parameters.cpp文件的var_info 数组列表中去。下面加粗的红色罗盘类代码就是一个示例。

    const AP_Param::Info var_info[] = {
        // @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),
    <snip>
    
        // @Group: COMPASS_
        // @Path: ../libraries/AP_Compass/Compass.cpp
        //注意这里
        GOBJECT(compass,        "COMPASS_", Compass),
    
    <snip>
        // @Group: INS_
        // @Path: ../libraries/AP_InertialSensor/AP_InertialSensor.cpp
        GOBJECT(ins,            "INS_", AP_InertialSensor),
    
        AP_VAREND
    };

    第五步:


    如果所添加的类是一个完全新添加的代码,那么还要将k_param_my_new_lib添加到Parameters.h中的枚举中,其中my_new_lib是Parameters.cpp.中的GOBJECT声明的第一个参数。读取枚举上的注释,以了解在何处放置新的值,这是因为放置的顺序很重要,(只能使用不占用的枚举数据,一般放在相关的类后面,或者放在最后面。


                   到这里官网上的注释就结束了!!!  



    下面进行动手讲解怎么添加一个新参数到新建的库中,这里以adrc库实现为例;
    (1)首先增加AC_ADRC库,包含(AC_ADRC.cpp和AC_ADRC.h)在AC_ADRC.h定义变量类*


    这里写图片描述


    #ifndef AC_ADRC_H_
    #define AC_ADRC_H_
    
    #include <AP_Common/AP_Common.h>
    #include <AP_Param/AP_Param.h>
    
    class AC_ADRC {
    public:
    ...............此处省略..............
         static const struct AP_Param::GroupInfo var_info[];
    protected:
        //中间省略
        AP_Float _kp, _kd;
        //中间省略
    
    };
    
    #endif 
    

    (2)首先增加数据表:var_info[]


    const AP_Param::GroupInfo AC_ADRC::var_info[] = 
    {
            // @Param: P
            // @DisplayName: PID Proportional Gain
            // @Description: P Gain which produces an output value that is proportional to the current error value
            AP_GROUPINFO("P",    0, AC_ADRC, _kp, 0),
    
    
            // @Param: D
            // @DisplayName: PID Derivative Gain
            // @Description: D Gain which produces an output that is proportional to the rate of change of the error
            AP_GROUPINFO("D",    1, AC_ADRC, _kd, 0),
    
    
    
        AP_GROUPEND
    };

    (3)在AC_ADRC.h中声明var_info[]

    class AC_ADRC {
    public:
    ...............此处省略..............
    //注意是说的这个定义
         static const struct AP_Param::GroupInfo var_info[];
    //注意是说的这个定义
    
    protected:
        //中间省略
        AP_Float _kp, _kd;
        //中间省略
    
    };

    第四步:在Parameters.cpp中增加参数声明

    const AP_Param::Info Copter::var_info[] = {
     #if FRAME_CONFIG == HELI_FRAME
        GOBJECTPTR(attitude_control, "ATC_", AC_AttitudeControl_Heli),
    #else
        GOBJECTPTR(attitude_control, "ATC_", AC_AttitudeControl_Multi),
    #endif
    };

    //继续在AC_AttitudeControl_Multi.cpp和AC_AttitudeControl_Multi.h中安装添加

    const AP_Param::GroupInfo AC_AttitudeControl_Multi::var_info[] = {
    
        AP_SUBGROUPINFO(_adrc_rate_roll, "ADRC_R_", 15, AC_AttitudeControl_Multi, AC_ADRC),
        AP_SUBGROUPINFO(_adrc_rate_pitch, "ADRC_P_", 16, AC_AttitudeControl_Multi, AC_ADRC),
        AP_SUBGROUPINFO(_adrc_rate_yaw, "ADRC_Y_", 17, AC_AttitudeControl_Multi, AC_ADRC),
    
        }


    这里写图片描述
    到这基本完成,如果还不会,可以随便找一个库,自己抄袭一遍就知道怎么添加了。



    二.重点函数的理解与分析



    1.为什么Parameters.h中的enum文件必须按照下面那样写?


    enum {
            // Layout version number, always key zero.
            //
            k_param_format_version = 0,
            k_param_software_type,
            k_param_ins_old,                        // *** Deprecated, remove with next eeprom number change
            k_param_ins,                            // libraries/AP_InertialSensor variables
            k_param_NavEKF2_old, // deprecated - remove
            k_param_NavEKF2,
            k_param_g2, // 2nd block of parameters
            k_param_NavEKF3,
    
            // simulation
            k_param_sitl = 10,
    
            // barometer object (needed for SITL)
            k_param_barometer,
    
            // scheduler object (for debugging)
            k_param_scheduler,
    
            // relay object
            k_param_relay,
    
            // (old) EPM object
            k_param_epm_unused,
    
            // BoardConfig object
            k_param_BoardConfig,
            /*****************后面省略****************/
    }

    重点在这:

    #define GSCALAR(v, name, def) { copter.g.v.vtype, name, Parameters::k_param_ ## v, &copter.g.v, {def_value : def} }
    #define ASCALAR(v, name, def) { copter.aparm.v.vtype, name, Parameters::k_param_ ## v, (const void *)&copter.aparm.v, {def_value : def} }
    #define GGROUP(v, name, class) { AP_PARAM_GROUP, name, Parameters::k_param_ ## v, &copter.g.v, {group_info : class::var_info} }
    #define GOBJECT(v, name, class) { AP_PARAM_GROUP, name, Parameters::k_param_ ## v, (const void *)&copter.v, {group_info : class::var_info} }
    #define GOBJECTPTR(v, name, class) { AP_PARAM_GROUP, name, Parameters::k_param_ ## v, (const void *)&copter.v, {group_info : class::var_info}, AP_PARAM_FLAG_POINTER }
    #define GOBJECTVARPTR(v, name, var_info_ptr) { AP_PARAM_GROUP, name, Parameters::k_param_ ## v, (const void *)&copter.v, {group_info_ptr : var_info_ptr}, AP_PARAM_FLAG_POINTER | AP_PARAM_FLAG_INFO_POINTER }
    #define GOBJECTN(v, pname, name, class) { AP_PARAM_GROUP, name, Parameters::k_param_ ## pname, (const void *)&copter.v, {group_info : class::var_info} }

    其实一个类中的enum变量名字可以任意定义,只要按照枚举顺序就可以,关键在于其他地方调用这个枚举变量,是其他地方对这个有要求,所以我们需要按照这种方式去定义。


    (1)分析重要函数

    #define GSCALAR(v, name, def) { copter.g.v.vtype, name, Parameters::k_param_ ## v, &copter.g.v, {def_value : def} }

    v是变量类对象
    name是名称,可以随便起,但是还是要靠谱点,方便识别
    def是定义

    展开全文
  • 添加头文件#include 出错

    千次阅读 2015-03-11 10:17:19
    使用类CRgn来判断点是否在多边形中时,需要头文件,但是添加该头文件后会出现下面的错误 1>uafxcwd.lib(appcore.obj) : error LNK2001: 无法解析的外部符号 ___wargv 1>uafxcwd.lib(appcore.obj) : error LNK2001:...
    使用类CRgn来判断点是否在多边形中时,需要头文件<afxwin.h>,但是添加该头文件后会出现下面的错误
    1>uafxcwd.lib(appcore.obj) : error LNK2001: 无法解析的外部符号 ___wargv
    1>uafxcwd.lib(appcore.obj) : error LNK2001: 无法解析的外部符号 ___argc
    1>uafxcwd.lib(afxglobals.obj) : error LNK2001: 无法解析的外部符号 _IID_IWICImagingFactory
    1>G:\POSDataSupportedobliqueimagematching_experiment\Rectify\Debug\Rectify.exe : fatal error LNK1120: 3 个无法解析的外部命令


    解决办法:
    项目属性中的 “MFC的使用”  改成 “在共享DLL中使用MFC” ,就可以了,具体原因还不清楚,以后慢慢摸索。
    展开全文
  • 最近在做项目的时候用到了模板类 果不其然出现了那个错误 LNK2019:无法解析的外部符号 网上百度到的结果繁花怒放,大多数不符合我的需求,故自己研究了下C++的模板类规则,试图找出问题所在 ...

    最近在做项目的时候用到了模板类

    果不其然出现了那个错误

    LNK2019:无法解析的外部符号

    网上百度到的结果繁花怒放,大多数不符合我的需求,故自己研究了下C++的模板类规则,试图找出问题所在

    ————————————下面是解决方法——————————————

    首先将出现这个错误应该怎么处理的方法写出来,解一些急着知道结果的攻城狮们燃眉之急:

    1.在主函数包含头文件时将实现模板类的函数也包含进来,如模板类在function1.cpp中实现,则在主函数中添加 #include                 "function.cpp"

    2.将模板类的实现方法写在头文件里面,如模板类的头文件为:function1.h,那么就把实现要用到模板类的函数实现方法写在这     里

    3.在实现模板类的文件中调用一下模板类

    ——————————————下面是详解———————————————

           以下解析皆以一个模板类的文件:function1.h 和 function.cpp  ,以及一个主函数文件:main.cpp  说明。

           首先需要了解的是,一个项目文件从代码段到最终变成可以执行的.exe文件是经过了:替换—编译—连接—生成 这四个步骤的,想要了解具体的编译过程可以参照我以前写过的一篇文章:【c语言】从高级语言到可以执行的EXE程序的编译过程。在编译器中,一个编译单元(.obj文件)是由一个.cpp文件以及该头文件所 include 的头文件所组成.

            如本篇文章中 function1.cpp 的代码如下:

    #include "function.h"
    #include <iostream>
    
    void test()
    {
        //do anything~
    }

            function.h的代码如下:

    #ifndef _FUNCTION_H_
    #define _FUNCTION_H_
    
    void test();
    
    #endif

             main.cpp的代码如下:

    #include "fuction.h"
    
    void main()
    {
        test();
    }

             那么在该项目中存在两个编译单元:

                                          

           当一个项目中的所有编译单元(.obj文件)都已分离的形式独自进行编译之后,再由连接器将各个单独的编译单元进行连接,从而成为一个可以执行的.exe文件。那么,连接器是如何进行编译单元连接的呢?在C++ 的描述里,程序在编译的过程中会生成三个表:重定向表,导出符号表以及未解决符号表,而其中的导出符号表的作用是将程序中的所有符号与实际的地址联系在一起,而连接器要做的就是通过查找导出符号表中符号的实际地址将各个单独编译单元连接在一起,以本章项目为例:

           在main.cpp这个编译单元里面调用了函数 test() , 但是main函数里面并没有test()函数的具体实现方法,所以编译器会在处于同一个编译单元的其他地方找,也就是在 “ function1.h ” 头文件:

                                                       

             而在头文件“function1.h” 中,编译器只发现了函数的定义,也没有找到函数的具体定义:

                                                         

            所以,连接器就会从其他编译单元的导出符号表中寻找与函数test()相同名字的符号,试图找出test()函数的具体实现方法,而在编译单元function.cpp中发现了函数的实现方法,所以连接器就将两个单独的编译单元连接在一起,而在内部无法知道函数具体是如何实现的,只能通过查找外部编译单元的符号,叫做“外部符号”,而这种类型就叫 “ 外部连接类型 ” :

                                       

            而模板类又与普通情况不同,模板类因其本身具有 “ 不确定性 “ 特点,在C++的规则里,模板类在编译时需要一个具体化的过程。我们将以上的项目做一些修改:

    fuction.h:

    #ifndef _FUNCTION_H_
    #define _FUNCTION_H_
    
    template <class T_ELE>
    class function
    {
    public:
        void test();
    }
    
    #endif

    function.cpp:

    #include "function.h"
    #include <iostream>
    
    template <class T_ELE>
    void function<T_ELE>::test()
    {
        //do anything~
    }

    main.cpp:

    #include "function.h"
    
    void main()
    {
        function<int>::test();
    }

           此时main.cpp 中的调用了使用类模板的test()函数,编译器在编译期间寻找编译单元内部并没有找到具体的实现方法,只找到了函数的声明,所以,寻找函数具体实现方法这个任务就交给了链接器,而连接器在外部的编译单元function.cpp 里找到了函数的具体实现方法:

                                    

           但是,问题来了,在C++中由于模板类的自身不确定性,当一个模板没有被调用时,它就不会被具体化出来,也就是说在一个编译单元里,如果使用模板类的函数没有被其他函数调用的话,是没有生成二进制代码的,因为编译器并不知道这个函数是属于哪个类型(int,float,等等),所以无法给这个函数分配合适的内存空间,只有当其他函数调用模板类的函数时,才能确定类型,模板类才能被具现化

            这时,很多人就会有一个这样的误解:我不是在主函数里面调用了模板类的函数了嘛?为啥还是错误呢?请注意,我们再来回顾下这个错误:

           该错误描述为:无法解析的外部符号。我们再回顾下上面说过的,本项目一共有两个编译单元,一个是main,一个是function,而编译过程是每个编译单元单独编译过后再交给连接器进行连接的,也就是说在连接器之前两个编译单元就已经进行了编译,而在主函数main里面调用外部编译单元时,由于另外一个编译单元function在编译时模板类没有被调用而没有得到具现化,从而导致了连接器在函数主函数里调用了模板类函数,但是找不到具体的实现方法的情况,从到就出现了开头的错误:LNK2019 无法解析的外部符号

           知道了错误的根源,我们就可以根治这种情况,总得来说就是模板类没有具现化,那我们就让它具现化就好了,所以总结了以下几个解决方案也得到了很好的解析:

    1.在主函数包含头文件时将实现模板类的函数也包含进来。原因:一个编译单元内包含了.cpp文件以及被include 的头文件,如果将实现模板类的函数文件.cpp也包含进来,那么主函数调用就给了模板类函数一个具现化的机会

    2.将模板类的实现方法写在头文件里面。原因:同上,将实现写在头文件里面,那么主函数调用就给了模板类函数一个具现化的机会

    3.在实现模板类的文件中调用一下模板类。原因:调用一下让模板类函数得到具现化。

    展开全文
  • 1、错误为:error LNK2019: 无法解析的外部符号 ___report_rangecheckfailure,该符号在函数 _OBJ_create_objects 中被引用  原因:__report_rangecheckfailure 是用来检查堆栈缓存溢出的,如果编译的时候打开GS...

    1、错误为:error LNK2019: 无法解析的外部符号 ___report_rangecheckfailure,该符号在函数 _OBJ_create_objects 中被引用

     原因:__report_rangecheckfailure  是用来检查堆栈缓存溢出的,如果编译的时候打开GS(project property--》Configuration properties--》c/c++--》Code generation--》Buffer security check)选项时(GS编译选项解析),编译器将为你加入检测函数堆栈缓存溢出错误额外代码。具体实现在window下的运行时库文件msvcrt.dll中。而这些检查堆栈缓存溢出的代码中在msvcrt11.dll及以后版本中都会调用到__report_rangecheckfailure 函数,所以当你用vs2010及以前版本进行开发,并使用了由vs2012及以后编译器编译的库文件时,在链接的时候就会报这样的错误。

    解决办法:打开项目属性,C/C++——代码生成——安全检查——禁用安全检查(GS)

    2、可以明确知道无法解析的外部符号是某个自己编译的动态链接库的时候,多半是动态链接库引入不正确,不正确的原因:

    (1)使用资源管理器,项目属性来连接的库。

    》可能是lib没有引入正确,检查路径对不对,名称对不对。

    选中项目名称右键——属性——连接器——常规——附加库目录——这里是lib文件所在的路径

    选中项目名称右键——属性——连接器——输入——附加依赖性——这里是lib文件的名称,比如mmpadpater.lib

    》也可能是没有把dll文件放到项目目录下面,网上有说放到输出目录的,有说和输出目录平级的,我感觉都可以,连接器会一个一个去找的。如果不放心,就两个地方都放。

    》还可能是编译库用的位数和编译项目用的位数不同。

    如果项目编译是32位,库编译用的是64位,那肯定会直接抛出错误的。

    如果项目编译是64位,库编译用的是32位,那不会直接抛出错误,只有一个警告,但是,这个Warning也是问题的所在,你会发现无法解析的外部符号的问题,并且翻烂了网页试遍了各种办法还是不能解决。理论上64位的用32位的是没有问题的,我也不知道为什么。

    (2)直接把lib文件添加进项目以引入库。

    可能是没有把dll文件放进来

    也可能是上面的bite问题。

     

    展开全文
  • 1.Intsert简写方式插入数据 1.先看一下表中有那些数据 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190703111342249.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0...
  • docker给已存在的容器添加或修改端口映射

    万次阅读 热门讨论 2019-01-31 20:22:51
    简述: 这几天研究了一下docker, 发现建立完一个容器后不能增加端口映射了,因为 docker run -p 有 -p 参数,但是 docker start 没有 -p 参数,让我很苦恼,无奈谷歌了一番,终于让我找到了解决办法 ...
  • #Linux如何添加文本到指定行 #shell如何添加文本到指定行 #sed 插入文本 用sed来插入文本到指定行。 基本语法 只是在屏幕输出/打印中显示更改,并不改变文件本身内容 sed '作用范围行 插入行前/行后 插入内容' ...
  • Git命令行添加整个文件夹及目录

    万次阅读 2019-12-13 10:16:59
    git add 文件夹/ 添加整个文件夹及内容 git add *.文件类型 添加目录中所有此文件类型的文件 git放弃本地修改: 放弃所有修改 git checkout . 放弃某个文件的修改 git checkout -- filepathname 更多git...
  • 【Vue】数组添加元素的三种方式

    万次阅读 2019-07-04 14:59:59
    1、push() 结尾添加  数组.push(元素) 参数 描述 newelement1 必需。要添加到数组的第一个元素。 newelement2 可选。要添加到数组的第二个元素。 newelementX 可选。可添加多个元素。 2、...
  • 添加元素到数组的开始位置 unshift()

    万次阅读 2018-07-10 14:42:22
    arrayObject.unshift(newelement1,newelement2,....,newelementX)向已有数组的开始位置(即索引为0)的位置添加元素unhsift()点击打开链接
  • jquery添加元素(前面和后面)

    万次阅读 2017-05-19 10:45:30
    jQuery添加插入元素技巧:jquery添加分为在指定元素的里面添加和外面添加两种:里面添加使用(append 和prepend) 里面添加又分为在里面的前面添加和后面添加里面的前面添加使用prepend和prependTo里面的后面添加...
  • js为Object对象动态添加属性和值

    万次阅读 2017-03-01 17:12:15
    为Object对象动态添加属性和值 方式1: var obj = {}; //或者 var obj=new Object(); var key = "name"; var value = "张三丰" obj[key] = value; console.info(obj); 方式2,使用eval() 动态解析字符串表达式 ...
  • MySQL添加字段和修改字段

    万次阅读 2019-06-17 09:33:53
    MySQL添加字段和修改字段 MySQL添加字段的方法并不复杂,下面将为您详细介绍MYSQL添加字段和修改字段等操作的实现方法,希望对您学习MySQL添加字段方面会有所帮助。 1添加表字段 alter table table1 add ...
  • sed '1i 添加的内容' file #这是在第一行前添加字符串 sed '$i 添加的内容' file #这是在最后一行行前添加字符串 sed '$a添加的内容' file #这是在最后一行行后添加字符串
  • Python字典里面添加数据

    万次阅读 2019-07-23 17:09:01
    Python字典里面添加数据的方法 result = {'user':'sily','age':'18'} #执行以下代码 result['day'] = '2019-06-20' print(result) #输出结果 {'user':'sily','age':'18','day':'2019-06-20'} ...
  • 需求:为已有添加字段 示例: 1. 查看先有表结构 2. 为t_test表添加字段nickname 语法:ALTER TABLE 表名 ADD 字段名字段类型 ALTER TABLE t_test ADD nickname varchar(25) COMMENT ‘昵称’; 3. 为t...
  • C#项目添加dll引用

    万次阅读 2017-07-13 13:32:52
    部署dll流程:首先把dll文件放到应用程序…\bin\Debug\下;然后在解决方案中添加引用:右键鼠标–>添加引用–>浏览–>选择dll放置路径后点击“确定”。 最后在项目源代码头文件加入对应的引用。
  • 1 添加动态库,如lipcap.so 则,在LIBS一行中添加“-L/usr/local/lib -lpcap”,依据自己的情况修改libpcap.so的路径 2 添加静态库,如libtinyxml.a 则,在LIBS一行添加“/home/yzj/tinyxml/libtinyxml.a”; ...
  • sed在行首添加字符串; sed ‘s/^/xxx/' filename >output:^符号代表行首 sed在行尾添加字符串; sed ‘s/$/string/' filename>output:$符号代表行尾 sed在匹配某行后添加一行字符串: sed '/...
  • python 在字典中添加键值对的方法。

    万次阅读 2019-06-20 20:01:37
    list 添加元素的方法是 list.append(a)。将 a 添加到 list 里。 dict 添加元素的方法是 dict.update(dict2)。意为,将 dict2 的内容添加到 dict 中。 转载于:...
1 2 3 4 5 ... 20
收藏数 7,038,258
精华内容 2,815,303
关键字:

添加