#ifndef __PACKET_H__ #define __PACKET_H__ /** * ログデータをGPS時刻ラベル付きで管理するための基底クラス * この単位をパケットと表現することにする * */ struct Packet{ float_sylph_t itow; /** * 異なるパケット間の時間間隔を計算する関数 * * @param another 異なるパケット */ float_sylph_t interval(const Packet &another) const { return another.itow - itow; } }; /** * AD変換データを管理するパケット * AD変換の生の値を処理し、実際の加速度や角速度に変換する * */ struct A_Packet : Packet { static Calibrator *calibrator; /** * AD変換結果がマッピングされる変数 * ch[0-7]はAD7739(24bit)の生の値 * ch[0-2]はそれぞれ加速度計X,Y,Z * ch[3-5]はそれぞれジャイロX,Y,Z * ch[7-8]は未使用 * ch[8]はC8051内蔵温度センサ(10bit)の生の値 */ int ch[9]; /** * 加速度の値をVector3形式で得る * 単位はm/s^2 */ Vector3 accel() const { return calibrator->raw2accel(ch); } /** * 角速度の値をVector3形式で得る * 単位はrad/sec */ Vector3 gyro() const { return calibrator->raw2gyro(ch); } }; Calibrator *(A_Packet::calibrator) = NULL; /** * GPS受信機より得られた位置、速度を管理するパケット * */ struct G_Packet : Packet { float_sylph_t llh[3]; float_sylph_t acc_2d, acc_v; float_sylph_t vel_ned[3]; float_sylph_t acc_vel; #ifdef __INS_GPS_H__ /** * INS/GPSが求める形式に変換する * */ GPS_UBLOX_3D convert() const{ GPS_UBLOX_3D packet; { packet.v_n = vel_ned[0]; packet.v_e = vel_ned[1]; packet.v_d = vel_ned[2]; packet.sigma_vel = acc_vel; packet.latitude = deg2rad(llh[0]); packet.longitude = deg2rad(llh[1]); packet.height = llh[2]; packet.sigma_2d = acc_2d; packet.sigma_height = acc_v; } return packet; } #endif }; #endif /*PACKET_H_*/