mirror of https://github.com/ArduPilot/ardupilot
AP_HAL_SITL: add and use AP_RCProtocol_UDP
This commit is contained in:
parent
4a996c81fb
commit
4005bce85c
|
@ -71,7 +71,6 @@ void SITL_State::_sitl_setup()
|
||||||
_parent_pid = getppid();
|
_parent_pid = getppid();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
_setup_fdm();
|
|
||||||
fprintf(stdout, "Starting SITL input\n");
|
fprintf(stdout, "Starting SITL input\n");
|
||||||
|
|
||||||
// find the barometer object if it exists
|
// find the barometer object if it exists
|
||||||
|
@ -101,6 +100,8 @@ void SITL_State::_sitl_setup()
|
||||||
|
|
||||||
fprintf(stdout, "Using Irlock at port : %d\n", _irlock_port);
|
fprintf(stdout, "Using Irlock at port : %d\n", _irlock_port);
|
||||||
_sitl->irlock_port = _irlock_port;
|
_sitl->irlock_port = _irlock_port;
|
||||||
|
|
||||||
|
_sitl->rcin_port = _rcin_port;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_synthetic_clock_mode) {
|
if (_synthetic_clock_mode) {
|
||||||
|
@ -110,38 +111,11 @@ void SITL_State::_sitl_setup()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
setup a SITL FDM listening UDP port
|
|
||||||
*/
|
|
||||||
bool SITL_State::_setup_fdm(void)
|
|
||||||
{
|
|
||||||
if (_rc_in_started) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (!_sitl_rc_in.reuseaddress()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!_sitl_rc_in.bind("0.0.0.0", _rcin_port)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!_sitl_rc_in.set_blocking(false)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!_sitl_rc_in.set_cloexec()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
_rc_in_started = true;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
step the FDM by one time step
|
step the FDM by one time step
|
||||||
*/
|
*/
|
||||||
void SITL_State::_fdm_input_step(void)
|
void SITL_State::_fdm_input_step(void)
|
||||||
{
|
{
|
||||||
static uint32_t last_pwm_input = 0;
|
|
||||||
|
|
||||||
_fdm_input_local();
|
_fdm_input_local();
|
||||||
|
|
||||||
/* make sure we die if our parent dies */
|
/* make sure we die if our parent dies */
|
||||||
|
@ -153,12 +127,6 @@ void SITL_State::_fdm_input_step(void)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// simulate RC input at 50Hz
|
|
||||||
if (AP_HAL::millis() - last_pwm_input >= 20 && _sitl != nullptr && _sitl->rc_fail != SITL::SIM::SITL_RCFail_NoPulses) {
|
|
||||||
last_pwm_input = AP_HAL::millis();
|
|
||||||
new_rc_input = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
_scheduler->sitl_begin_atomic();
|
_scheduler->sitl_begin_atomic();
|
||||||
|
|
||||||
if (_update_count == 0 && _sitl != nullptr) {
|
if (_update_count == 0 && _sitl != nullptr) {
|
||||||
|
@ -225,72 +193,6 @@ void SITL_State::wait_clock(uint64_t wait_time_usec)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
check for a SITL RC input packet
|
|
||||||
*/
|
|
||||||
void SITL_State::_check_rc_input(void)
|
|
||||||
{
|
|
||||||
uint32_t count = 0;
|
|
||||||
while (_read_rc_sitl_input()) {
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (count > 100) {
|
|
||||||
::fprintf(stderr, "Read %u rc inputs\n", count);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SITL_State::_read_rc_sitl_input()
|
|
||||||
{
|
|
||||||
struct pwm_packet {
|
|
||||||
uint16_t pwm[16];
|
|
||||||
} pwm_pkt;
|
|
||||||
|
|
||||||
if (!_setup_fdm()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
const ssize_t size = _sitl_rc_in.recv(&pwm_pkt, sizeof(pwm_pkt), 0);
|
|
||||||
|
|
||||||
// if we are simulating no pulses RC failure, do not update pwm_input
|
|
||||||
if (_sitl->rc_fail == SITL::SIM::SITL_RCFail_NoPulses) {
|
|
||||||
return size != -1; // we must continue to drain _sitl_rc
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_sitl->rc_fail == SITL::SIM::SITL_RCFail_Throttle950) {
|
|
||||||
// discard anything we just read from the "receiver" and set
|
|
||||||
// values to bind values:
|
|
||||||
for (uint8_t i=0; i<ARRAY_SIZE(pwm_input); i++) {
|
|
||||||
pwm_input[0] = 1500; // centre all inputs
|
|
||||||
}
|
|
||||||
pwm_input[2] = 950; // reset throttle (assumed to be on channel 3...)
|
|
||||||
return size != -1; // we must continue to drain _sitl_rc
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (size) {
|
|
||||||
case -1:
|
|
||||||
return false;
|
|
||||||
case 8*2:
|
|
||||||
case 16*2: {
|
|
||||||
// a packet giving the receiver PWM inputs
|
|
||||||
for (uint8_t i=0; i<size/2; i++) {
|
|
||||||
// setup the pwm input for the RC channel inputs
|
|
||||||
if (i < _sitl->state.rcin_chan_count) {
|
|
||||||
// we're using rc from simulator
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
uint16_t pwm = pwm_pkt.pwm[i];
|
|
||||||
if (pwm != 0) {
|
|
||||||
pwm_input[i] = pwm;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
fprintf(stderr, "Malformed SITL RC input (%ld)", (long)size);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
output current state to flightgear
|
output current state to flightgear
|
||||||
*/
|
*/
|
||||||
|
@ -337,9 +239,6 @@ void SITL_State::_fdm_input_local(void)
|
||||||
}
|
}
|
||||||
struct sitl_input input;
|
struct sitl_input input;
|
||||||
|
|
||||||
// check for direct RC input
|
|
||||||
_check_rc_input();
|
|
||||||
|
|
||||||
// construct servos structure for FDM
|
// construct servos structure for FDM
|
||||||
_simulator_servos(input);
|
_simulator_servos(input);
|
||||||
|
|
||||||
|
@ -364,12 +263,6 @@ void SITL_State::_fdm_input_local(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (_sitl->rc_fail == SITL::SIM::SITL_RCFail_None) {
|
|
||||||
for (uint8_t i=0; i< _sitl->state.rcin_chan_count; i++) {
|
|
||||||
pwm_input[i] = 1000 + _sitl->state.rcin[i]*1000;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#if HAL_SIM_JSON_MASTER_ENABLED
|
#if HAL_SIM_JSON_MASTER_ENABLED
|
||||||
// output JSON state to ride along flight controllers
|
// output JSON state to ride along flight controllers
|
||||||
ride_along.send(_sitl->state,sitl_model->get_position_relhome());
|
ride_along.send(_sitl->state,sitl_model->get_position_relhome());
|
||||||
|
@ -560,10 +453,6 @@ void SITL_State::_simulator_servos(struct sitl_input &input)
|
||||||
|
|
||||||
void SITL_State::init(int argc, char * const argv[])
|
void SITL_State::init(int argc, char * const argv[])
|
||||||
{
|
{
|
||||||
pwm_input[0] = pwm_input[1] = pwm_input[3] = 1500;
|
|
||||||
pwm_input[4] = pwm_input[7] = 1800;
|
|
||||||
pwm_input[2] = pwm_input[5] = pwm_input[6] = 1000;
|
|
||||||
|
|
||||||
_scheduler = Scheduler::from(hal.scheduler);
|
_scheduler = Scheduler::from(hal.scheduler);
|
||||||
_parse_command_line(argc, argv);
|
_parse_command_line(argc, argv);
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,7 +59,6 @@ private:
|
||||||
void _set_param_default(const char *parm);
|
void _set_param_default(const char *parm);
|
||||||
void _usage(void);
|
void _usage(void);
|
||||||
void _sitl_setup();
|
void _sitl_setup();
|
||||||
bool _setup_fdm(void);
|
|
||||||
void _setup_timer(void);
|
void _setup_timer(void);
|
||||||
void _setup_adc(void);
|
void _setup_adc(void);
|
||||||
|
|
||||||
|
@ -68,8 +67,6 @@ private:
|
||||||
void _set_signal_handlers(void) const;
|
void _set_signal_handlers(void) const;
|
||||||
|
|
||||||
void _update_airspeed(float airspeed);
|
void _update_airspeed(float airspeed);
|
||||||
void _check_rc_input(void);
|
|
||||||
bool _read_rc_sitl_input();
|
|
||||||
void _fdm_input_local(void);
|
void _fdm_input_local(void);
|
||||||
void _output_to_flightgear(void);
|
void _output_to_flightgear(void);
|
||||||
void _simulator_servos(struct sitl_input &input);
|
void _simulator_servos(struct sitl_input &input);
|
||||||
|
@ -85,8 +82,6 @@ private:
|
||||||
|
|
||||||
Scheduler *_scheduler;
|
Scheduler *_scheduler;
|
||||||
|
|
||||||
SocketAPM_native _sitl_rc_in{true};
|
|
||||||
bool _rc_in_started;
|
|
||||||
uint16_t _rcin_port;
|
uint16_t _rcin_port;
|
||||||
uint16_t _fg_view_port;
|
uint16_t _fg_view_port;
|
||||||
uint16_t _irlock_port;
|
uint16_t _irlock_port;
|
||||||
|
|
|
@ -622,18 +622,10 @@ void SITL_State::_parse_command_line(int argc, char * const argv[])
|
||||||
_vehicle = ArduCopter;
|
_vehicle = ArduCopter;
|
||||||
} else if (strcmp(vehicle_str, "Rover") == 0) {
|
} else if (strcmp(vehicle_str, "Rover") == 0) {
|
||||||
_vehicle = Rover;
|
_vehicle = Rover;
|
||||||
// set right default throttle for rover (allowing for reverse)
|
|
||||||
pwm_input[2] = 1500;
|
|
||||||
} else if (strcmp(vehicle_str, "ArduSub") == 0) {
|
} else if (strcmp(vehicle_str, "ArduSub") == 0) {
|
||||||
_vehicle = ArduSub;
|
_vehicle = ArduSub;
|
||||||
for(uint8_t i = 0; i < 8; i++) {
|
|
||||||
pwm_input[i] = 1500;
|
|
||||||
}
|
|
||||||
} else if (strcmp(vehicle_str, "Blimp") == 0) {
|
} else if (strcmp(vehicle_str, "Blimp") == 0) {
|
||||||
_vehicle = Blimp;
|
_vehicle = Blimp;
|
||||||
for(uint8_t i = 0; i < 8; i++) {
|
|
||||||
pwm_input[i] = 1500;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
_vehicle = ArduPlane;
|
_vehicle = ArduPlane;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue