You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

150 lines
4.8 KiB

/****************************************************************************
*
* Copyright (C) 2012 PX4 Development Team. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name PX4 nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
/**
* @file base.cpp
*
* Tests for the estimator base class
*/
#include <cstdio>
#include <random>
#include "../../estimator_base.h"
extern "C" __EXPORT int base_main(int argc, char *argv[]);
int base_main(int argc, char *argv[])
{
EstimatorBase *base = new EstimatorBase();
// Test1: feed in fake imu data and check if delta angles are summed correclty
float delta_vel[3] = { 0.002f, 0.002f, 0.002f};
float delta_ang[3] = { -0.1f, 0.2f, 0.3f};
uint32_t time_usec = 1000;
// simulate 400 Hz imu rate, filter should downsample to 100Hz
// feed in 2 seconds of data
for (int i = 0; i < 800; i++) {
base->setIMUData(time_usec, 2500, 2500, delta_ang, delta_vel);
time_usec += 2500;
}
//base->printStoredIMU();
// Test2: feed fake imu data and check average imu delta t
// simulate 400 Hz imu rate, filter should downsample to 100Hz
// feed in 2 seconds of data
for (int i = 0; i < 800; i++) {
base->setIMUData(time_usec, 2500, 2500, delta_ang, delta_vel);
//base->print_imu_avg_time();
time_usec += 2500;
}
// Test3: feed in slow imu data, filter should now take every sample
for (int i = 0; i < 800; i++) {
base->setIMUData(time_usec, 2500, 2500, delta_ang, delta_vel);
time_usec += 30000;
}
//base->printStoredIMU();
// Test4: Feed in mag data at 50 Hz (too fast), check if filter samples correctly
float mag[3] = {0.2f, 0.0f, 0.4f};
for (int i = 0; i < 100; i++) {
base->setMagData(time_usec, mag);
time_usec += 20000;
}
//base->printStoredMag();
// Test5: Feed in baro data at 50 Hz (too fast), check if filter samples correctly
float baro = 120.22f;;
time_usec = 100000;
for (int i = 0; i < 100; i++) {
base->setBaroData(time_usec, &baro);
baro += 10.0f;
time_usec += 20000;
}
//base->printStoredBaro();
// Test 5: Run everything rogether in one run
std::default_random_engine generator;
std::uniform_int_distribution<int> distribution(-200, 200);
int imu_sample_period = 2500;
uint64_t timer = 2000; // simulation start time
uint64_t timer_last = timer;
float airspeed = 0.0f;
struct gps_message gps = {};
gps.lat = 40 * 1e7; // Latitude in 1E-7 degrees
gps.lon = 5 * 1e7; // Longitude in 1E-7 degrees
gps.alt = 200 * 1e3; // Altitude in 1E-3 meters (millimeters) above MSL
gps.fix_type = 4; // 0-1: no fix, 2: 2D fix, 3: 3D fix, 4: RTCM code differential, 5: Real-Time
gps.eph = 5.0f; // GPS HDOP horizontal dilution of position in m
gps.epv = 5.0f; // GPS VDOP horizontal dilution of position in m
gps.vel_ned_valid = true; // GPS ground speed is valid
// simulate two seconds
for (int i = 0; i < 800; i++) {
timer += (imu_sample_period + distribution(generator));
if ((timer - timer_last) > 70000) {
base->setAirspeedData(timer, &airspeed);
}
gps.time_usec = timer;
gps.time_usec_vel = timer;
base->setIMUData(timer, timer - timer_last, timer - timer_last, delta_ang, delta_vel);
base->setMagData(timer, mag);
base->setBaroData(timer, &baro);
base->setGpsData(timer, &gps);
base->print_imu_avg_time();
timer_last = timer;
}
base->printStoredIMU();
base->printStoredBaro();
base->printStoredMag();
base->printStoredGps();
return 0;
}