浅谈APM系列-----stats_update

本文介绍了ArduPilot中飞行统计模块的工作原理,包括飞行时间和上电时间的统计更新逻辑,以及如何定期保存这些统计数据。通过定时任务调度,确保了飞行数据的准确记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SCHED_TASK(stats_update, 1, 100)


位置:X:\ardupilot\ArduCopter\ArduCopter.cpp

/*
  update AP_Stats
 */
void Copter::stats_update(void)
{
    g2.stats.update();
}

位置:X:\ardupilot\libraries\AP_Stats\AP_Stats.cpp

void AP_Stats::update()
{
    const uint32_t now_ms = AP_HAL::millis();
    if (now_ms -  last_flush_ms > flush_interval_ms) {//30000,等半分钟以上,执行一次
        update_flighttime();//统计飞行时间
        update_runtime();//统计上电时间
        flush();//保存时间
        last_flush_ms = now_ms;
    }

    const uint32_t params_reset = params.reset;
    if (params_reset != reset || params_reset == 0) {//重置参数
        params.bootcount.set_and_save(params_reset == 0 ? 1 : 0);
        params.flttime.set_and_save(0);//时间清零
        params.runtime.set_and_save(0);
        uint32_t system_clock = hal.util->get_system_clock_ms() / 1000;
        // can't store Unix seconds in a 32-bit float.  Change the
        // time base to Jan 1st 2016:
        system_clock -= 1451606400;
        params.reset.set_and_save(system_clock);
        copy_variables_from_parameters();//清零本地变量
    }
}

位置:X:\ardupilot\libraries\AP_Stats\AP_Stats.cpp

void AP_Stats::update_flighttime()//飞行时间积分
{
    if (_flying_ms) {
        const uint32_t now = AP_HAL::millis();
        const uint32_t delta = (now - _flying_ms)/1000;//s
        flttime += delta;//seconds in flight (or driving)
        _flying_ms += delta*1000;//ms
    }
}

位置:X:\ardupilot\libraries\AP_Stats\AP_Stats.cpp

void AP_Stats::update_runtime()
{
    const uint32_t now = AP_HAL::millis();
    const uint32_t delta = (now - _last_runtime_ms)/1000;
    runtime += delta;
    _last_runtime_ms += delta*1000;
}

位置:X:\ardupilot\libraries\AP_Stats\AP_Stats.cpp

void AP_Stats::flush()
{
    params.flttime.set_and_save(flttime);
    params.runtime.set_and_save(runtime);
}

位置:X:\ardupilot\libraries\AP_HAL\Util.cpp

uint64_t AP_HAL::Util::get_system_clock_ms() const
{
#if defined(__APPLE__) && defined(__MACH__)
    struct timeval ts;
    gettimeofday(&ts, nullptr);
    return ((long long)((ts.tv_sec * 1000) + (ts.tv_usec / 1000)));
#elif CONFIG_HAL_BOARD == HAL_BOARD_CHIBIOS
    return ST2MS(chVTGetSystemTime());
#else
    struct timespec ts;
    clock_gettime(CLOCK_REALTIME, &ts);//0
    const uint64_t seconds = ts.tv_sec;
    const uint64_t nanoseconds = ts.tv_nsec;
    return (seconds * 1000ULL + nanoseconds/1000000ULL);
#endif
}

位置:X:\ardupilot\libraries\AP_Stats\AP_Stats.cpp

void AP_Stats::copy_variables_from_parameters()
{
    flttime = params.flttime;
    runtime = params.runtime;
    reset = params.reset;
}

这个比较简单,不需要分析,看看就懂了。

下一个。。。。。

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值