mirror of
https://github.com/ArduPilot/ardupilot
synced 2025-01-18 06:38:29 -04:00
Replay: added parameter handling
use parameters from log, and allow override
This commit is contained in:
parent
853271dd37
commit
3218ac8e7a
@ -193,6 +193,32 @@ void LogReader::process_copter(uint8_t type, uint8_t *data, uint16_t length)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool LogReader::set_parameter(const char *name, float value)
|
||||||
|
{
|
||||||
|
enum ap_var_type var_type;
|
||||||
|
AP_Param *vp = AP_Param::find(name, &var_type);
|
||||||
|
if (vp == NULL) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (var_type == AP_PARAM_FLOAT) {
|
||||||
|
((AP_Float *)vp)->set(value);
|
||||||
|
::printf("Set %s to %f\n", name, value);
|
||||||
|
} else if (var_type == AP_PARAM_INT32) {
|
||||||
|
((AP_Int32 *)vp)->set(value);
|
||||||
|
::printf("Set %s to %d\n", name, (int)value);
|
||||||
|
} else if (var_type == AP_PARAM_INT16) {
|
||||||
|
((AP_Int16 *)vp)->set(value);
|
||||||
|
::printf("Set %s to %d\n", name, (int)value);
|
||||||
|
} else if (var_type == AP_PARAM_INT8) {
|
||||||
|
((AP_Int8 *)vp)->set(value);
|
||||||
|
::printf("Set %s to %d\n", name, (int)value);
|
||||||
|
} else {
|
||||||
|
// we don't support mavlink set on this parameter
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool LogReader::update(uint8_t &type)
|
bool LogReader::update(uint8_t &type)
|
||||||
{
|
{
|
||||||
uint8_t hdr[3];
|
uint8_t hdr[3];
|
||||||
@ -325,6 +351,18 @@ bool LogReader::update(uint8_t &type)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case LOG_PARAMETER_MSG: {
|
||||||
|
struct log_Parameter msg;
|
||||||
|
if(sizeof(msg) != f.length) {
|
||||||
|
printf("Bad LOG_PARAMETER length\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
memcpy(&msg, data, sizeof(msg));
|
||||||
|
set_parameter(msg.name, msg.value);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
if (vehicle == VEHICLE_PLANE) {
|
if (vehicle == VEHICLE_PLANE) {
|
||||||
process_plane(f.type, data, f.length);
|
process_plane(f.type, data, f.length);
|
||||||
|
@ -29,6 +29,8 @@ public:
|
|||||||
|
|
||||||
vehicle_type vehicle;
|
vehicle_type vehicle;
|
||||||
|
|
||||||
|
bool set_parameter(const char *name, float value);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int fd;
|
int fd;
|
||||||
AP_InertialSensor &ins;
|
AP_InertialSensor &ins;
|
||||||
|
25
Tools/Replay/Parameters.h
Normal file
25
Tools/Replay/Parameters.h
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
// -*- tab-width: 4; Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*-
|
||||||
|
|
||||||
|
#ifndef PARAMETERS_H
|
||||||
|
#define PARAMETERS_H
|
||||||
|
|
||||||
|
#include <AP_Common.h>
|
||||||
|
|
||||||
|
// Global parameter class.
|
||||||
|
//
|
||||||
|
class Parameters {
|
||||||
|
public:
|
||||||
|
enum {
|
||||||
|
k_param_dummy,
|
||||||
|
k_param_barometer,
|
||||||
|
k_param_ins,
|
||||||
|
k_param_ahrs,
|
||||||
|
k_param_airspeed,
|
||||||
|
k_param_NavEKF
|
||||||
|
};
|
||||||
|
AP_Int8 dummy;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern const AP_Param::Info var_info[];
|
||||||
|
|
||||||
|
#endif // PARAMETERS_H
|
45
Tools/Replay/Parameters.pde
Normal file
45
Tools/Replay/Parameters.pde
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
/// -*- tab-width: 4; Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*-
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Replay parameter definitions
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define GSCALAR(v, name, def) { g.v.vtype, name, Parameters::k_param_ ## v, &g.v, {def_value : def} }
|
||||||
|
#define GOBJECT(v, name, class) { AP_PARAM_GROUP, name, Parameters::k_param_ ## v, &v, {group_info : class::var_info} }
|
||||||
|
#define GOBJECTN(v, pname, name, class) { AP_PARAM_GROUP, name, Parameters::k_param_ ## pname, &v, {group_info : class::var_info} }
|
||||||
|
|
||||||
|
const AP_Param::Info var_info[] PROGMEM = {
|
||||||
|
GSCALAR(dummy, "_DUMMY", 0),
|
||||||
|
|
||||||
|
// 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: INS_
|
||||||
|
// @Path: ../libraries/AP_InertialSensor/AP_InertialSensor.cpp
|
||||||
|
GOBJECT(ins, "INS_", AP_InertialSensor),
|
||||||
|
|
||||||
|
// @Group: AHRS_
|
||||||
|
// @Path: ../libraries/AP_AHRS/AP_AHRS.cpp
|
||||||
|
GOBJECT(ahrs, "AHRS_", AP_AHRS),
|
||||||
|
|
||||||
|
// @Group: ARSPD_
|
||||||
|
// @Path: ../libraries/AP_Airspeed/AP_Airspeed.cpp
|
||||||
|
GOBJECT(airspeed, "ARSPD_", AP_Airspeed),
|
||||||
|
|
||||||
|
// @Group: EKF_
|
||||||
|
// @Path: ../libraries/AP_NavEKF/AP_NavEKF.cpp
|
||||||
|
GOBJECTN(ahrs.get_NavEKF(), NavEKF, "EKF_", NavEKF),
|
||||||
|
|
||||||
|
AP_VAREND
|
||||||
|
};
|
||||||
|
|
||||||
|
static void load_parameters(void)
|
||||||
|
{
|
||||||
|
if (!AP_Param::check_var_info()) {
|
||||||
|
hal.scheduler->panic(PSTR("Bad parameter table"));
|
||||||
|
}
|
||||||
|
}
|
@ -42,6 +42,7 @@
|
|||||||
#include <AP_InertialSensor.h>
|
#include <AP_InertialSensor.h>
|
||||||
#include <AP_InertialNav.h>
|
#include <AP_InertialNav.h>
|
||||||
#include <AP_NavEKF.h>
|
#include <AP_NavEKF.h>
|
||||||
|
#include <Parameters.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
@ -50,6 +51,10 @@
|
|||||||
|
|
||||||
const AP_HAL::HAL& hal = AP_HAL_BOARD_DRIVER;
|
const AP_HAL::HAL& hal = AP_HAL_BOARD_DRIVER;
|
||||||
|
|
||||||
|
AP_Param param_loader(var_info, 4096);
|
||||||
|
|
||||||
|
static Parameters g;
|
||||||
|
|
||||||
static AP_InertialSensor_HIL ins;
|
static AP_InertialSensor_HIL ins;
|
||||||
static AP_Baro_HIL barometer;
|
static AP_Baro_HIL barometer;
|
||||||
static AP_GPS_HIL gps_driver;
|
static AP_GPS_HIL gps_driver;
|
||||||
@ -76,10 +81,25 @@ static FILE *ekf2f;
|
|||||||
static FILE *ekf3f;
|
static FILE *ekf3f;
|
||||||
static FILE *ekf4f;
|
static FILE *ekf4f;
|
||||||
|
|
||||||
|
static bool done_parameters;
|
||||||
static bool done_baro_init;
|
static bool done_baro_init;
|
||||||
static bool done_home_init;
|
static bool done_home_init;
|
||||||
static uint16_t update_rate;
|
static uint16_t update_rate;
|
||||||
|
|
||||||
|
static uint8_t num_user_parameters;
|
||||||
|
static struct {
|
||||||
|
char name[17];
|
||||||
|
float value;
|
||||||
|
} user_parameters[100];
|
||||||
|
|
||||||
|
|
||||||
|
static void usage(void)
|
||||||
|
{
|
||||||
|
::printf("Options:\n");
|
||||||
|
::printf(" -rRATE set IMU rate in Hz\n");
|
||||||
|
::printf(" -pNAME=VALUE set parameter NAME to VALUE\n");
|
||||||
|
}
|
||||||
|
|
||||||
void setup()
|
void setup()
|
||||||
{
|
{
|
||||||
::printf("Starting\n");
|
::printf("Starting\n");
|
||||||
@ -91,11 +111,30 @@ void setup()
|
|||||||
|
|
||||||
hal.util->commandline_arguments(argc, argv);
|
hal.util->commandline_arguments(argc, argv);
|
||||||
|
|
||||||
while ((opt = getopt(argc, argv, "r:")) != -1) {
|
while ((opt = getopt(argc, argv, "r:p:h")) != -1) {
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
|
case 'h':
|
||||||
|
usage();
|
||||||
|
exit(0);
|
||||||
case 'r':
|
case 'r':
|
||||||
update_rate = strtol(optarg, NULL, 0);
|
update_rate = strtol(optarg, NULL, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'p':
|
||||||
|
char *eq = strchr(optarg, '=');
|
||||||
|
if (eq == NULL) {
|
||||||
|
::printf("Usage: -p NAME=VALUE\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
*eq++ = 0;
|
||||||
|
strncpy(user_parameters[num_user_parameters].name, optarg, 16);
|
||||||
|
user_parameters[num_user_parameters].value = atof(eq);
|
||||||
|
num_user_parameters++;
|
||||||
|
if (num_user_parameters >= sizeof(user_parameters)/sizeof(user_parameters[0])) {
|
||||||
|
::printf("Too many user parameters\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -111,6 +150,8 @@ void setup()
|
|||||||
hal.console->printf("Using an update rate of %u Hz\n", update_rate);
|
hal.console->printf("Using an update rate of %u Hz\n", update_rate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
load_parameters();
|
||||||
|
|
||||||
if (!LogReader.open_log(filename)) {
|
if (!LogReader.open_log(filename)) {
|
||||||
perror(filename);
|
perror(filename);
|
||||||
exit(1);
|
exit(1);
|
||||||
@ -189,8 +230,26 @@ void setup()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
setup user -p parameters
|
||||||
|
*/
|
||||||
|
static void set_user_parameters(void)
|
||||||
|
{
|
||||||
|
for (uint8_t i=0; i<num_user_parameters; i++) {
|
||||||
|
if (!LogReader.set_parameter(user_parameters[i].name, user_parameters[i].value)) {
|
||||||
|
::printf("Failed to set parameter %s to %f\n", user_parameters[i].name, user_parameters[i].value);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void read_sensors(uint8_t type)
|
static void read_sensors(uint8_t type)
|
||||||
{
|
{
|
||||||
|
if (!done_parameters && type != LOG_FORMAT_MSG && type != LOG_PARAMETER_MSG) {
|
||||||
|
done_parameters = true;
|
||||||
|
set_user_parameters();
|
||||||
|
}
|
||||||
if (type == LOG_GPS_MSG) {
|
if (type == LOG_GPS_MSG) {
|
||||||
g_gps->update();
|
g_gps->update();
|
||||||
if (g_gps->status() >= GPS::GPS_OK_FIX_3D) {
|
if (g_gps->status() >= GPS::GPS_OK_FIX_3D) {
|
||||||
|
Loading…
Reference in New Issue
Block a user