2012-04-30 04:17:14 -03:00
/// -*- tab-width: 4; Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*-
2015-03-03 20:48:47 -04:00
#define THISFIRMWARE "ArduRover v2.49"
2013-08-26 03:52:24 -03:00
/*
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
2012-04-30 04:17:14 -03:00
2013-02-28 21:32:48 -04:00
/*
2013-08-26 03:52:24 -03:00
This is the APMrover2 firmware. It was originally derived from
ArduPlane by Jean-Louis Naudin (JLN), and then rewritten after the
AP_HAL merge by Andrew Tridgell
Maintainer: Andrew Tridgell
2013-02-28 21:32:48 -04:00
2013-08-26 03:52:24 -03:00
Authors: Doug Weibel, Jose Julio, Jordi Munoz, Jason Short, Andrew Tridgell, Randy Mackay, Pat Hickey, John Arne Birkeland, Olivier Adler, Jean-Louis Naudin
2013-02-28 21:32:48 -04:00
2013-08-26 03:52:24 -03:00
Thanks to: Chris Anderson, Michael Oborne, Paul Mather, Bill Premerlani, James Cohen, JB from rotorFX, Automatik, Fefenin, Peter Meister, Remzibi, Yury Smirnov, Sandro Benigno, Max Levine, Roberto Navoni, Lorenz Meier
2012-05-14 12:47:08 -03:00
2013-08-26 03:52:24 -03:00
APMrover alpha version tester: Franco Borasio, Daniel Chapelat...
Please contribute your ideas! See http://dev.ardupilot.com for details
*/
2013-02-28 21:32:48 -04:00
2012-04-30 04:17:14 -03:00
// Radio setup:
// APM INPUT (Rec = receiver)
2013-02-28 21:32:48 -04:00
// Rec ch1: Steering
// Rec ch2: not used
// Rec ch3: Throttle
// Rec ch4: not used
2012-04-30 04:17:14 -03:00
// Rec ch5: not used
// Rec ch6: not used
2013-02-28 21:32:48 -04:00
// Rec ch7: Option channel to 2 position switch
// Rec ch8: Mode channel to 6 position switch
2012-04-30 04:17:14 -03:00
// APM OUTPUT
// Ch1: Wheel servo (direction)
// Ch2: not used
// Ch3: to the motor ESC
// Ch4: not used
////////////////////////////////////////////////////////////////////////////////
// Header includes
////////////////////////////////////////////////////////////////////////////////
#include <math.h>
2012-12-18 07:44:12 -04:00
#include <stdarg.h>
#include <stdio.h>
2012-04-30 04:17:14 -03:00
// Libraries
#include <AP_Common.h>
2012-10-27 00:55:17 -03:00
#include <AP_Progmem.h>
2012-12-18 07:44:12 -04:00
#include <AP_HAL.h>
2012-10-20 15:57:48 -03:00
#include <AP_Menu.h>
2012-08-20 20:22:44 -03:00
#include <AP_Param.h>
2014-08-13 01:44:46 -03:00
#include <StorageManager.h>
2012-04-30 04:17:14 -03:00
#include <AP_GPS.h> // ArduPilot GPS library
#include <AP_ADC.h> // ArduPilot Mega Analog to Digital Converter Library
2012-12-18 07:44:12 -04:00
#include <AP_ADC_AnalogSource.h>
2012-11-17 02:45:20 -04:00
#include <AP_Baro.h>
2012-04-30 04:17:14 -03:00
#include <AP_Compass.h> // ArduPilot Mega Magnetometer Library
#include <AP_Math.h> // ArduPilot Mega Vector/Matrix math Library
#include <AP_InertialSensor.h> // Inertial Sensor (uncalibated IMU) Library
#include <AP_AHRS.h> // ArduPilot Mega DCM Library
2014-01-02 02:05:43 -04:00
#include <AP_NavEKF.h>
2014-03-10 05:42:44 -03:00
#include <AP_Mission.h> // Mission command library
2014-08-06 04:08:52 -03:00
#include <AP_Rally.h>
2014-07-25 01:36:29 -03:00
#include <AP_Terrain.h>
2012-04-30 04:17:14 -03:00
#include <PID.h> // PID library
#include <RC_Channel.h> // RC Channel Library
#include <AP_RangeFinder.h> // Range finder library
#include <Filter.h> // Filter library
2013-02-07 19:21:30 -04:00
#include <Butter.h> // Filter library - butterworth filter
2012-11-07 03:28:20 -04:00
#include <AP_Buffer.h> // FIFO buffer library
2012-04-30 04:17:14 -03:00
#include <ModeFilter.h> // Mode Filter from Filter library
#include <AverageFilter.h> // Mode Filter from Filter library
#include <AP_Relay.h> // APM relay
2014-01-20 01:05:23 -04:00
#include <AP_ServoRelayEvents.h>
2012-04-30 04:17:14 -03:00
#include <AP_Mount.h> // Camera/Antenna mount
2013-07-14 20:57:00 -03:00
#include <AP_Camera.h> // Camera triggering
2012-04-30 04:17:14 -03:00
#include <GCS_MAVLink.h> // MAVLink GCS definitions
2015-01-28 00:56:36 -04:00
#include <AP_SerialManager.h> // Serial manager library
2012-08-10 23:22:55 -03:00
#include <AP_Airspeed.h> // needed for AHRS build
2013-09-12 22:47:13 -03:00
#include <AP_Vehicle.h> // needed for AHRS build
2012-12-18 07:44:12 -04:00
#include <DataFlash.h>
2013-06-03 06:33:59 -03:00
#include <AP_RCMapper.h> // RC input mapping library
2012-12-18 07:44:12 -04:00
#include <SITL.h>
2013-06-03 21:37:05 -03:00
#include <AP_Scheduler.h> // main loop scheduler
2012-12-18 07:44:12 -04:00
#include <stdarg.h>
2013-06-16 20:50:53 -03:00
#include <AP_Navigation.h>
2013-09-08 21:18:31 -03:00
#include <APM_Control.h>
2013-06-16 20:50:53 -03:00
#include <AP_L1_Control.h>
2014-01-19 21:57:59 -04:00
#include <AP_BoardConfig.h>
2014-07-29 08:36:26 -03:00
#include <AP_Frsky_Telem.h>
2012-12-18 07:44:12 -04:00
#include <AP_HAL_AVR.h>
2015-05-04 03:18:29 -03:00
#include <AP_HAL_SITL.h>
2013-01-02 07:14:35 -04:00
#include <AP_HAL_PX4.h>
2014-03-31 14:58:48 -03:00
#include <AP_HAL_VRBRAIN.h>
2013-09-23 04:07:37 -03:00
#include <AP_HAL_FLYMAPLE.h>
2013-09-28 08:48:00 -03:00
#include <AP_HAL_Linux.h>
2012-12-18 07:44:12 -04:00
#include <AP_HAL_Empty.h>
#include "compat.h"
2012-04-30 04:17:14 -03:00
2013-08-24 06:05:18 -03:00
#include <AP_Notify.h> // Notify library
2013-10-02 03:07:28 -03:00
#include <AP_BattMonitor.h> // Battery monitor library
2015-01-02 07:45:50 -04:00
#include <AP_OpticalFlow.h> // Optical Flow library
2013-08-24 06:05:18 -03:00
2012-04-30 04:17:14 -03:00
// Configuration
#include "config.h"
// Local modules
#include "defines.h"
#include "Parameters.h"
#include "GCS.h"
#include <AP_Declination.h> // ArduPilot Mega Declination Helper Library
2015-05-12 02:03:23 -03:00
#include "Rover.h"
2012-04-30 04:17:14 -03:00
2012-12-18 07:44:12 -04:00
const AP_HAL::HAL& hal = AP_HAL_BOARD_DRIVER;
2012-11-21 02:25:11 -04:00
2015-05-12 02:03:23 -03:00
static Rover rover;
2013-06-03 21:37:05 -03:00
/*
setup is called when the sketch starts
*/
2015-05-12 02:03:23 -03:00
void Rover::setup()
{
2012-12-18 07:44:12 -04:00
cliSerial = hal.console;
2012-12-18 16:17:17 -04:00
// load the default values of variables listed in var_info[]
AP_Param::setup_sketch_defaults();
2015-03-02 01:57:36 -04:00
notify.init(false);
2013-09-17 21:55:54 -03:00
// rover does not use arming nor pre-arm checks
2013-08-24 06:05:18 -03:00
AP_Notify::flags.armed = true;
AP_Notify::flags.pre_arm_check = true;
2014-12-24 09:26:19 -04:00
AP_Notify::flags.pre_arm_gps_check = true;
2013-09-17 21:55:54 -03:00
AP_Notify::flags.failsafe_battery = false;
2013-05-13 02:14:23 -03:00
rssi_analog_source = hal.analogin->channel(ANALOG_INPUT_NONE);
2012-12-18 07:44:12 -04:00
2015-03-02 01:57:36 -04:00
init_ardupilot();
2013-06-03 21:37:05 -03:00
// initialise the main loop scheduler
scheduler.init(&scheduler_tasks[0], sizeof(scheduler_tasks)/sizeof(scheduler_tasks[0]));
2012-04-30 04:17:14 -03:00
}
2013-06-03 21:37:05 -03:00
/*
loop() is called rapidly while the sketch is running
*/
2015-05-12 02:03:23 -03:00
void Rover::loop()
2012-04-30 04:17:14 -03:00
{
2013-10-08 03:30:55 -03:00
// wait for an INS sample
2014-10-15 20:33:46 -03:00
ins.wait_for_sample();
2013-10-28 03:21:35 -03:00
uint32_t timer = hal.scheduler->micros();
2013-06-03 21:37:05 -03:00
2013-10-28 03:21:35 -03:00
delta_us_fast_loop = timer - fast_loopTimer_us;
G_Dt = delta_us_fast_loop * 1.0e-6f;
fast_loopTimer_us = timer;
2012-04-30 04:17:14 -03:00
2013-10-28 03:21:35 -03:00
if (delta_us_fast_loop > G_Dt_max)
G_Dt_max = delta_us_fast_loop;
2012-04-30 04:17:14 -03:00
2013-10-27 20:33:52 -03:00
mainLoop_count++;
2012-04-30 04:17:14 -03:00
2013-10-08 03:30:55 -03:00
// tell the scheduler one tick has passed
scheduler.tick();
2013-07-23 04:07:35 -03:00
2013-10-27 20:33:52 -03:00
scheduler.run(19500U);
2012-04-30 04:17:14 -03:00
}
2013-10-27 20:33:52 -03:00
// update AHRS system
2015-05-12 02:03:23 -03:00
void Rover::ahrs_update()
2012-04-30 04:17:14 -03:00
{
2015-01-28 19:44:50 -04:00
hal.util->set_soft_armed(hal.util->safety_switch_state() != AP_HAL::Util::SAFETY_DISARMED);
2014-02-18 19:54:04 -04:00
2013-10-27 20:33:52 -03:00
#if HIL_MODE != HIL_MODE_DISABLED
// update hil before AHRS update
gcs_update();
#endif
2013-02-28 16:40:47 -04:00
2013-11-17 19:58:22 -04:00
// when in reverse we need to tell AHRS not to assume we are a
// 'fly forward' vehicle, otherwise it will see a large
// discrepancy between the mag and the GPS heading and will try to
// correct for it, leading to a large yaw error
ahrs.set_fly_forward(!in_reverse);
2013-10-27 20:33:52 -03:00
ahrs.update();
2012-04-30 04:17:14 -03:00
2014-05-11 08:39:06 -03:00
// if using the EKF get a speed update now (from accelerometers)
Vector3f velocity;
if (ahrs.get_velocity_NED(velocity)) {
ground_speed = pythagorous2(velocity.x, velocity.y);
}
2014-01-14 00:10:13 -04:00
if (should_log(MASK_LOG_ATTITUDE_FAST))
2013-06-03 22:57:59 -03:00
Log_Write_Attitude();
2012-04-30 04:17:14 -03:00
2014-01-14 00:10:13 -04:00
if (should_log(MASK_LOG_IMU))
2013-11-03 23:37:54 -04:00
DataFlash.Log_Write_IMU(ins);
2012-04-30 04:17:14 -03:00
}
2013-06-03 21:37:05 -03:00
/*
update camera mount - 50Hz
*/
2015-05-12 02:03:23 -03:00
void Rover::mount_update(void)
2012-04-30 04:17:14 -03:00
{
#if MOUNT == ENABLED
2015-01-08 16:12:18 -04:00
camera_mount.update();
2012-04-30 04:17:14 -03:00
#endif
2013-07-14 20:57:00 -03:00
#if CAMERA == ENABLED
camera.trigger_pic_cleanup();
#endif
2012-04-30 04:17:14 -03:00
}
2015-05-12 02:03:23 -03:00
void Rover::update_alt()
2014-02-23 18:25:50 -04:00
{
2015-01-05 07:27:45 -04:00
barometer.update();
2014-02-23 18:25:50 -04:00
if (should_log(MASK_LOG_IMU)) {
Log_Write_Baro();
}
}
2013-06-03 21:37:05 -03:00
/*
check for GCS failsafe - 10Hz
*/
2015-05-12 02:03:23 -03:00
void Rover::gcs_failsafe_check(void)
2012-04-30 04:17:14 -03:00
{
2013-09-15 20:17:00 -03:00
if (g.fs_gcs_enabled) {
2013-09-15 19:23:21 -03:00
failsafe_trigger(FAILSAFE_EVENT_GCS, last_heartbeat_ms != 0 && (millis() - last_heartbeat_ms) > 2000);
}
2013-06-03 21:37:05 -03:00
}
2012-04-30 04:17:14 -03:00
2013-06-03 21:54:42 -03:00
/*
if the compass is enabled then try to accumulate a reading
*/
2015-05-12 02:03:23 -03:00
void Rover::compass_accumulate(void)
2013-06-03 21:54:42 -03:00
{
if (g.compass_enabled) {
compass.accumulate();
}
}
2013-06-03 21:37:05 -03:00
/*
check for new compass data - 10Hz
*/
2015-05-12 02:03:23 -03:00
void Rover::update_compass(void)
2013-06-03 21:37:05 -03:00
{
if (g.compass_enabled && compass.read()) {
ahrs.set_compass(&compass);
// update offsets
2014-02-15 22:22:20 -04:00
compass.learn_offsets();
2014-01-14 00:10:13 -04:00
if (should_log(MASK_LOG_COMPASS)) {
2015-01-16 18:42:14 -04:00
DataFlash.Log_Write_Compass(compass);
2013-06-03 21:37:05 -03:00
}
} else {
ahrs.set_compass(NULL);
}
}
2012-04-30 04:17:14 -03:00
2013-06-03 21:37:05 -03:00
/*
log some key data - 10Hz
*/
2015-05-12 02:03:23 -03:00
void Rover::update_logging1(void)
2013-06-03 21:37:05 -03:00
{
2014-01-14 00:10:13 -04:00
if (should_log(MASK_LOG_ATTITUDE_MED) && !should_log(MASK_LOG_ATTITUDE_FAST))
2013-06-03 21:37:05 -03:00
Log_Write_Attitude();
2014-01-14 00:10:13 -04:00
if (should_log(MASK_LOG_CTUN))
2013-06-03 21:37:05 -03:00
Log_Write_Control_Tuning();
2014-01-14 00:10:13 -04:00
if (should_log(MASK_LOG_NTUN))
2013-06-03 21:37:05 -03:00
Log_Write_Nav_Tuning();
2013-12-29 19:24:01 -04:00
}
2013-12-15 20:14:58 -04:00
2013-12-29 19:24:01 -04:00
/*
log some key data - 10Hz
*/
2015-05-12 02:03:23 -03:00
void Rover::update_logging2(void)
2013-12-29 19:24:01 -04:00
{
2014-01-14 00:10:13 -04:00
if (should_log(MASK_LOG_STEERING)) {
2013-12-15 20:14:58 -04:00
if (control_mode == STEERING || control_mode == AUTO || control_mode == RTL || control_mode == GUIDED) {
Log_Write_Steering();
}
}
2013-12-29 19:24:01 -04:00
2014-01-14 00:10:13 -04:00
if (should_log(MASK_LOG_RC))
2013-12-29 19:24:01 -04:00
Log_Write_RC();
2012-04-30 04:17:14 -03:00
}
2013-07-14 20:57:00 -03:00
/*
update aux servo mappings
*/
2015-05-12 02:03:23 -03:00
void Rover::update_aux(void)
2013-07-14 20:57:00 -03:00
{
2014-02-05 19:12:42 -04:00
RC_Channel_aux::enable_aux_servos();
2013-07-14 20:57:00 -03:00
}
2013-06-03 21:37:05 -03:00
/*
once a second events
*/
2015-05-12 02:03:23 -03:00
void Rover::one_second_loop(void)
2012-04-30 04:17:14 -03:00
{
2014-01-14 00:10:13 -04:00
if (should_log(MASK_LOG_CURRENT))
2012-04-30 04:17:14 -03:00
Log_Write_Current();
// send a heartbeat
gcs_send_message(MSG_HEARTBEAT);
2013-06-03 03:53:10 -03:00
// allow orientation change at runtime to aid config
ahrs.set_orientation();
2013-06-03 06:33:59 -03:00
set_control_channels();
2013-06-03 21:37:05 -03:00
// cope with changes to aux functions
2013-07-14 20:57:00 -03:00
update_aux();
2013-06-03 21:37:05 -03:00
// cope with changes to mavlink system ID
mavlink_system.sysid = g.sysid_this_mav;
2015-05-12 02:03:23 -03:00
uint8_t Rover::counter;
2013-06-03 21:37:05 -03:00
counter++;
// write perf data every 20s
2013-10-28 03:21:35 -03:00
if (counter % 10 == 0) {
if (scheduler.debug() != 0) {
hal.console->printf_P(PSTR("G_Dt_max=%lu\n"), (unsigned long)G_Dt_max);
}
2014-01-14 00:10:13 -04:00
if (should_log(MASK_LOG_PM))
2013-06-03 21:37:05 -03:00
Log_Write_Performance();
2013-11-01 20:40:29 -03:00
G_Dt_max = 0;
2013-06-03 21:37:05 -03:00
resetPerfData();
}
// save compass offsets once a minute
if (counter >= 60) {
if (g.compass_enabled) {
compass.save_offsets();
}
counter = 0;
}
2015-05-06 23:11:43 -03:00
ins.set_raw_logging(should_log(MASK_LOG_IMU_RAW));
2012-04-30 04:17:14 -03:00
}
2015-05-12 02:03:23 -03:00
void Rover::update_GPS_50Hz(void)
2012-11-17 02:45:20 -04:00
{
2015-05-12 02:03:23 -03:00
uint32_t Rover::last_gps_reading[GPS_MAX_INSTANCES];
2014-03-30 22:01:54 -03:00
gps.update();
2013-12-21 07:27:06 -04:00
2014-04-09 21:30:15 -03:00
for (uint8_t i=0; i<gps.num_sensors(); i++) {
if (gps.last_message_time_ms(i) != last_gps_reading[i]) {
last_gps_reading[i] = gps.last_message_time_ms(i);
if (should_log(MASK_LOG_GPS)) {
DataFlash.Log_Write_GPS(gps, i, current_loc.alt);
}
2013-04-28 01:57:19 -03:00
}
}
2013-12-29 19:33:32 -04:00
}
2013-04-28 01:57:19 -03:00
2015-05-12 02:03:23 -03:00
void Rover::update_GPS_10Hz(void)
2013-12-29 19:33:32 -04:00
{
2014-01-02 22:10:52 -04:00
have_position = ahrs.get_position(current_loc);
2012-11-28 07:44:03 -04:00
2014-03-30 22:01:54 -03:00
if (have_position && gps.status() >= AP_GPS::GPS_OK_FIX_3D) {
2012-04-30 04:17:14 -03:00
2014-03-30 22:01:54 -03:00
if (ground_start_count > 1){
2012-04-30 04:17:14 -03:00
ground_start_count--;
} else if (ground_start_count == 1) {
// We countdown N number of good GPS fixes
// so that the altitude is more accurate
// -------------------------------------
if (current_loc.lat == 0) {
2014-03-30 22:01:54 -03:00
ground_start_count = 20;
2012-04-30 04:17:14 -03:00
} else {
2012-11-17 02:45:20 -04:00
init_home();
2013-10-23 09:28:07 -03:00
// set system clock for log timestamps
2014-03-30 22:01:54 -03:00
hal.util->set_system_clock(gps.time_epoch_usec());
2013-10-23 09:28:07 -03:00
2012-04-30 04:17:14 -03:00
if (g.compass_enabled) {
// Set compass declination automatically
2014-03-30 22:01:54 -03:00
compass.set_initial_location(gps.location().lat, gps.location().lng);
2012-04-30 04:17:14 -03:00
}
ground_start_count = 0;
}
}
2014-05-11 08:39:06 -03:00
Vector3f velocity;
if (ahrs.get_velocity_NED(velocity)) {
ground_speed = pythagorous2(velocity.x, velocity.y);
} else {
ground_speed = gps.ground_speed();
}
2013-07-14 20:57:00 -03:00
#if CAMERA == ENABLED
if (camera.update_location(current_loc) == true) {
do_take_picture();
}
#endif
2012-04-30 04:17:14 -03:00
}
}
2015-05-12 02:03:23 -03:00
void Rover::update_current_mode(void)
2012-11-17 02:45:20 -04:00
{
2013-02-07 18:21:22 -04:00
switch (control_mode){
2012-11-27 18:20:20 -04:00
case AUTO:
case RTL:
2013-12-21 08:29:44 -04:00
set_reverse(false);
2013-06-16 20:50:53 -03:00
calc_lateral_acceleration();
2013-02-07 18:21:22 -04:00
calc_nav_steer();
2013-03-01 07:32:57 -04:00
calc_throttle(g.speed_cruise);
break;
2015-05-07 21:50:16 -03:00
case GUIDED:
set_reverse(false);
if (!rtl_complete) {
if (verify_RTL()) {
// we have reached destination so stop where we are
channel_throttle->servo_out = g.throttle_min.get();
channel_steer->servo_out = 0;
lateral_acceleration = 0;
} else {
calc_lateral_acceleration();
calc_nav_steer();
calc_throttle(g.speed_cruise);
}
}
break;
2013-06-16 20:50:53 -03:00
case STEERING: {
2013-03-01 07:32:57 -04:00
/*
2013-09-29 20:04:34 -03:00
in steering mode we control lateral acceleration
directly. We first calculate the maximum lateral
acceleration at full steering lock for this speed. That is
V^2/R where R is the radius of turn. We get the radius of
turn from half the STEER2SRV_P.
2013-03-01 07:32:57 -04:00
*/
2013-09-29 20:04:34 -03:00
float max_g_force = ground_speed * ground_speed / steerController.get_turn_radius();
// constrain to user set TURN_MAX_G
max_g_force = constrain_float(max_g_force, 0.1f, g.turn_max_g * GRAVITY_MSS);
lateral_acceleration = max_g_force * (channel_steer->pwm_to_angle()/4500.0f);
2013-03-01 07:32:57 -04:00
calc_nav_steer();
2013-10-04 18:41:32 -03:00
// and throttle gives speed in proportion to cruise speed, up
// to 50% throttle, then uses nudging above that.
2015-05-03 03:01:05 -03:00
float target_speed = channel_throttle->pwm_to_angle() * 0.01f * 2 * g.speed_cruise;
2013-11-24 20:21:15 -04:00
set_reverse(target_speed < 0);
2013-11-17 19:58:22 -04:00
if (in_reverse) {
target_speed = constrain_float(target_speed, -g.speed_cruise, 0);
} else {
target_speed = constrain_float(target_speed, 0, g.speed_cruise);
}
2013-10-04 18:41:32 -03:00
calc_throttle(target_speed);
2012-11-27 18:20:20 -04:00
break;
2013-06-16 20:50:53 -03:00
}
2012-11-27 18:20:20 -04:00
case LEARNING:
case MANUAL:
2013-03-01 07:32:57 -04:00
/*
in both MANUAL and LEARNING we pass through the
controls. Setting servo_out here actually doesn't matter, as
we set the exact value in set_servos(), but it helps for
logging
*/
2013-06-03 06:33:59 -03:00
channel_throttle->servo_out = channel_throttle->control_in;
channel_steer->servo_out = channel_steer->pwm_to_angle();
2013-11-17 19:58:22 -04:00
// mark us as in_reverse when using a negative throttle to
// stop AHRS getting off
2013-11-24 20:21:15 -04:00
set_reverse(channel_throttle->servo_out < 0);
2013-02-07 18:21:22 -04:00
break;
2013-03-28 18:53:20 -03:00
case HOLD:
// hold position - stop motors and center steering
2013-06-03 06:33:59 -03:00
channel_throttle->servo_out = 0;
channel_steer->servo_out = 0;
2013-12-21 08:29:44 -04:00
set_reverse(false);
2013-03-28 18:53:20 -03:00
break;
2013-02-07 18:21:22 -04:00
case INITIALISING:
2012-11-27 18:20:20 -04:00
break;
2012-04-30 04:17:14 -03:00
}
}
2015-05-12 02:03:23 -03:00
void Rover::update_navigation()
2012-04-30 04:17:14 -03:00
{
2012-11-29 03:09:05 -04:00
switch (control_mode) {
2013-02-07 18:21:22 -04:00
case MANUAL:
2013-03-28 18:53:20 -03:00
case HOLD:
2013-02-07 18:21:22 -04:00
case LEARNING:
2013-03-01 07:32:57 -04:00
case STEERING:
2013-02-07 18:21:22 -04:00
case INITIALISING:
break;
2012-11-29 03:09:05 -04:00
case AUTO:
2014-03-10 05:42:44 -03:00
mission.update();
2012-11-29 03:09:05 -04:00
break;
2012-04-30 04:17:14 -03:00
2012-11-29 03:09:05 -04:00
case RTL:
// no loitering around the wp with the rover, goes direct to the wp position
2013-06-16 20:50:53 -03:00
calc_lateral_acceleration();
2013-02-07 18:21:22 -04:00
calc_nav_steer();
if (verify_RTL()) {
2013-06-03 06:33:59 -03:00
channel_throttle->servo_out = g.throttle_min.get();
2013-03-28 18:53:20 -03:00
set_mode(HOLD);
2012-11-29 03:09:05 -04:00
}
break;
2015-05-07 21:50:16 -03:00
case GUIDED:
// no loitering around the wp with the rover, goes direct to the wp position
calc_lateral_acceleration();
calc_nav_steer();
if (!rtl_complete) {
if (verify_RTL()) {
// we have reached destination so stop where we are
channel_throttle->servo_out = g.throttle_min.get();
channel_steer->servo_out = 0;
lateral_acceleration = 0;
}
}
break;
2012-04-30 04:17:14 -03:00
}
}
2012-12-18 07:44:12 -04:00
AP_HAL_MAIN();