diff --git a/mavros/src/plugins/sys_time.cpp b/mavros/src/plugins/sys_time.cpp index 915df35f4..6b91dbb45 100644 --- a/mavros/src/plugins/sys_time.cpp +++ b/mavros/src/plugins/sys_time.cpp @@ -1,192 +1,18 @@ -/** - * @brief System Time plugin - * @file sys_time.cpp - * @author M.H.Kabir - * - * @addtogroup plugin - * @{ - */ -/* - * Copyright 2014,2015,2016,2017,2021 Vladimir Ermakov, M.H.Kabir. - * - * This file is part of the mavros package and subject to the license terms - * in the top-level LICENSE file of the mavros repository. - * https://github.com/mavlink/mavros/tree/master/LICENSE.md - */ - -#include -#include - -#include "rcpputils/asserts.hpp" -#include "mavros/mavros_uas.hpp" -#include "mavros/plugin.hpp" -#include "mavros/plugin_filter.hpp" - -#include "sensor_msgs/msg/time_reference.hpp" -#include "mavros_msgs/msg/timesync_status.hpp" - -namespace mavros -{ -namespace std_plugins -{ -using namespace std::placeholders; // NOLINT -using namespace std::chrono_literals; // NOLINT - -/** - * Time synchronization status publisher - * - * Based on diagnostic_updater::FrequencyStatus - */ -class TimeSyncStatus : public diagnostic_updater::DiagnosticTask -{ -public: - TimeSyncStatus(const std::string & name, size_t win_size) - : diagnostic_updater::DiagnosticTask(name), - times_(win_size), - seq_nums_(win_size), - window_size_(win_size), - min_freq_(0.01), - max_freq_(10), - tolerance_(0.1), - last_rtt(0), - rtt_sum(0), - last_remote_ts(0), - offset(0) - { - clear(); - } - - void clear() - { - std::lock_guard lock(mutex); - - auto curtime = clock.now(); - count_ = 0; - rtt_sum = 0; - - for (size_t i = 0; i < window_size_; i++) { - times_[i] = curtime; - seq_nums_[i] = count_; - } - - hist_indx_ = 0; - } - - void tick(int64_t rtt_ns, uint64_t remote_timestamp_ns, int64_t time_offset_ns) - { - std::lock_guard lock(mutex); - - count_++; - last_rtt = rtt_ns; - rtt_sum += rtt_ns; - last_remote_ts = remote_timestamp_ns; - offset = time_offset_ns; - } - - void set_timestamp(uint64_t remote_timestamp_ns) - { - std::lock_guard lock(mutex); - last_remote_ts = remote_timestamp_ns; - } - - void run(diagnostic_updater::DiagnosticStatusWrapper & stat) - { - std::lock_guard lock(mutex); - - auto curtime = clock.now(); - int curseq = count_; - int events = curseq - seq_nums_[hist_indx_]; - double window = (curtime - times_[hist_indx_]).seconds(); - double freq = events / window; - seq_nums_[hist_indx_] = curseq; - times_[hist_indx_] = curtime; - hist_indx_ = (hist_indx_ + 1) % window_size_; - - if (events == 0) { - stat.summary(2, "No events recorded."); - } else if (freq < min_freq_ * (1 - tolerance_)) { - stat.summary(1, "Frequency too low."); - } else if (freq > max_freq_ * (1 + tolerance_)) { - stat.summary(1, "Frequency too high."); - } else { - stat.summary(0, "Normal"); - } - - stat.addf("Timesyncs since startup", "%d", count_); - stat.addf("Frequency (Hz)", "%f", freq); - stat.addf("Last RTT (ms)", "%0.6f", last_rtt / 1e6); - stat.addf("Mean RTT (ms)", "%0.6f", (count_) ? rtt_sum / count_ / 1e6 : 0.0); - stat.addf("Last remote time (s)", "%0.9f", last_remote_ts / 1e9); - stat.addf("Estimated time offset (s)", "%0.9f", offset / 1e9); - } - -private: - rclcpp::Clock clock; - int count_; - std::vector times_; - std::vector seq_nums_; - int hist_indx_; - std::mutex mutex; - const size_t window_size_; - const double min_freq_; - const double max_freq_; - const double tolerance_; - int64_t last_rtt; - int64_t rtt_sum; - uint64_t last_remote_ts; - int64_t offset; -}; - - -/** - * @brief System time plugin - * @plugin sys_time - */ -class SystemTimePlugin : public plugin::Plugin -{ -public: - using TSM = uas::timesync_mode; - - explicit SystemTimePlugin(plugin::UASPtr uas_) - : Plugin(uas_, "time"), - dt_diag("Time Sync", 10), - time_offset(0.0), - time_skew(0.0), - sequence(0), - filter_alpha(0), - filter_beta(0), - high_rtt_count(0), - high_deviation_count(0) - { - enable_node_watch_parameters(); - - node_declare_and_watch_parameter( - "time_ref_source", "fcu", [&](const rclcpp::Parameter & p) { - time_ref_source = p.as_string(); - }); - - node_declare_and_watch_parameter( - "timesync_mode", "MAVLINK", [&](const rclcpp::Parameter & p) { - auto ts_mode = utils::timesync_mode_from_str(p.as_string()); - uas->set_timesync_mode(ts_mode); - RCLCPP_INFO_STREAM(get_logger(), "TM: Timesync mode: " << utils::to_string(ts_mode)); - }); - node_declare_and_watch_parameter( "system_time_rate", 0.0, [&](const rclcpp::Parameter & p) { auto rate_d = p.as_double(); - if (rate_d == 0) { + if (rate_d <= 0.0) { if (sys_time_timer) { sys_time_timer->cancel(); sys_time_timer.reset(); } } else { - rclcpp::WallRate rate(rate_d); + auto period = std::chrono::duration(1.0 / rate_d); sys_time_timer = node->create_wall_timer( - rate.period(), + std::chrono::duration_cast(period), std::bind(&SystemTimePlugin::sys_time_cb, this)); } }); @@ -195,357 +21,20 @@ class SystemTimePlugin : public plugin::Plugin "timesync_rate", 0.0, [&](const rclcpp::Parameter & p) { auto rate_d = p.as_double(); - if (rate_d == 0) { + if (rate_d <= 0.0) { if (timesync_timer) { timesync_timer->cancel(); timesync_timer.reset(); uas->diagnostic_updater.removeByName(dt_diag.getName()); } } else { - rclcpp::WallRate rate(rate_d); + auto period = std::chrono::duration(1.0 / rate_d); timesync_timer = node->create_wall_timer( - rate.period(), + std::chrono::duration_cast(period), std::bind(&SystemTimePlugin::timesync_cb, this)); uas->diagnostic_updater.add(dt_diag); } - }); - - // Filter gains - // - // Alpha : Used to smooth the overall clock offset estimate. Smaller values will lead - // to a smoother estimate, but track time drift more slowly, introducing a bias - // in the estimate. Larger values will cause low-amplitude oscillations. - // - // Beta : Used to smooth the clock skew estimate. Smaller values will lead to a - // tighter estimation of the skew (derivative), but will negatively affect how fast the - // filter reacts to clock skewing (e.g cause by temperature changes to the oscillator). - // Larger values will cause large-amplitude oscillations. - node_declare_and_watch_parameter( - "timesync_alpha_initial", 0.05, [&](const rclcpp::Parameter & p) { - filter_alpha_initial = p.as_double(); - reset_filter(); - }); - node_declare_and_watch_parameter( - "timesync_beta_initial", 0.05, [&](const rclcpp::Parameter & p) { - filter_beta_initial = p.as_double(); - reset_filter(); - }); - node_declare_and_watch_parameter( - "timesync_alpha_final", 0.003, [&](const rclcpp::Parameter & p) { - filter_alpha_final = p.as_double(); - reset_filter(); - }); - node_declare_and_watch_parameter( - "timesync_beta_final", 0.003, [&](const rclcpp::Parameter & p) { - filter_beta_final = p.as_double(); - reset_filter(); - }); - - // Filter gain scheduling - // - // The filter interpolates between the initial and final gains while the number of - // exchanged timesync packets is less than convergence_window. A lower value will - // allow the timesync to converge faster, but with potentially less accurate initial - // offset and skew estimates. - node_declare_and_watch_parameter( - "convergence_window", 500, [&](const rclcpp::Parameter & p) { - convergence_window = p.as_int(); - }); - - // Outlier rejection and filter reset - // - // Samples with round-trip time higher than max_rtt_sample are not used to update the filter. - // More than max_consecutive_high_rtt number of such events in a row will throw a warning - // but not reset the filter. - // Samples whose calculated clock offset is more than max_deviation_sample off from the current - // estimate are not used to update the filter. More than max_consecutive_high_deviation number - // of such events in a row will reset the filter. This usually happens only due to a time jump - // on the remote system. - node_declare_and_watch_parameter( - "max_rtt_sample", 10, [&](const rclcpp::Parameter & p) { - max_rtt_sample = p.as_int(); // in ms - }); - node_declare_and_watch_parameter( - "max_deviation_sample", 10, [&](const rclcpp::Parameter & p) { - max_deviation_sample = p.as_int(); // in ms - }); - node_declare_and_watch_parameter( - "max_consecutive_high_rtt", 10, [&](const rclcpp::Parameter & p) { - max_cons_high_rtt = p.as_int(); - }); - node_declare_and_watch_parameter( - "max_consecutive_high_deviation", 10, [&](const rclcpp::Parameter & p) { - max_cons_high_deviation = p.as_int(); - }); - - auto sensor_qos = rclcpp::SensorDataQoS(); - - time_ref_pub = node->create_publisher( - "time_reference", - sensor_qos); - timesync_status_pub = node->create_publisher( - "timesync_status", sensor_qos); - - reset_filter(); - } - - Subscriptions get_subscriptions() override - { - return { - make_handler(&SystemTimePlugin::handle_system_time), - make_handler(&SystemTimePlugin::handle_timesync), - }; - } - -private: - rclcpp::Publisher::SharedPtr time_ref_pub; - rclcpp::Publisher::SharedPtr timesync_status_pub; - - rclcpp::TimerBase::SharedPtr sys_time_timer; - rclcpp::TimerBase::SharedPtr timesync_timer; - - TimeSyncStatus dt_diag; - - std::string time_ref_source; - - // Estimated statistics - double time_offset; - double time_skew; - - // Filter parameters - uint32_t sequence; - double filter_alpha; - double filter_beta; - - // Filter settings - float filter_alpha_initial; - float filter_beta_initial; - float filter_alpha_final; - float filter_beta_final; - int convergence_window; - - // Outlier rejection - int max_rtt_sample; - int max_deviation_sample; - int max_cons_high_rtt; - int max_cons_high_deviation; - int high_rtt_count; - int high_deviation_count; - - void handle_system_time( - const mavlink::mavlink_message_t * msg [[maybe_unused]], - mavlink::common::msg::SYSTEM_TIME & mtime, plugin::filter::SystemAndOk filter [[maybe_unused]]) - { - // date -d @1234567890: Sat Feb 14 02:31:30 MSK 2009 - const bool fcu_time_valid = mtime.time_unix_usec > 1234567890ULL * 1000000; - - if (fcu_time_valid) { - // continuous publish for ntpd - auto time_unix = sensor_msgs::msg::TimeReference(); - rclcpp::Time time_ref( - mtime.time_unix_usec / 1000000, // t_sec - (mtime.time_unix_usec % 1000000) * 1000); // t_nsec - - time_unix.header.stamp = node->now(); - time_unix.time_ref = time_ref; - time_unix.source = time_ref_source; - - time_ref_pub->publish(time_unix); - } else { - RCLCPP_WARN_THROTTLE(get_logger(), *get_clock(), 60000, "TM: Wrong FCU time."); - } - } - - void handle_timesync( - const mavlink::mavlink_message_t * msg [[maybe_unused]], - mavlink::common::msg::TIMESYNC & tsync, plugin::filter::SystemAndOk filter [[maybe_unused]]) - { - uint64_t now_ns = node->now().nanoseconds(); - - if (tsync.tc1 == 0) { - send_timesync_msg(now_ns, tsync.ts1); - return; - } else if (tsync.tc1 > 0) { - // Time offset between this system and the remote system is calculated assuming RTT for - // the timesync packet is roughly equal both ways. - add_timesync_observation((tsync.ts1 + now_ns - tsync.tc1 * 2) / 2, tsync.ts1, tsync.tc1); - } - } - - void sys_time_cb() - { - // For filesystem only - uint64_t time_unix_usec = node->now().nanoseconds() / 1000; // nano -> micro - - mavlink::common::msg::SYSTEM_TIME mtime {}; - mtime.time_unix_usec = time_unix_usec; - - uas->send_message(mtime); - } - - void timesync_cb() - { - auto ts_mode = uas->get_timesync_mode(); - if (ts_mode == TSM::NONE || ts_mode == TSM::PASSTHROUGH) { - // NOTE(vooon): nothing to do. keep timer running for possible mode change - } else if (ts_mode == TSM::MAVLINK) { - send_timesync_msg(0, node->now().nanoseconds()); - } else if (ts_mode == TSM::ONBOARD) { - // Calculate offset between CLOCK_REALTIME (ros::WallTime) and CLOCK_MONOTONIC - uint64_t realtime_now_ns = node->now().nanoseconds(); - uint64_t monotonic_now_ns = get_monotonic_now(); - - add_timesync_observation( - realtime_now_ns - monotonic_now_ns, realtime_now_ns, - monotonic_now_ns); - } - } - - void send_timesync_msg(uint64_t tc1, uint64_t ts1) - { - mavlink::common::msg::TIMESYNC tsync {}; - tsync.tc1 = tc1; - tsync.ts1 = ts1; - - uas->send_message(tsync); - } - - void add_timesync_observation(int64_t offset_ns, uint64_t local_time_ns, uint64_t remote_time_ns) - { - uint64_t now_ns = node->now().nanoseconds(); - - // Calculate the round trip time (RTT) it took the timesync - // packet to bounce back to us from remote system - uint64_t rtt_ns = now_ns - local_time_ns; - - // Calculate the difference of this sample from the current estimate - uint64_t deviation = llabs(int64_t(time_offset) - offset_ns); - - if (rtt_ns < max_rtt_sample * 1000000ULL) { // Only use samples with low RTT - if (sync_converged() && (deviation > max_deviation_sample * 1000000ULL)) { - // Increment the counter if we have a good estimate and are - // getting samples far from the estimate - high_deviation_count++; - - // We reset the filter if we received consecutive samples - // which violate our present estimate. - // This is most likely due to a time jump on the offboard system. - if (high_deviation_count > max_cons_high_deviation) { - RCLCPP_ERROR(get_logger(), "TM: Time jump detected. Resetting time synchroniser."); - - // Reset the filter - reset_filter(); - - // Reset diagnostics - dt_diag.clear(); - dt_diag.set_timestamp(remote_time_ns); - } - } else { - // Filter gain scheduling - if (!sync_converged()) { - // Interpolate with a sigmoid function - float progress = static_cast(sequence) / convergence_window; - float p = 1.0f - expf(0.5f * (1.0f - 1.0f / (1.0f - progress))); - filter_alpha = p * filter_alpha_final + (1.0f - p) * filter_alpha_initial; - filter_beta = p * filter_beta_final + (1.0f - p) * filter_beta_initial; - } else { - filter_alpha = filter_alpha_final; - filter_beta = filter_beta_final; - } - - // Perform filter update - add_sample(offset_ns); - - // Save time offset for other components to use - uas->set_time_offset(sync_converged() ? time_offset : 0); - - // Increment sequence counter after filter update - sequence++; - - // Reset high deviation count after filter update - high_deviation_count = 0; - - // Reset high RTT count after filter update - high_rtt_count = 0; - } - } else { - // Increment counter if round trip time is too high for accurate timesync - high_rtt_count++; - - if (high_rtt_count > max_cons_high_rtt) { - // Issue a warning to the user if the RTT is constantly high - RCLCPP_WARN(get_logger(), "TM: RTT too high for timesync: %0.2f ms.", rtt_ns / 1000000.0); - - // Reset counter - high_rtt_count = 0; - } - } - - // Publish timesync status - auto timesync_status = mavros_msgs::msg::TimesyncStatus(); - timesync_status.header.stamp = node->now(); - timesync_status.remote_timestamp_ns = remote_time_ns; - timesync_status.observed_offset_ns = offset_ns; - timesync_status.estimated_offset_ns = time_offset; - timesync_status.round_trip_time_ms = static_cast(rtt_ns / 1000000.0); - - timesync_status_pub->publish(timesync_status); - - // Update diagnostics - dt_diag.tick(rtt_ns, remote_time_ns, time_offset); - } - - void add_sample(int64_t offset_ns) - { - /* Online exponential smoothing filter. The derivative of the estimate is also - * estimated in order to produce an estimate without steady state lag: - * https://en.wikipedia.org/wiki/Exponential_smoothing#Double_exponential_smoothing - */ - - double time_offset_prev = time_offset; - - if (sequence == 0) { // First offset sample - time_offset = offset_ns; - } else { - // Update the clock offset estimate - time_offset = filter_alpha * offset_ns + (1.0 - filter_alpha) * (time_offset + time_skew); - - // Update the clock skew estimate - time_skew = filter_beta * (time_offset - time_offset_prev) + (1.0 - filter_beta) * time_skew; - } - } - - void reset_filter() - { - // Do a full reset of all statistics and parameters - sequence = 0; - time_offset = 0.0; - time_skew = 0.0; - filter_alpha = filter_alpha_initial; - filter_beta = filter_beta_initial; - high_deviation_count = 0; - high_rtt_count = 0; - } - - inline bool sync_converged() - { - return sequence >= uint32_t(convergence_window); - } - - uint64_t get_monotonic_now(void) - { - struct timespec spec; - clock_gettime(CLOCK_MONOTONIC, &spec); - - return spec.tv_sec * 1000000000ULL + spec.tv_nsec; - } -}; - -} // namespace std_plugins -} // namespace mavros - -#include // NOLINT -MAVROS_PLUGIN_REGISTER(mavros::std_plugins::SystemTimePlugin) + }); \ No newline at end of file diff --git a/mavros/test/mavros_py/testdata/missionplanner.parm b/mavros/test/mavros_py/testdata/missionplanner.parm index 26d68c47b..3a1fbf1c9 100644 --- a/mavros/test/mavros_py/testdata/missionplanner.parm +++ b/mavros/test/mavros_py/testdata/missionplanner.parm @@ -1,354 +1,354 @@ -#NOTE: 22.09.2014 17:33:53 -ACRO_LOCKING,0 -ACRO_PITCH_RATE,180 -ACRO_ROLL_RATE,180 -AHRS_COMP_BETA,0.10000000149011612 -AHRS_GPS_GAIN,1.0 -AHRS_GPS_MINSATS,6 -AHRS_GPS_USE,1 -AHRS_ORIENTATION,0 -AHRS_RP_P,0.20000000298023224 -AHRS_TRIM_X,0.058273520320653915 -AHRS_TRIM_Y,-0.017083074897527695 -AHRS_TRIM_Z,0.0 -AHRS_WIND_MAX,0 -AHRS_YAW_P,0.20000000298023224 -ALT_CTRL_ALG,0 -ALT_HOLD_FBWCM,0 -ALT_HOLD_RTL,8000 -ALT_MIX,1.0 -ALT_OFFSET,0 -ARMING_CHECK,0 -ARMING_DIS_RUD,0 -ARMING_REQUIRE,0 -ARSPD_AUTOCAL,1 -ARSPD_ENABLE,1 -ARSPD_FBW_MAX,22 -ARSPD_FBW_MIN,9 -ARSPD_OFFSET,2128.38037109375 -ARSPD_PIN,0 -ARSPD_RATIO,2.201099157333374 -ARSPD_TUBE_ORDER,2 -ARSPD_USE,1 -AUTOTUNE_LEVEL,5 -AUTO_FBW_STEER,0 -BATT_AMP_OFFSET,0.0 -BATT_AMP_PERVOLT,18.001800537109375 -BATT_CAPACITY,2200 -BATT_CURR_PIN,12 -BATT_MONITOR,4 -BATT_VOLT2_MULT,1.0 -BATT_VOLT2_PIN,-1 -BATT_VOLT_MULT,10.100000381469727 -BATT_VOLT_PIN,13 -CAM_DURATION,10 -CAM_SERVO_OFF,1100 -CAM_SERVO_ON,1300 -CAM_TRIGG_DIST,0.0 -CAM_TRIGG_TYPE,0 -COMPASS_AUTODEC,1 -COMPASS_DEC,0.0 -COMPASS_EXTERNAL,1 -COMPASS_LEARN,0 -COMPASS_MOTCT,0 -COMPASS_MOT_X,0.0 -COMPASS_MOT_Y,0.0 -COMPASS_MOT_Z,0.0 -COMPASS_OFS_X,-2.8186113834381104 -COMPASS_OFS_Y,29.56283187866211 -COMPASS_OFS_Z,-153.5463104248047 -COMPASS_ORIENT,8 -COMPASS_USE,1 -ELEVON_CH1_REV,0 -ELEVON_CH2_REV,0 -ELEVON_MIXING,0 -ELEVON_OUTPUT,0 -ELEVON_REVERSE,0 -FBWA_TDRAG_CHAN,0 -FBWB_CLIMB_RATE,2 -FBWB_ELEV_REV,0 -FENCE_ACTION,0 -FENCE_AUTOENABLE,0 -FENCE_CHANNEL,0 -FENCE_MAXALT,300 -FENCE_MINALT,30 -FENCE_RETALT,0 -FENCE_RET_RALLY,0 -FENCE_TOTAL,6 -FLAPERON_OUTPUT,0 -FLAP_1_PERCNT,0 -FLAP_1_SPEED,0 -FLAP_2_PERCNT,0 -FLAP_2_SPEED,0 -FLAP_IN_CHANNEL,8 -FLAP_SLEWRATE,75 -FLTMODE1,11 -FLTMODE2,6 -FLTMODE3,5 -FLTMODE4,10 -FLTMODE5,12 -FLTMODE6,0 -FLTMODE_CH,5 -FORMAT_VERSION,13 -FS_BATT_MAH,0.0 -FS_BATT_VOLTAGE,0.0 -FS_GCS_ENABL,0 -FS_LONG_ACTN,1 -FS_LONG_TIMEOUT,20.0 -FS_SHORT_ACTN,1 -FS_SHORT_TIMEOUT,1.5 -GLIDE_SLOPE_MIN,15 -GND_ABS_PRESS,99563.359375 -GND_ALT_OFFSET,0 -GND_TEMP,26.19577407836914 -GPS_MIN_ELEV,-100 -GPS_NAVFILTER,8 -GPS_SBAS_MODE,2 -GPS_TYPE,2 -GROUND_STEER_ALT,0.0 -GROUND_STEER_DPS,90 -INS_ACCOFFS_X,0.17904429137706757 -INS_ACCOFFS_Y,0.2191154956817627 -INS_ACCOFFS_Z,0.6167079210281372 -INS_ACCSCAL_X,0.9940382838249207 -INS_ACCSCAL_Y,0.9934437870979309 -INS_ACCSCAL_Z,0.9752721786499023 -INS_GYROFFS_X,0.0013595402706414461 -INS_GYROFFS_Y,-0.026158515363931656 -INS_GYROFFS_Z,0.02016429416835308 -INS_MPU6K_FILTER,0 -INS_PRODUCT_ID,88 -INVERTEDFLT_CH,0 -KFF_RDDRMIX,0.5 -KFF_THR2PTCH,0.0 -LAND_FLAP_PERCNT,0 -LAND_FLARE_ALT,5.0 -LAND_FLARE_SEC,3.0 -LAND_PITCH_CD,25 -LEVEL_ROLL_LIMIT,5 -LIM_PITCH_MAX,3500 -LIM_PITCH_MIN,-3000 -LIM_ROLL_CD,5000 -LOG_BITMASK,5190 -MAG_ENABLE,1 -MIN_GNDSPD_CM,0 -MIS_RESTART,0 -MIS_TOTAL,5 -MIXING_GAIN,0.5 -MNT_ANGMAX_PAN,4500 -MNT_ANGMAX_ROL,4500 -MNT_ANGMAX_TIL,4500 -MNT_ANGMIN_PAN,-4500 -MNT_ANGMIN_ROL,-4500 -MNT_ANGMIN_TIL,-4500 -MNT_CONTROL_X,0.0 -MNT_CONTROL_Y,0.0 -MNT_CONTROL_Z,0.0 -MNT_JSTICK_SPD,0 -MNT_MODE,0 -MNT_NEUTRAL_X,0.0 -MNT_NEUTRAL_Y,0.0 -MNT_NEUTRAL_Z,0.0 -MNT_RC_IN_PAN,0 -MNT_RC_IN_ROLL,0 -MNT_RC_IN_TILT,0 -MNT_RETRACT_X,0.0 -MNT_RETRACT_Y,0.0 -MNT_RETRACT_Z,0.0 -MNT_STAB_PAN,0 -MNT_STAB_ROLL,0 -MNT_STAB_TILT,0 -NAVL1_DAMPING,0.75 -NAVL1_PERIOD,25.0 -NAV_CONTROLLER,1 -PTCH2SRV_D,0.12879998981952667 -PTCH2SRV_I,0.14000000059604645 -PTCH2SRV_IMAX,3500 -PTCH2SRV_P,1.8399999141693115 -PTCH2SRV_RLL,1.2000000476837158 -PTCH2SRV_RMAX_DN,60 -PTCH2SRV_RMAX_UP,60 -PTCH2SRV_TCONST,0.5 -RALLY_LIMIT_KM,1.0 -RALLY_TOTAL,1 -RC10_DZ,0 -RC10_FUNCTION,0 -RC10_MAX,1900 -RC10_MIN,1100 -RC10_REV,1 -RC10_TRIM,1500 -RC11_DZ,0 -RC11_FUNCTION,0 -RC11_MAX,1900 -RC11_MIN,1100 -RC11_REV,1 -RC11_TRIM,1500 -RC1_DZ,30 -RC1_MAX,2017 -RC1_MIN,992 -RC1_REV,-1 -RC1_TRIM,1495 -RC2_DZ,30 -RC2_MAX,2017 -RC2_MIN,992 -RC2_REV,-1 -RC2_TRIM,1502 -RC3_DZ,30 -RC3_MAX,2017 -RC3_MIN,992 -RC3_REV,1 -RC3_TRIM,1003 -RC4_DZ,30 -RC4_MAX,2017 -RC4_MIN,992 -RC4_REV,-1 -RC4_TRIM,1509 -RC5_DZ,0 -RC5_FUNCTION,0 -RC5_MAX,1966 -RC5_MIN,1100 -RC5_REV,1 -RC5_TRIM,1966 -RC6_DZ,0 -RC6_FUNCTION,0 -RC6_MAX,2017 -RC6_MIN,992 -RC6_REV,1 -RC6_TRIM,1495 -RC7_DZ,0 -RC7_FUNCTION,2 -RC7_MAX,1660 -RC7_MIN,1146 -RC7_REV,-1 -RC7_TRIM,1659 -RC8_DZ,0 -RC8_FUNCTION,2 -RC8_MAX,1828 -RC8_MIN,1237 -RC8_REV,1 -RC8_TRIM,1238 -RCMAP_PITCH,2 -RCMAP_ROLL,1 -RCMAP_THROTTLE,3 -RCMAP_YAW,4 -RELAY_DEFAULT,0 -RELAY_PIN,13 -RELAY_PIN2,-1 -RELAY_PIN3,-1 -RELAY_PIN4,-1 -RLL2SRV_D,0.03320127725601196 -RLL2SRV_I,0.031118083745241165 -RLL2SRV_IMAX,4000 -RLL2SRV_P,0.4743039608001709 -RLL2SRV_RMAX,60 -RLL2SRV_TCONST,0.5 -RNGFND2_FUNCTION,0 -RNGFND2_MAX_CM,700 -RNGFND2_MIN_CM,20 -RNGFND2_OFFSET,0.0 -RNGFND2_PIN,-1 -RNGFND2_RMETRIC,1 -RNGFND2_SCALING,3.0 -RNGFND2_SETTLE_M,0 -RNGFND2_STOP_PIN,-1 -RNGFND2_TYPE,0 -RNGFND_FUNCTION,0 -RNGFND_LANDING,0 -RNGFND_MAX_CM,700 -RNGFND_MIN_CM,20 -RNGFND_OFFSET,0.0 -RNGFND_PIN,-1 -RNGFND_RMETRIC,1 -RNGFND_SCALING,3.0 -RNGFND_SETTLE_MS,0 -RNGFND_STOP_PIN,-1 -RNGFND_TYPE,0 -RSSI_PIN,1 -RSSI_RANGE,3.299999952316284 -RST_MISSION_CH,0 -RST_SWITCH_CH,0 -SCALING_SPEED,15.0 -SCHED_DEBUG,0 -SERIAL0_BAUD,115 -SERIAL1_BAUD,57 -SKIP_GYRO_CAL,0 -SR0_EXTRA1,10 -SR0_EXTRA2,10 -SR0_EXTRA3,2 -SR0_EXT_STAT,2 -SR0_PARAMS,10 -SR0_POSITION,3 -SR0_RAW_CTRL,2 -SR0_RAW_SENS,2 -SR0_RC_CHAN,2 -SR1_EXTRA1,2 -SR1_EXTRA2,2 -SR1_EXTRA3,2 -SR1_EXT_STAT,2 -SR1_PARAMS,10 -SR1_POSITION,2 -SR1_RAW_CTRL,2 -SR1_RAW_SENS,2 -SR1_RC_CHAN,2 -STAB_PITCH_DOWN,2.0 -STEER2SRV_D,0.004999999888241291 -STEER2SRV_I,0.20000000298023224 -STEER2SRV_IMAX,1500 -STEER2SRV_MINSPD,1.0 -STEER2SRV_P,1.7999999523162842 -STEER2SRV_TCONST,0.75 -STICK_MIXING,1 -SYSID_MYGCS,255 -SYSID_SW_TYPE,0 -SYSID_THISMAV,1 -SYS_NUM_RESETS,117 -TECS_CLMB_MAX,5.0 -TECS_HGT_OMEGA,3.0 -TECS_INTEG_GAIN,0.10000000149011612 -TECS_LAND_ARSPD,-1.0 -TECS_LAND_SINK,0.25 -TECS_LAND_SPDWGT,1.0 -TECS_LAND_TCONST,2.0 -TECS_LAND_THR,-1.0 -TECS_PITCH_MAX,0 -TECS_PITCH_MIN,0 -TECS_PTCH_DAMP,0.0 -TECS_RLL2THR,10.0 -TECS_SINK_MAX,5.0 -TECS_SINK_MIN,2.0 -TECS_SPDWEIGHT,1.0 -TECS_SPD_OMEGA,2.0 -TECS_THR_DAMP,0.5 -TECS_TIME_CONST,5.0 -TECS_VERT_ACC,7.0 -TELEM_DELAY,0 -THROTTLE_NUDGE,1 -THR_FAILSAFE,1 -THR_FS_VALUE,995 -THR_MAX,80 -THR_MIN,0 -THR_PASS_STAB,0 -THR_SLEWRATE,60 -THR_SUPP_MAN,0 -TKOFF_FLAP_PCNT,0 -TKOFF_ROTATE_SPD,0.0 -TKOFF_TDRAG_ELEV,0 -TKOFF_TDRAG_SPD1,0.0 -TKOFF_THR_DELAY,1 -TKOFF_THR_MAX,100 -TKOFF_THR_MINACC,3.0 -TKOFF_THR_MINSPD,1.0 -TKOFF_THR_SLEW,0 -TRIM_ARSPD_CM,1500 -TRIM_AUTO,0 -TRIM_PITCH_CD,0 -TRIM_THROTTLE,60 -VTAIL_OUTPUT,0 -WP_LOITER_RAD,60 -WP_MAX_RADIUS,50 -WP_RADIUS,46 -YAW2SRV_DAMP,0.0 -YAW2SRV_IMAX,1500 -YAW2SRV_INT,0.0 -YAW2SRV_RLL,1.0 -YAW2SRV_SLIP,0.0 +#NOTE: 22.09.2014 17:33:53 +ACRO_LOCKING,0 +ACRO_PITCH_RATE,180 +ACRO_ROLL_RATE,180 +AHRS_COMP_BETA,0.10000000149011612 +AHRS_GPS_GAIN,1.0 +AHRS_GPS_MINSATS,6 +AHRS_GPS_USE,1 +AHRS_ORIENTATION,0 +AHRS_RP_P,0.20000000298023224 +AHRS_TRIM_X,0.058273520320653915 +AHRS_TRIM_Y,-0.017083074897527695 +AHRS_TRIM_Z,0.0 +AHRS_WIND_MAX,0 +AHRS_YAW_P,0.20000000298023224 +ALT_CTRL_ALG,0 +ALT_HOLD_FBWCM,0 +ALT_HOLD_RTL,8000 +ALT_MIX,1.0 +ALT_OFFSET,0 +ARMING_CHECK,0 +ARMING_DIS_RUD,0 +ARMING_REQUIRE,0 +ARSPD_AUTOCAL,1 +ARSPD_ENABLE,1 +ARSPD_FBW_MAX,22 +ARSPD_FBW_MIN,9 +ARSPD_OFFSET,2128.38037109375 +ARSPD_PIN,0 +ARSPD_RATIO,2.201099157333374 +ARSPD_TUBE_ORDER,2 +ARSPD_USE,1 +AUTOTUNE_LEVEL,5 +AUTO_FBW_STEER,0 +BATT_AMP_OFFSET,0.0 +BATT_AMP_PERVOLT,18.001800537109375 +BATT_CAPACITY,2200 +BATT_CURR_PIN,12 +BATT_MONITOR,4 +BATT_VOLT2_MULT,1.0 +BATT_VOLT2_PIN,-1 +BATT_VOLT_MULT,10.100000381469727 +BATT_VOLT_PIN,13 +CAM_DURATION,10 +CAM_SERVO_OFF,1100 +CAM_SERVO_ON,1300 +CAM_TRIGG_DIST,0.0 +CAM_TRIGG_TYPE,0 +COMPASS_AUTODEC,1 +COMPASS_DEC,0.0 +COMPASS_EXTERNAL,1 +COMPASS_LEARN,0 +COMPASS_MOTCT,0 +COMPASS_MOT_X,0.0 +COMPASS_MOT_Y,0.0 +COMPASS_MOT_Z,0.0 +COMPASS_OFS_X,-2.8186113834381104 +COMPASS_OFS_Y,29.56283187866211 +COMPASS_OFS_Z,-153.5463104248047 +COMPASS_ORIENT,8 +COMPASS_USE,1 +ELEVON_CH1_REV,0 +ELEVON_CH2_REV,0 +ELEVON_MIXING,0 +ELEVON_OUTPUT,0 +ELEVON_REVERSE,0 +FBWA_TDRAG_CHAN,0 +FBWB_CLIMB_RATE,2 +FBWB_ELEV_REV,0 +FENCE_ACTION,0 +FENCE_AUTOENABLE,0 +FENCE_CHANNEL,0 +FENCE_MAXALT,300 +FENCE_MINALT,30 +FENCE_RETALT,0 +FENCE_RET_RALLY,0 +FENCE_TOTAL,6 +FLAPERON_OUTPUT,0 +FLAP_1_PERCNT,0 +FLAP_1_SPEED,0 +FLAP_2_PERCNT,0 +FLAP_2_SPEED,0 +FLAP_IN_CHANNEL,8 +FLAP_SLEWRATE,75 +FLTMODE1,11 +FLTMODE2,6 +FLTMODE3,5 +FLTMODE4,10 +FLTMODE5,12 +FLTMODE6,0 +FLTMODE_CH,5 +FORMAT_VERSION,13 +FS_BATT_MAH,0.0 +FS_BATT_VOLTAGE,0.0 +FS_GCS_ENABL,0 +FS_LONG_ACTN,1 +FS_LONG_TIMEOUT,20.0 +FS_SHORT_ACTN,1 +FS_SHORT_TIMEOUT,1.5 +GLIDE_SLOPE_MIN,15 +GND_ABS_PRESS,99563.359375 +GND_ALT_OFFSET,0 +GND_TEMP,26.19577407836914 +GPS_MIN_ELEV,-100 +GPS_NAVFILTER,8 +GPS_SBAS_MODE,2 +GPS_TYPE,2 +GROUND_STEER_ALT,0.0 +GROUND_STEER_DPS,90 +INS_ACCOFFS_X,0.17904429137706757 +INS_ACCOFFS_Y,0.2191154956817627 +INS_ACCOFFS_Z,0.6167079210281372 +INS_ACCSCAL_X,0.9940382838249207 +INS_ACCSCAL_Y,0.9934437870979309 +INS_ACCSCAL_Z,0.9752721786499023 +INS_GYROFFS_X,0.0013595402706414461 +INS_GYROFFS_Y,-0.026158515363931656 +INS_GYROFFS_Z,0.02016429416835308 +INS_MPU6K_FILTER,0 +INS_PRODUCT_ID,88 +INVERTEDFLT_CH,0 +KFF_RDDRMIX,0.5 +KFF_THR2PTCH,0.0 +LAND_FLAP_PERCNT,0 +LAND_FLARE_ALT,5.0 +LAND_FLARE_SEC,3.0 +LAND_PITCH_CD,25 +LEVEL_ROLL_LIMIT,5 +LIM_PITCH_MAX,3500 +LIM_PITCH_MIN,-3000 +LIM_ROLL_CD,5000 +LOG_BITMASK,5190 +MAG_ENABLE,1 +MIN_GNDSPD_CM,0 +MIS_RESTART,0 +MIS_TOTAL,5 +MIXING_GAIN,0.5 +MNT_ANGMAX_PAN,4500 +MNT_ANGMAX_ROL,4500 +MNT_ANGMAX_TIL,4500 +MNT_ANGMIN_PAN,-4500 +MNT_ANGMIN_ROL,-4500 +MNT_ANGMIN_TIL,-4500 +MNT_CONTROL_X,0.0 +MNT_CONTROL_Y,0.0 +MNT_CONTROL_Z,0.0 +MNT_JSTICK_SPD,0 +MNT_MODE,0 +MNT_NEUTRAL_X,0.0 +MNT_NEUTRAL_Y,0.0 +MNT_NEUTRAL_Z,0.0 +MNT_RC_IN_PAN,0 +MNT_RC_IN_ROLL,0 +MNT_RC_IN_TILT,0 +MNT_RETRACT_X,0.0 +MNT_RETRACT_Y,0.0 +MNT_RETRACT_Z,0.0 +MNT_STAB_PAN,0 +MNT_STAB_ROLL,0 +MNT_STAB_TILT,0 +NAVL1_DAMPING,0.75 +NAVL1_PERIOD,25.0 +NAV_CONTROLLER,1 +PTCH2SRV_D,0.12879998981952667 +PTCH2SRV_I,0.14000000059604645 +PTCH2SRV_IMAX,3500 +PTCH2SRV_P,1.8399999141693115 +PTCH2SRV_RLL,1.2000000476837158 +PTCH2SRV_RMAX_DN,60 +PTCH2SRV_RMAX_UP,60 +PTCH2SRV_TCONST,0.5 +RALLY_LIMIT_KM,1.0 +RALLY_TOTAL,1 +RC10_DZ,0 +RC10_FUNCTION,0 +RC10_MAX,1900 +RC10_MIN,1100 +RC10_REV,1 +RC10_TRIM,1500 +RC11_DZ,0 +RC11_FUNCTION,0 +RC11_MAX,1900 +RC11_MIN,1100 +RC11_REV,1 +RC11_TRIM,1500 +RC1_DZ,30 +RC1_MAX,2017 +RC1_MIN,992 +RC1_REV,-1 +RC1_TRIM,1495 +RC2_DZ,30 +RC2_MAX,2017 +RC2_MIN,992 +RC2_REV,-1 +RC2_TRIM,1502 +RC3_DZ,30 +RC3_MAX,2017 +RC3_MIN,992 +RC3_REV,1 +RC3_TRIM,1003 +RC4_DZ,30 +RC4_MAX,2017 +RC4_MIN,992 +RC4_REV,-1 +RC4_TRIM,1509 +RC5_DZ,0 +RC5_FUNCTION,0 +RC5_MAX,1966 +RC5_MIN,1100 +RC5_REV,1 +RC5_TRIM,1966 +RC6_DZ,0 +RC6_FUNCTION,0 +RC6_MAX,2017 +RC6_MIN,992 +RC6_REV,1 +RC6_TRIM,1495 +RC7_DZ,0 +RC7_FUNCTION,2 +RC7_MAX,1660 +RC7_MIN,1146 +RC7_REV,-1 +RC7_TRIM,1659 +RC8_DZ,0 +RC8_FUNCTION,2 +RC8_MAX,1828 +RC8_MIN,1237 +RC8_REV,1 +RC8_TRIM,1238 +RCMAP_PITCH,2 +RCMAP_ROLL,1 +RCMAP_THROTTLE,3 +RCMAP_YAW,4 +RELAY_DEFAULT,0 +RELAY_PIN,13 +RELAY_PIN2,-1 +RELAY_PIN3,-1 +RELAY_PIN4,-1 +RLL2SRV_D,0.03320127725601196 +RLL2SRV_I,0.031118083745241165 +RLL2SRV_IMAX,4000 +RLL2SRV_P,0.4743039608001709 +RLL2SRV_RMAX,60 +RLL2SRV_TCONST,0.5 +RNGFND2_FUNCTION,0 +RNGFND2_MAX_CM,700 +RNGFND2_MIN_CM,20 +RNGFND2_OFFSET,0.0 +RNGFND2_PIN,-1 +RNGFND2_RMETRIC,1 +RNGFND2_SCALING,3.0 +RNGFND2_SETTLE_M,0 +RNGFND2_STOP_PIN,-1 +RNGFND2_TYPE,0 +RNGFND_FUNCTION,0 +RNGFND_LANDING,0 +RNGFND_MAX_CM,700 +RNGFND_MIN_CM,20 +RNGFND_OFFSET,0.0 +RNGFND_PIN,-1 +RNGFND_RMETRIC,1 +RNGFND_SCALING,3.0 +RNGFND_SETTLE_MS,0 +RNGFND_STOP_PIN,-1 +RNGFND_TYPE,0 +RSSI_PIN,1 +RSSI_RANGE,3.299999952316284 +RST_MISSION_CH,0 +RST_SWITCH_CH,0 +SCALING_SPEED,15.0 +SCHED_DEBUG,0 +SERIAL0_BAUD,115 +SERIAL1_BAUD,57 +SKIP_GYRO_CAL,0 +SR0_EXTRA1,10 +SR0_EXTRA2,10 +SR0_EXTRA3,2 +SR0_EXT_STAT,2 +SR0_PARAMS,10 +SR0_POSITION,3 +SR0_RAW_CTRL,2 +SR0_RAW_SENS,2 +SR0_RC_CHAN,2 +SR1_EXTRA1,2 +SR1_EXTRA2,2 +SR1_EXTRA3,2 +SR1_EXT_STAT,2 +SR1_PARAMS,10 +SR1_POSITION,2 +SR1_RAW_CTRL,2 +SR1_RAW_SENS,2 +SR1_RC_CHAN,2 +STAB_PITCH_DOWN,2.0 +STEER2SRV_D,0.004999999888241291 +STEER2SRV_I,0.20000000298023224 +STEER2SRV_IMAX,1500 +STEER2SRV_MINSPD,1.0 +STEER2SRV_P,1.7999999523162842 +STEER2SRV_TCONST,0.75 +STICK_MIXING,1 +SYSID_MYGCS,255 +SYSID_SW_TYPE,0 +SYSID_THISMAV,1 +SYS_NUM_RESETS,117 +TECS_CLMB_MAX,5.0 +TECS_HGT_OMEGA,3.0 +TECS_INTEG_GAIN,0.10000000149011612 +TECS_LAND_ARSPD,-1.0 +TECS_LAND_SINK,0.25 +TECS_LAND_SPDWGT,1.0 +TECS_LAND_TCONST,2.0 +TECS_LAND_THR,-1.0 +TECS_PITCH_MAX,0 +TECS_PITCH_MIN,0 +TECS_PTCH_DAMP,0.0 +TECS_RLL2THR,10.0 +TECS_SINK_MAX,5.0 +TECS_SINK_MIN,2.0 +TECS_SPDWEIGHT,1.0 +TECS_SPD_OMEGA,2.0 +TECS_THR_DAMP,0.5 +TECS_TIME_CONST,5.0 +TECS_VERT_ACC,7.0 +TELEM_DELAY,0 +THROTTLE_NUDGE,1 +THR_FAILSAFE,1 +THR_FS_VALUE,995 +THR_MAX,80 +THR_MIN,0 +THR_PASS_STAB,0 +THR_SLEWRATE,60 +THR_SUPP_MAN,0 +TKOFF_FLAP_PCNT,0 +TKOFF_ROTATE_SPD,0.0 +TKOFF_TDRAG_ELEV,0 +TKOFF_TDRAG_SPD1,0.0 +TKOFF_THR_DELAY,1 +TKOFF_THR_MAX,100 +TKOFF_THR_MINACC,3.0 +TKOFF_THR_MINSPD,1.0 +TKOFF_THR_SLEW,0 +TRIM_ARSPD_CM,1500 +TRIM_AUTO,0 +TRIM_PITCH_CD,0 +TRIM_THROTTLE,60 +VTAIL_OUTPUT,0 +WP_LOITER_RAD,60 +WP_MAX_RADIUS,50 +WP_RADIUS,46 +YAW2SRV_DAMP,0.0 +YAW2SRV_IMAX,1500 +YAW2SRV_INT,0.0 +YAW2SRV_RLL,1.0 +YAW2SRV_SLIP,0.0