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
150 lines
4.8 KiB
9 years ago
|
/****************************************************************************
|
||
|
*
|
||
|
* 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;
|
||
|
}
|