Rover: fixed EKF usage for rover

added barometer object, and use shared home object from AHRS. This
gives basic EKF operation.
This commit is contained in:
Andrew Tridgell 2014-02-24 09:25:50 +11:00
parent 203073e3ba
commit eac4b1ec96
10 changed files with 54 additions and 12 deletions

View File

@ -406,7 +406,6 @@ static uint8_t ground_start_count = 5;
// on the ground or in the air. Used to decide if a ground start is appropriate if we // on the ground or in the air. Used to decide if a ground start is appropriate if we
// booted with an air start. // booted with an air start.
static int16_t ground_start_avg; static int16_t ground_start_avg;
static int32_t gps_base_alt;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// Location & Navigation // Location & Navigation
@ -510,7 +509,7 @@ static int16_t condition_rate;
// Location structure defined in AP_Common // Location structure defined in AP_Common
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// The home location used for RTL. The location is set when we first get stable GPS lock // The home location used for RTL. The location is set when we first get stable GPS lock
static struct Location home; static const struct Location &home = ahrs.get_home();
// Flag for if we have g_gps lock and have set the home location // Flag for if we have g_gps lock and have set the home location
static bool home_is_set; static bool home_is_set;
// The location of the previous waypoint. Used for track following and altitude ramp calculations // The location of the previous waypoint. Used for track following and altitude ramp calculations
@ -572,6 +571,7 @@ static const AP_Scheduler::Task scheduler_tasks[] PROGMEM = {
{ set_servos, 1, 1500 }, { set_servos, 1, 1500 },
{ update_GPS_50Hz, 1, 2500 }, { update_GPS_50Hz, 1, 2500 },
{ update_GPS_10Hz, 5, 2500 }, { update_GPS_10Hz, 5, 2500 },
{ update_alt, 5, 3400 },
{ navigate, 5, 1600 }, { navigate, 5, 1600 },
{ update_compass, 5, 2000 }, { update_compass, 5, 2000 },
{ update_commands, 5, 1000 }, { update_commands, 5, 1000 },
@ -684,6 +684,14 @@ static void mount_update(void)
#endif #endif
} }
static void update_alt()
{
barometer.read();
if (should_log(MASK_LOG_IMU)) {
Log_Write_Baro();
}
}
/* /*
check for GCS failsafe - 10Hz check for GCS failsafe - 10Hz
*/ */

View File

