main
IMU_TOPIC = ros_utils::readParam< std::string >( n, "imu_topic" );
获取launch文件中的参数信息
回调函数
gyr_y->pushRadPerSec( imu_msg->angular_velocity.y, time );
//函数定义
void
imu::AllanGyr::pushRadPerSec( double data, double time )
{
m_rawData.push_back( GyrData( data * 57.3 * 3600, time ) );
numData++;
}
将获取到的数据和时间成对存储并进行单位的转换(x57.3x3600)
if ( start )
{
start_t = time;
start = false;
}
else
{
double time_min = ( time - start_t ) / 60;
if ( time_min > max_time_min )
end = true;
}
控制回调函数的运行次数,当获取到的时间和开始时间之间的差值比规定的时间大跳出循环。
yaml文件写入(Allan曲线)
1.writeyaml
2.fit_acc_x(acc_v_x,acc_ts_x,acc_x->getFreq())
3.acc_ts_x=acc_x->getTimes();
4.getAvgPeriod()返回值为getAvgDt(),函数目的是每相邻两个数据的时间差之和的平均值(暂时不了解?)-----采样时间间隔
class AllanAcc
{
public:
AllanAcc( std::string name, int maxCluster = 10000 );
~AllanAcc( );
//三种不同单位的数据形式
void pushRadPerSec( double data, double time );
void pushDegreePerSec( double data, double time );
void pushMPerSec2( double data, double time );
void calc( );
std::vector< double > getVariance( ) const;
std::vector< double > getDeviation( );
std::vector< double > getTimes( );
std::vector< int > getFactors( ) const;
double getFreq( ) const;
private:
std::vector< double > calcVariance( double period );
std::vector< double > calcThetas( const double freq );
void initStrides( );
std::vector< double > getLogSpace( float a, float b );
double getAvgFreq( ) { return 1.0 / getAvgDt( ); }//采样频率
double getAvgDt( );//采样时间
double getAvgPeriod( ) { return getAvgDt( ); }//功能相同函数名不同???
int getFactorsNum( ) { return numFactors; }
std::string m_name;
double m_freq;
int numData;
std::vector< AccData > m_rawData;
std::vector< double > m_thetas;
int numCluster;
int numFactors;
std::vector< int > mFactors;
std::vector< double > mVariance;
};
Allan方差计算方法
allan方差的定义
设光学陀螺的漂移数据的样本长度为N,采样周期为T。将样本分为K组,每组含m个样本点,则每组的相关时间
τ
=
m
T
\tau = mT
τ=mT
查找了许多的资料之后,我感觉下面的定义说的要更明确一些