mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-11-02 03:11:35 +08:00
gpssim: add possibility to change parameters
fix_type, satellites_used and a noise parameter can now be set manually for testing purposes
This commit is contained in:
committed by
Beat Küng
parent
b41c471090
commit
8541555e13
@@ -49,6 +49,7 @@
|
|||||||
#include <poll.h>
|
#include <poll.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <random>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
@@ -86,13 +87,16 @@ public:
|
|||||||
class GPSSIM : public VirtDevObj
|
class GPSSIM : public VirtDevObj
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
GPSSIM(const char *uart_path, bool fake_gps, bool enable_sat_info);
|
GPSSIM(const char *uart_path, bool fake_gps, bool enable_sat_info,
|
||||||
|
int fix_type, int num_sat, int noise_multiplier);
|
||||||
virtual ~GPSSIM();
|
virtual ~GPSSIM();
|
||||||
|
|
||||||
virtual int init();
|
virtual int init();
|
||||||
|
|
||||||
virtual int devIOCTL(unsigned long cmd, unsigned long arg);
|
virtual int devIOCTL(unsigned long cmd, unsigned long arg);
|
||||||
|
|
||||||
|
void set(int fix_type, int num_sat, int noise_multiplier);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Diagnostics - print some basic information about the driver.
|
* Diagnostics - print some basic information about the driver.
|
||||||
*/
|
*/
|
||||||
@@ -120,6 +124,11 @@ private:
|
|||||||
float _rate; ///< position update rate
|
float _rate; ///< position update rate
|
||||||
bool _fake_gps; ///< fake gps output
|
bool _fake_gps; ///< fake gps output
|
||||||
SyncObj _sync;
|
SyncObj _sync;
|
||||||
|
int _fix_type;
|
||||||
|
int _num_sat;
|
||||||
|
int _noise_multiplier;
|
||||||
|
|
||||||
|
std::default_random_engine _gen;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Try to configure the GPS, handle outgoing communication to the GPS
|
* Try to configure the GPS, handle outgoing communication to the GPS
|
||||||
@@ -164,7 +173,8 @@ GPSSIM *g_dev = nullptr;
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
GPSSIM::GPSSIM(const char *uart_path, bool fake_gps, bool enable_sat_info) :
|
GPSSIM::GPSSIM(const char *uart_path, bool fake_gps, bool enable_sat_info,
|
||||||
|
int fix_type, int num_sat, int noise_multiplier) :
|
||||||
VirtDevObj("gps", GPSSIM_DEVICE_PATH, nullptr, 1e6 / 10),
|
VirtDevObj("gps", GPSSIM_DEVICE_PATH, nullptr, 1e6 / 10),
|
||||||
_task_should_exit(false),
|
_task_should_exit(false),
|
||||||
//_healthy(false),
|
//_healthy(false),
|
||||||
@@ -176,7 +186,10 @@ GPSSIM::GPSSIM(const char *uart_path, bool fake_gps, bool enable_sat_info) :
|
|||||||
_p_report_sat_info(nullptr),
|
_p_report_sat_info(nullptr),
|
||||||
_report_sat_info_pub(nullptr),
|
_report_sat_info_pub(nullptr),
|
||||||
_rate(0.0f),
|
_rate(0.0f),
|
||||||
_fake_gps(fake_gps)
|
_fake_gps(fake_gps),
|
||||||
|
_fix_type(fix_type),
|
||||||
|
_num_sat(num_sat),
|
||||||
|
_noise_multiplier(noise_multiplier)
|
||||||
{
|
{
|
||||||
// /* store port name */
|
// /* store port name */
|
||||||
// strncpy(_port, uart_path, sizeof(_port));
|
// strncpy(_port, uart_path, sizeof(_port));
|
||||||
@@ -295,6 +308,14 @@ GPSSIM::receive(int timeout)
|
|||||||
|
|
||||||
timestamp_last = gps.timestamp;
|
timestamp_last = gps.timestamp;
|
||||||
|
|
||||||
|
// check for data set by the user
|
||||||
|
_report_gps_pos.fix_type = (_fix_type < 0) ? _report_gps_pos.fix_type : _fix_type;
|
||||||
|
_report_gps_pos.satellites_used = (_num_sat < 0) ? _report_gps_pos.satellites_used : _num_sat;
|
||||||
|
// use normal distribution for noise
|
||||||
|
std::normal_distribution<float> normal_distribution(0.0f, 1.0f);
|
||||||
|
_report_gps_pos.lat += (int32_t)(_noise_multiplier * normal_distribution(_gen));
|
||||||
|
_report_gps_pos.lon += (int32_t)(_noise_multiplier * normal_distribution(_gen));
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@@ -432,6 +453,15 @@ GPSSIM::print_info()
|
|||||||
usleep(100000);
|
usleep(100000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
GPSSIM::set(int fix_type, int num_sat, int noise_multiplier)
|
||||||
|
{
|
||||||
|
_fix_type = fix_type;
|
||||||
|
_num_sat = num_sat;
|
||||||
|
_noise_multiplier = noise_multiplier;
|
||||||
|
PX4_INFO("Parameters set");
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Local functions in support of the shell command.
|
* Local functions in support of the shell command.
|
||||||
*/
|
*/
|
||||||
@@ -440,7 +470,8 @@ namespace gpssim
|
|||||||
|
|
||||||
GPSSIM *g_dev = nullptr;
|
GPSSIM *g_dev = nullptr;
|
||||||
|
|
||||||
void start(const char *uart_path, bool fake_gps, bool enable_sat_info);
|
void start(const char *uart_path, bool fake_gps, bool enable_sat_info,
|
||||||
|
int fix_type, int num_sat, int noise_multiplier);
|
||||||
void stop();
|
void stop();
|
||||||
void test();
|
void test();
|
||||||
void reset();
|
void reset();
|
||||||
@@ -451,12 +482,12 @@ void usage(const char *reason);
|
|||||||
* Start the driver.
|
* Start the driver.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
start(const char *uart_path, bool fake_gps, bool enable_sat_info)
|
start(const char *uart_path, bool fake_gps, bool enable_sat_info, int fix_type, int num_sat, int noise_multiplier)
|
||||||
{
|
{
|
||||||
DevHandle h;
|
DevHandle h;
|
||||||
|
|
||||||
/* create the driver */
|
/* create the driver */
|
||||||
g_dev = new GPSSIM(uart_path, fake_gps, enable_sat_info);
|
g_dev = new GPSSIM(uart_path, fake_gps, enable_sat_info, fix_type, num_sat, noise_multiplier);
|
||||||
|
|
||||||
if (g_dev == nullptr) {
|
if (g_dev == nullptr) {
|
||||||
goto fail;
|
goto fail;
|
||||||
@@ -547,8 +578,9 @@ usage(const char *reason)
|
|||||||
}
|
}
|
||||||
|
|
||||||
PX4_INFO("usage:");
|
PX4_INFO("usage:");
|
||||||
PX4_INFO("gpssim {start|stop|test|reset|status}");
|
PX4_INFO("gpssim {start|stop|test|reset|status|set}");
|
||||||
PX4_INFO(" [-d /dev/ttyS0-n][-f (for enabling fake)][-s (to enable sat info)]");
|
PX4_INFO(" [-d /dev/ttyS0-n][-f (for enabling fake)][-s (to enable sat info)]");
|
||||||
|
PX4_INFO(" [-t # (for setting fix_type)][-n # (for setting # satellites)][-m # (for setting noise multiplier [scalar] for normal distribution)]");
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
@@ -562,13 +594,16 @@ gpssim_main(int argc, char *argv[])
|
|||||||
const char *device_name = GPS_DEFAULT_UART_PORT;
|
const char *device_name = GPS_DEFAULT_UART_PORT;
|
||||||
bool fake_gps = false;
|
bool fake_gps = false;
|
||||||
bool enable_sat_info = false;
|
bool enable_sat_info = false;
|
||||||
|
int fix_type = -1;
|
||||||
|
int num_sat = -1;
|
||||||
|
int noise_multiplier = 0;
|
||||||
|
|
||||||
// check for optional arguments
|
// check for optional arguments
|
||||||
int ch;
|
int ch;
|
||||||
int myoptind = 1;
|
int myoptind = 1;
|
||||||
const char *myoptarg = nullptr;
|
const char *myoptarg = nullptr;
|
||||||
|
|
||||||
while ((ch = px4_getopt(argc, argv, "d:fs", &myoptind, &myoptarg)) != EOF) {
|
while ((ch = px4_getopt(argc, argv, "d:fst:n:m:", &myoptind, &myoptarg)) != EOF) {
|
||||||
switch (ch) {
|
switch (ch) {
|
||||||
case 'd':
|
case 'd':
|
||||||
device_name = myoptarg;
|
device_name = myoptarg;
|
||||||
@@ -585,6 +620,21 @@ gpssim_main(int argc, char *argv[])
|
|||||||
PX4_INFO("Satellite info enabled");
|
PX4_INFO("Satellite info enabled");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 't':
|
||||||
|
fix_type = atoi(myoptarg);
|
||||||
|
PX4_INFO("Setting fix_type to %d", fix_type);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'n':
|
||||||
|
num_sat = atoi(myoptarg);
|
||||||
|
PX4_INFO("Setting number of satellites to %d", num_sat);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'm':
|
||||||
|
noise_multiplier = atoi(myoptarg);
|
||||||
|
PX4_INFO("Setting noise multiplier to %d", noise_multiplier);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
PX4_WARN("Unknown option!");
|
PX4_WARN("Unknown option!");
|
||||||
}
|
}
|
||||||
@@ -604,7 +654,7 @@ gpssim_main(int argc, char *argv[])
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
gpssim::start(device_name, fake_gps, enable_sat_info);
|
gpssim::start(device_name, fake_gps, enable_sat_info, fix_type, num_sat, noise_multiplier);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -639,5 +689,12 @@ gpssim_main(int argc, char *argv[])
|
|||||||
gpssim::info();
|
gpssim::info();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set parameters
|
||||||
|
*/
|
||||||
|
if (!strcmp(argv[myoptind], "set")) {
|
||||||
|
g_dev->set(fix_type, num_sat, noise_multiplier);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user