@ -519,6 +519,11 @@ static void Log_Write_RC(void)
DataFlash.Log_Write_RCOUT(); DataFlash.Log_Write_RCOUT();
} }
static void Log_Write_Baro(void)
{
DataFlash.Log_Write_Baro(barometer);
}
static const struct LogStructure log_structure[] PROGMEM = { static const struct LogStructure log_structure[] PROGMEM = {
LOG_COMMON_STRUCTURES, LOG_COMMON_STRUCTURES,
{ LOG_ATTITUDE_MSG, sizeof(log_Attitude), { LOG_ATTITUDE_MSG, sizeof(log_Attitude),

View File

@ -168,6 +168,7 @@ public:
k_param_rcmap, k_param_rcmap,
k_param_L1_controller, k_param_L1_controller,
k_param_steerController, k_param_steerController,
k_param_barometer,
// 254,255: reserved // 254,255: reserved
}; };

View File

@ -427,6 +427,12 @@ const AP_Param::Info var_info[] PROGMEM = {
// @Path: ../libraries/AP_Scheduler/AP_Scheduler.cpp // @Path: ../libraries/AP_Scheduler/AP_Scheduler.cpp
GOBJECT(scheduler, "SCHED_", AP_Scheduler), GOBJECT(scheduler, "SCHED_", AP_Scheduler),
// barometer ground calibration. The GND_ prefix is chosen for
// compatibility with previous releases of ArduPlane
// @Group: GND_
// @Path: ../libraries/AP_Baro/AP_Baro.cpp
GOBJECT(barometer, "GND_", AP_Baro),
// @Group: RELAY_ // @Group: RELAY_
// @Path: ../libraries/AP_Relay/AP_Relay.cpp // @Path: ../libraries/AP_Relay/AP_Relay.cpp
GOBJECT(relay, "RELAY_", AP_Relay), GOBJECT(relay, "RELAY_", AP_Relay),

View File

@ -151,12 +151,7 @@ void init_home()
gcs_send_text_P(SEVERITY_LOW, PSTR("init home")); gcs_send_text_P(SEVERITY_LOW, PSTR("init home"));
home.id = MAV_CMD_NAV_WAYPOINT; ahrs.set_home(g_gps->latitude, g_gps->longitude, g_gps->altitude_cm);
home.lng = g_gps->longitude; // Lon * 10**7
home.lat = g_gps->latitude; // Lat * 10**7
gps_base_alt = max(g_gps->altitude_cm, 0);
home.alt = g_gps->altitude_cm;
home_is_set = true; home_is_set = true;
// Save Home to EEPROM - Command 0 // Save Home to EEPROM - Command 0

View File

@ -360,10 +360,7 @@ static void do_set_home()
if(next_nonnav_command.p1 == 1 && have_position) { if(next_nonnav_command.p1 == 1 && have_position) {
init_home(); init_home();
} else { } else {
home.id = MAV_CMD_NAV_WAYPOINT; ahrs.set_home(next_nonnav_command.lat, next_nonnav_command.lng, next_nonnav_command.alt);
home.lng = next_nonnav_command.lng; // Lon * 10**7
home.lat = next_nonnav_command.lat; // Lat * 10**7
home.alt = max(next_nonnav_command.alt, 0);
home_is_set = true; home_is_set = true;
} }
} }

View File

@ -60,31 +60,42 @@
#if CONFIG_HAL_BOARD == HAL_BOARD_APM1 #if CONFIG_HAL_BOARD == HAL_BOARD_APM1
# define CONFIG_INS_TYPE CONFIG_INS_OILPAN # define CONFIG_INS_TYPE CONFIG_INS_OILPAN
# define CONFIG_COMPASS AP_COMPASS_HMC5843 # define CONFIG_COMPASS AP_COMPASS_HMC5843
# define CONFIG_BARO AP_BARO_BMP085
# define BATTERY_PIN_1 0 # define BATTERY_PIN_1 0
# define CURRENT_PIN_1 1 # define CURRENT_PIN_1 1
#elif CONFIG_HAL_BOARD == HAL_BOARD_APM2 #elif CONFIG_HAL_BOARD == HAL_BOARD_APM2
# define CONFIG_INS_TYPE CONFIG_INS_MPU6000 # define CONFIG_INS_TYPE CONFIG_INS_MPU6000
# define CONFIG_COMPASS AP_COMPASS_HMC5843 # define CONFIG_COMPASS AP_COMPASS_HMC5843
# ifdef APM2_BETA_HARDWARE
# define CONFIG_BARO AP_BARO_BMP085
# else // APM2 Production Hardware (default)
# define CONFIG_BARO AP_BARO_MS5611
# define CONFIG_MS5611_SERIAL AP_BARO_MS5611_SPI
# endif
# define BATTERY_PIN_1 1 # define BATTERY_PIN_1 1
# define CURRENT_PIN_1 2 # define CURRENT_PIN_1 2
#elif CONFIG_HAL_BOARD == HAL_BOARD_AVR_SITL #elif CONFIG_HAL_BOARD == HAL_BOARD_AVR_SITL
# define CONFIG_INS_TYPE CONFIG_INS_HIL # define CONFIG_INS_TYPE CONFIG_INS_HIL
# define CONFIG_COMPASS AP_COMPASS_HIL # define CONFIG_COMPASS AP_COMPASS_HIL
# define CONFIG_BARO AP_BARO_HIL
# define BATTERY_PIN_1 1 # define BATTERY_PIN_1 1
# define CURRENT_PIN_1 2 # define CURRENT_PIN_1 2
#elif CONFIG_HAL_BOARD == HAL_BOARD_PX4 #elif CONFIG_HAL_BOARD == HAL_BOARD_PX4
# define CONFIG_INS_TYPE CONFIG_INS_PX4 # define CONFIG_INS_TYPE CONFIG_INS_PX4
# define CONFIG_COMPASS AP_COMPASS_PX4 # define CONFIG_COMPASS AP_COMPASS_PX4
# define CONFIG_BARO AP_BARO_PX4
# define BATTERY_PIN_1 -1 # define BATTERY_PIN_1 -1
# define CURRENT_PIN_1 -1 # define CURRENT_PIN_1 -1
#elif CONFIG_HAL_BOARD == HAL_BOARD_FLYMAPLE #elif CONFIG_HAL_BOARD == HAL_BOARD_FLYMAPLE
# define CONFIG_INS_TYPE CONFIG_INS_FLYMAPLE # define CONFIG_INS_TYPE CONFIG_INS_FLYMAPLE
# define CONFIG_COMPASS AP_COMPASS_HMC5843 # define CONFIG_COMPASS AP_COMPASS_HMC5843
# define CONFIG_BARO AP_BARO_BMP085
# define BATTERY_PIN_1 20 # define BATTERY_PIN_1 20
# define CURRENT_PIN_1 19 # define CURRENT_PIN_1 19
#elif CONFIG_HAL_BOARD == HAL_BOARD_LINUX #elif CONFIG_HAL_BOARD == HAL_BOARD_LINUX
# define CONFIG_INS_TYPE CONFIG_INS_L3G4200D # define CONFIG_INS_TYPE CONFIG_INS_L3G4200D
# define CONFIG_COMPASS AP_COMPASS_HMC5843 # define CONFIG_COMPASS AP_COMPASS_HMC5843
# define CONFIG_BARO AP_BARO_BMP085
# define BATTERY_PIN_1 -1 # define BATTERY_PIN_1 -1
# define CURRENT_PIN_1 -1 # define CURRENT_PIN_1 -1
#endif #endif

View File

@ -173,6 +173,12 @@ enum mode {
#define CONFIG_INS_FLYMAPLE 5 #define CONFIG_INS_FLYMAPLE 5
#define CONFIG_INS_L3G4200D 6 #define CONFIG_INS_L3G4200D 6
// barometer driver types
#define AP_BARO_BMP085 1
#define AP_BARO_MS5611 2
#define AP_BARO_PX4 3
#define AP_BARO_HIL 4
// compass driver types // compass driver types
#define AP_COMPASS_HMC5843 1 #define AP_COMPASS_HMC5843 1
#define AP_COMPASS_PX4 2 #define AP_COMPASS_PX4 2

View File

@ -1,5 +1,12 @@
// -*- tab-width: 4; Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*- // -*- tab-width: 4; Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*-
static void init_barometer(void)
{
gcs_send_text_P(SEVERITY_LOW, PSTR("Calibrating barometer"));
barometer.calibrate();
gcs_send_text_P(SEVERITY_LOW, PSTR("barometer calibration complete"));
}
static void init_sonar(void) static void init_sonar(void)
{ {
#if CONFIG_HAL_BOARD == HAL_BOARD_APM1 #if CONFIG_HAL_BOARD == HAL_BOARD_APM1

View File

@ -117,6 +117,9 @@ static void init_ardupilot()
// used to detect in-flight resets // used to detect in-flight resets
g.num_resets.set_and_save(g.num_resets+1); g.num_resets.set_and_save(g.num_resets+1);
// init baro before we start the GCS, so that the CLI baro test works
barometer.init();
// init the GCS // init the GCS
gcs[0].init(hal.uartA); gcs[0].init(hal.uartA);
@ -174,6 +177,9 @@ static void init_ardupilot()
// initialise sonar // initialise sonar
init_sonar(); init_sonar();
// and baro for EKF
init_barometer();
// Do GPS init // Do GPS init
g_gps = &g_gps_driver; g_gps = &g_gps_driver;
// GPS initialisation // GPS initialisation