mirror of https://github.com/ArduPilot/ardupilot
Rover: more cleanup, and fixed navigation code
removed loiter code
This commit is contained in:
parent
a16ba57467
commit
691d19dd98
|
@ -404,25 +404,7 @@
|
||||||
// mainly intended to allow users to start using the APM without running the
|
// mainly intended to allow users to start using the APM without running the
|
||||||
// WaypointWriter first.
|
// WaypointWriter first.
|
||||||
//
|
//
|
||||||
// LOITER_RADIUS_DEFAULT OPTIONAL
|
|
||||||
//
|
|
||||||
// When the user performs a factory reset on the APM, set the loiter radius
|
|
||||||
// (the distance the APM will attempt to maintain from a waypoint while
|
|
||||||
// loitering) to this value in meters. This is mainly intended to allow
|
|
||||||
// users to start using the APM without running the WaypointWriter first.
|
|
||||||
//
|
|
||||||
// USE_CURRENT_ALT OPTIONAL
|
|
||||||
// ALT_HOLD_HOME OPTIONAL
|
|
||||||
//
|
|
||||||
// When the user performs a factory reset on the APM, set the flag for weather
|
|
||||||
// the current altitude or ALT_HOLD_HOME altitude should be used for Return To Launch.
|
|
||||||
// Also, set the value of USE_CURRENT_ALT in meters. This is mainly intended to allow
|
|
||||||
// users to start using the APM without running the WaypointWriter first.
|
|
||||||
//
|
|
||||||
#define WP_RADIUS_DEFAULT 1 // meters
|
#define WP_RADIUS_DEFAULT 1 // meters
|
||||||
#define LOITER_RADIUS_DEFAULT 5
|
|
||||||
#define USE_CURRENT_ALT TRUE
|
|
||||||
#define ALT_HOLD_HOME 0
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
// INPUT_VOLTAGE OPTIONAL
|
// INPUT_VOLTAGE OPTIONAL
|
||||||
|
|
|
@ -412,25 +412,7 @@ This feature works only if the ROV_AWPR_NAV is set to 0
|
||||||
// mainly intended to allow users to start using the APM without running the
|
// mainly intended to allow users to start using the APM without running the
|
||||||
// WaypointWriter first.
|
// WaypointWriter first.
|
||||||
//
|
//
|
||||||
// LOITER_RADIUS_DEFAULT OPTIONAL
|
|
||||||
//
|
|
||||||
// When the user performs a factory reset on the APM, set the loiter radius
|
|
||||||
// (the distance the APM will attempt to maintain from a waypoint while
|
|
||||||
// loitering) to this value in meters. This is mainly intended to allow
|
|
||||||
// users to start using the APM without running the WaypointWriter first.
|
|
||||||
//
|
|
||||||
// USE_CURRENT_ALT OPTIONAL
|
|
||||||
// ALT_HOLD_HOME OPTIONAL
|
|
||||||
//
|
|
||||||
// When the user performs a factory reset on the APM, set the flag for weather
|
|
||||||
// the current altitude or ALT_HOLD_HOME altitude should be used for Return To Launch.
|
|
||||||
// Also, set the value of USE_CURRENT_ALT in meters. This is mainly intended to allow
|
|
||||||
// users to start using the APM without running the WaypointWriter first.
|
|
||||||
//
|
|
||||||
#define WP_RADIUS_DEFAULT 1 // meters
|
#define WP_RADIUS_DEFAULT 1 // meters
|
||||||
#define LOITER_RADIUS_DEFAULT 5 // 60
|
|
||||||
#define USE_CURRENT_ALT TRUE
|
|
||||||
#define ALT_HOLD_HOME 0
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
// INPUT_VOLTAGE OPTIONAL
|
// INPUT_VOLTAGE OPTIONAL
|
||||||
|
|
|
@ -318,18 +318,18 @@ static const char *comma = ",";
|
||||||
|
|
||||||
static const char* flight_mode_strings[] = {
|
static const char* flight_mode_strings[] = {
|
||||||
"Manual",
|
"Manual",
|
||||||
"Circle",
|
"",
|
||||||
"Learning",
|
"Learning",
|
||||||
"",
|
"",
|
||||||
"",
|
"",
|
||||||
"FBW_A",
|
"",
|
||||||
"FBW_B",
|
"",
|
||||||
"",
|
"",
|
||||||
"",
|
"",
|
||||||
"",
|
"",
|
||||||
"Auto",
|
"Auto",
|
||||||
"RTL",
|
"RTL",
|
||||||
"Loiter",
|
"",
|
||||||
"",
|
"",
|
||||||
"",
|
"",
|
||||||
"",
|
"",
|
||||||
|
@ -374,7 +374,7 @@ static bool rc_override_active = false;
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// A tracking variable for type of failsafe active
|
// A tracking variable for type of failsafe active
|
||||||
// Used for failsafe based on loss of RC signal or GCS signal
|
// Used for failsafe based on loss of RC signal or GCS signal
|
||||||
static int failsafe;
|
static int16_t failsafe;
|
||||||
// Used to track if the value on channel 3 (throtttle) has fallen below the failsafe threshold
|
// Used to track if the value on channel 3 (throtttle) has fallen below the failsafe threshold
|
||||||
// RC receiver should be set up to output a low throttle value when signal is lost
|
// RC receiver should be set up to output a low throttle value when signal is lost
|
||||||
static bool ch3_failsafe;
|
static bool ch3_failsafe;
|
||||||
|
@ -407,7 +407,7 @@ static byte ground_start_count = 5;
|
||||||
// Used to compute a speed estimate from the first valid gps fixes to decide if we are
|
// Used to compute a speed estimate from the first valid gps fixes to decide if we are
|
||||||
// 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 int ground_start_avg;
|
static int16_t ground_start_avg;
|
||||||
static int32_t gps_base_alt;
|
static int32_t gps_base_alt;
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -418,18 +418,15 @@ const float radius_of_earth = 6378100; // meters
|
||||||
const float gravity = 9.81; // meters/ sec^2
|
const float gravity = 9.81; // meters/ sec^2
|
||||||
// This is the currently calculated direction to fly.
|
// This is the currently calculated direction to fly.
|
||||||
// deg * 100 : 0 to 360
|
// deg * 100 : 0 to 360
|
||||||
static long nav_bearing;
|
static int32_t nav_bearing;
|
||||||
// This is the direction to the next waypoint or loiter center
|
// This is the direction to the next waypoint
|
||||||
// deg * 100 : 0 to 360
|
// deg * 100 : 0 to 360
|
||||||
static long target_bearing;
|
static int32_t target_bearing;
|
||||||
//This is the direction from the last waypoint to the next waypoint
|
//This is the direction from the last waypoint to the next waypoint
|
||||||
// deg * 100 : 0 to 360
|
// deg * 100 : 0 to 360
|
||||||
static long crosstrack_bearing;
|
static int32_t crosstrack_bearing;
|
||||||
// A gain scaler to account for ground speed/headwind/tailwind
|
// A gain scaler to account for ground speed/headwind/tailwind
|
||||||
static float nav_gain_scaler = 1;
|
static float nav_gain_scaler = 1;
|
||||||
// Direction held during phases of takeoff and landing
|
|
||||||
// deg * 100 dir of plane, A value of -1 indicates the course has not been set/is not in use
|
|
||||||
static long hold_course = -1; // deg * 100 dir of plane
|
|
||||||
static bool rtl_complete = false;
|
static bool rtl_complete = false;
|
||||||
|
|
||||||
// There may be two active commands in Auto mode.
|
// There may be two active commands in Auto mode.
|
||||||
|
@ -443,7 +440,7 @@ static byte non_nav_command_ID = NO_COMMAND;
|
||||||
|
|
||||||
static float groundspeed_error;
|
static float groundspeed_error;
|
||||||
// 0-(throttle_max - throttle_cruise) : throttle nudge in Auto mode using top 1/2 of throttle stick travel
|
// 0-(throttle_max - throttle_cruise) : throttle nudge in Auto mode using top 1/2 of throttle stick travel
|
||||||
static int throttle_nudge = 0;
|
static int16_t throttle_nudge = 0;
|
||||||
// The distance as reported by Sonar in cm – Values are 20 to 700 generally.
|
// The distance as reported by Sonar in cm – Values are 20 to 700 generally.
|
||||||
static int16_t sonar_dist;
|
static int16_t sonar_dist;
|
||||||
static bool obstacle = false;
|
static bool obstacle = false;
|
||||||
|
@ -452,17 +449,17 @@ static bool obstacle = false;
|
||||||
// Ground speed
|
// Ground speed
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// The amount current ground speed is below min ground speed. Centimeters per second
|
// The amount current ground speed is below min ground speed. Centimeters per second
|
||||||
static long groundspeed_undershoot = 0;
|
static int32_t groundspeed_undershoot = 0;
|
||||||
static long ground_speed = 0;
|
static int32_t ground_speed = 0;
|
||||||
static int throttle_last = 0, throttle = 500;
|
static int16_t throttle_last = 0, throttle = 500;
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// Location Errors
|
// Location Errors
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// Difference between current bearing and desired bearing. Hundredths of a degree
|
// Difference between current bearing and desired bearing. Hundredths of a degree
|
||||||
static long bearing_error;
|
static int32_t bearing_error;
|
||||||
// Difference between current altitude and desired altitude. Centimeters
|
// Difference between current altitude and desired altitude. Centimeters
|
||||||
static long altitude_error;
|
static int32_t altitude_error;
|
||||||
// Distance perpandicular to the course line that we are off trackline. Meters
|
// Distance perpandicular to the course line that we are off trackline. Meters
|
||||||
static float crosstrack_error;
|
static float crosstrack_error;
|
||||||
|
|
||||||
|
@ -495,42 +492,26 @@ static float current_total1;
|
||||||
//static float current_total2; // Totalized current (Amp-hours) from battery 2
|
//static float current_total2; // Totalized current (Amp-hours) from battery 2
|
||||||
|
|
||||||
// JLN Update
|
// JLN Update
|
||||||
unsigned long timesw = 0;
|
uint32_t timesw = 0;
|
||||||
static bool speed_boost = false;
|
static bool speed_boost = false;
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
// Loiter management
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
// Previous target bearing. Used to calculate loiter rotations. Hundredths of a degree
|
|
||||||
static long old_target_bearing;
|
|
||||||
// Total desired rotation in a loiter. Used for Loiter Turns commands. Degrees
|
|
||||||
static int loiter_total;
|
|
||||||
// The amount in degrees we have turned since recording old_target_bearing
|
|
||||||
static int loiter_delta;
|
|
||||||
// Total rotation in a loiter. Used for Loiter Turns commands and to check for missed waypoints. Degrees
|
|
||||||
static int loiter_sum;
|
|
||||||
// The amount of time we have been in a Loiter. Used for the Loiter Time command. Milliseconds.
|
|
||||||
static long loiter_time;
|
|
||||||
// The amount of time we should stay in a loiter for the Loiter Time command. Milliseconds.
|
|
||||||
static int loiter_time_max;
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// Navigation control variables
|
// Navigation control variables
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// The instantaneous desired bank angle. Hundredths of a degree
|
// The instantaneous desired bank angle. Hundredths of a degree
|
||||||
static long nav_roll;
|
static int32_t nav_roll;
|
||||||
// The instantaneous desired pitch angle. Hundredths of a degree
|
// The instantaneous desired pitch angle. Hundredths of a degree
|
||||||
static long nav_pitch;
|
static int32_t nav_pitch;
|
||||||
// Calculated radius for the wp turn based on ground speed and max turn angle
|
// Calculated radius for the wp turn based on ground speed and max turn angle
|
||||||
static long wp_radius;
|
static int32_t wp_radius;
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// Waypoint distances
|
// Waypoint distances
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// Distance between plane and next waypoint. Meters
|
// Distance between plane and next waypoint. Meters
|
||||||
static long wp_distance;
|
static int32_t wp_distance;
|
||||||
// Distance between previous and next waypoint. Meters
|
// Distance between previous and next waypoint. Meters
|
||||||
static long wp_totalDistance;
|
static int32_t wp_totalDistance;
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// repeating event control
|
// repeating event control
|
||||||
|
@ -538,27 +519,27 @@ static long wp_totalDistance;
|
||||||
// Flag indicating current event type
|
// Flag indicating current event type
|
||||||
static byte event_id;
|
static byte event_id;
|
||||||
// when the event was started in ms
|
// when the event was started in ms
|
||||||
static long event_timer;
|
static int32_t event_timer;
|
||||||
// how long to delay the next firing of event in millis
|
// how long to delay the next firing of event in millis
|
||||||
static uint16_t event_delay;
|
static uint16_t event_delay;
|
||||||
// how many times to cycle : -1 (or -2) = forever, 2 = do one cycle, 4 = do two cycles
|
// how many times to cycle : -1 (or -2) = forever, 2 = do one cycle, 4 = do two cycles
|
||||||
static int event_repeat = 0;
|
static int16_t event_repeat = 0;
|
||||||
// per command value, such as PWM for servos
|
// per command value, such as PWM for servos
|
||||||
static int event_value;
|
static int16_t event_value;
|
||||||
// the value used to cycle events (alternate value to event_value)
|
// the value used to cycle events (alternate value to event_value)
|
||||||
static int event_undo_value;
|
static int16_t event_undo_value;
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// Conditional command
|
// Conditional command
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// A value used in condition commands (eg delay, change alt, etc.)
|
// A value used in condition commands (eg delay, change alt, etc.)
|
||||||
// For example in a change altitude command, it is the altitude to change to.
|
// For example in a change altitude command, it is the altitude to change to.
|
||||||
static long condition_value;
|
static int32_t condition_value;
|
||||||
// A starting value used to check the status of a conditional command.
|
// A starting value used to check the status of a conditional command.
|
||||||
// For example in a delay command the condition_start records that start time for the delay
|
// For example in a delay command the condition_start records that start time for the delay
|
||||||
static long condition_start;
|
static int32_t condition_start;
|
||||||
// A value used in condition commands. For example the rate at which to change altitude.
|
// A value used in condition commands. For example the rate at which to change altitude.
|
||||||
static int condition_rate;
|
static int16_t condition_rate;
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// 3D Location vectors
|
// 3D Location vectors
|
||||||
|
@ -572,7 +553,7 @@ static bool home_is_set;
|
||||||
static struct Location prev_WP;
|
static struct Location prev_WP;
|
||||||
// The plane's current location
|
// The plane's current location
|
||||||
static struct Location current_loc;
|
static struct Location current_loc;
|
||||||
// The location of the current/active waypoint. Used for altitude ramp, track following and loiter calculations.
|
// The location of the current/active waypoint. Used for track following
|
||||||
static struct Location next_WP;
|
static struct Location next_WP;
|
||||||
// The location of the active waypoint in Guided mode.
|
// The location of the active waypoint in Guided mode.
|
||||||
static struct Location guided_WP;
|
static struct Location guided_WP;
|
||||||
|
@ -593,30 +574,30 @@ static float G_Dt = 0.02;
|
||||||
// Performance monitoring
|
// Performance monitoring
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// Timer used to accrue data and trigger recording of the performanc monitoring log message
|
// Timer used to accrue data and trigger recording of the performanc monitoring log message
|
||||||
static long perf_mon_timer;
|
static int32_t perf_mon_timer;
|
||||||
// The maximum main loop execution time recorded in the current performance monitoring interval
|
// The maximum main loop execution time recorded in the current performance monitoring interval
|
||||||
static int G_Dt_max = 0;
|
static int16_t G_Dt_max = 0;
|
||||||
// The number of gps fixes recorded in the current performance monitoring interval
|
// The number of gps fixes recorded in the current performance monitoring interval
|
||||||
static int gps_fix_count = 0;
|
static int16_t gps_fix_count = 0;
|
||||||
// A variable used by developers to track performanc metrics.
|
// A variable used by developers to track performanc metrics.
|
||||||
// Currently used to record the number of GCS heartbeat messages received
|
// Currently used to record the number of GCS heartbeat messages received
|
||||||
static int pmTest1 = 0;
|
static int16_t pmTest1 = 0;
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// System Timers
|
// System Timers
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// Time in miliseconds of start of main control loop. Milliseconds
|
// Time in miliseconds of start of main control loop. Milliseconds
|
||||||
static unsigned long fast_loopTimer;
|
static uint32_t fast_loopTimer;
|
||||||
// Time Stamp when fast loop was complete. Milliseconds
|
// Time Stamp when fast loop was complete. Milliseconds
|
||||||
static unsigned long fast_loopTimeStamp;
|
static uint32_t fast_loopTimeStamp;
|
||||||
// Number of milliseconds used in last main loop cycle
|
// Number of milliseconds used in last main loop cycle
|
||||||
static uint8_t delta_ms_fast_loop;
|
static uint8_t delta_ms_fast_loop;
|
||||||
// Counter of main loop executions. Used for performance monitoring and failsafe processing
|
// Counter of main loop executions. Used for performance monitoring and failsafe processing
|
||||||
static uint16_t mainLoop_count;
|
static uint16_t mainLoop_count;
|
||||||
|
|
||||||
// Time in miliseconds of start of medium control loop. Milliseconds
|
// Time in miliseconds of start of medium control loop. Milliseconds
|
||||||
static unsigned long medium_loopTimer;
|
static uint32_t medium_loopTimer;
|
||||||
// Counters for branching from main control loop to slower loops
|
// Counters for branching from main control loop to slower loops
|
||||||
static byte medium_loopCounter;
|
static byte medium_loopCounter;
|
||||||
// Number of milliseconds used in last medium loop cycle
|
// Number of milliseconds used in last medium loop cycle
|
||||||
|
@ -977,43 +958,21 @@ static void update_GPS(void)
|
||||||
|
|
||||||
static void update_current_flight_mode(void)
|
static void update_current_flight_mode(void)
|
||||||
{
|
{
|
||||||
if(control_mode == AUTO) {
|
|
||||||
switch (nav_command_ID) {
|
|
||||||
hold_course = -1;
|
|
||||||
calc_nav_roll();
|
|
||||||
calc_throttle();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
switch(control_mode){
|
switch(control_mode){
|
||||||
|
case AUTO:
|
||||||
case RTL:
|
case RTL:
|
||||||
hold_course = -1;
|
|
||||||
calc_nav_roll();
|
calc_nav_roll();
|
||||||
calc_throttle();
|
calc_throttle();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case LEARNING:
|
case LEARNING:
|
||||||
|
case MANUAL:
|
||||||
nav_roll = 0;
|
nav_roll = 0;
|
||||||
nav_pitch = 0;
|
nav_pitch = 0;
|
||||||
#if X_PLANE == ENABLED
|
|
||||||
// servo_out is for Sim control only
|
|
||||||
// ---------------------------------
|
|
||||||
g.channel_roll.servo_out = g.channel_roll.pwm_to_angle();
|
|
||||||
g.channel_pitch.servo_out = g.channel_pitch.pwm_to_angle();
|
|
||||||
g.channel_rudder.servo_out = g.channel_roll.pwm_to_angle();
|
|
||||||
#endif
|
|
||||||
// throttle is passthrough
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MANUAL:
|
|
||||||
// servo_out is for Sim control only
|
|
||||||
// ---------------------------------
|
|
||||||
g.channel_roll.servo_out = g.channel_roll.pwm_to_angle();
|
g.channel_roll.servo_out = g.channel_roll.pwm_to_angle();
|
||||||
g.channel_pitch.servo_out = g.channel_pitch.pwm_to_angle();
|
g.channel_pitch.servo_out = g.channel_pitch.pwm_to_angle();
|
||||||
g.channel_rudder.servo_out = g.channel_roll.pwm_to_angle();
|
g.channel_rudder.servo_out = g.channel_roll.pwm_to_angle();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1028,10 +987,8 @@ static void update_navigation()
|
||||||
}else{
|
}else{
|
||||||
|
|
||||||
switch(control_mode){
|
switch(control_mode){
|
||||||
case LOITER:
|
|
||||||
case RTL: // no loitering around the wp with the rover, goes direct to the wp position
|
case RTL: // no loitering around the wp with the rover, goes direct to the wp position
|
||||||
case GUIDED:
|
case GUIDED:
|
||||||
// update_loiter();
|
|
||||||
calc_nav_roll();
|
calc_nav_roll();
|
||||||
calc_bearing_error();
|
calc_bearing_error();
|
||||||
if(verify_RTL()) {
|
if(verify_RTL()) {
|
||||||
|
|
|
@ -46,7 +46,6 @@ static NOINLINE void send_heartbeat(mavlink_channel_t chan)
|
||||||
break;
|
break;
|
||||||
case AUTO:
|
case AUTO:
|
||||||
case RTL:
|
case RTL:
|
||||||
case LOITER:
|
|
||||||
case GUIDED:
|
case GUIDED:
|
||||||
case CIRCLE:
|
case CIRCLE:
|
||||||
base_mode = MAV_MODE_FLAG_GUIDED_ENABLED;
|
base_mode = MAV_MODE_FLAG_GUIDED_ENABLED;
|
||||||
|
@ -215,7 +214,7 @@ static void NOINLINE send_location(mavlink_channel_t chan)
|
||||||
|
|
||||||
static void NOINLINE send_nav_controller_output(mavlink_channel_t chan)
|
static void NOINLINE send_nav_controller_output(mavlink_channel_t chan)
|
||||||
{
|
{
|
||||||
int16_t bearing = (hold_course==-1?nav_bearing:hold_course) / 100;
|
int16_t bearing = nav_bearing / 100;
|
||||||
mavlink_msg_nav_controller_output_send(
|
mavlink_msg_nav_controller_output_send(
|
||||||
chan,
|
chan,
|
||||||
nav_roll / 1.0e2,
|
nav_roll / 1.0e2,
|
||||||
|
@ -1106,7 +1105,6 @@ void GCS_MAVLINK::handleMessage(mavlink_message_t* msg)
|
||||||
|
|
||||||
float param1 = 0, param2 = 0 , param3 = 0, param4 = 0;
|
float param1 = 0, param2 = 0 , param3 = 0, param4 = 0;
|
||||||
|
|
||||||
// time that the mav should loiter in milliseconds
|
|
||||||
uint8_t current = 0; // 1 (true), 0 (false)
|
uint8_t current = 0; // 1 (true), 0 (false)
|
||||||
|
|
||||||
if (packet.seq == (uint16_t)g.command_index)
|
if (packet.seq == (uint16_t)g.command_index)
|
||||||
|
@ -1129,16 +1127,11 @@ void GCS_MAVLINK::handleMessage(mavlink_message_t* msg)
|
||||||
|
|
||||||
switch (tell_command.id) { // Switch to map APM command fields inot MAVLink command fields
|
switch (tell_command.id) { // Switch to map APM command fields inot MAVLink command fields
|
||||||
|
|
||||||
case MAV_CMD_NAV_LOITER_TURNS:
|
|
||||||
case MAV_CMD_NAV_TAKEOFF:
|
case MAV_CMD_NAV_TAKEOFF:
|
||||||
case MAV_CMD_DO_SET_HOME:
|
case MAV_CMD_DO_SET_HOME:
|
||||||
param1 = tell_command.p1;
|
param1 = tell_command.p1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MAV_CMD_NAV_LOITER_TIME:
|
|
||||||
param1 = tell_command.p1*10; // APM loiter time is in ten second increments
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MAV_CMD_CONDITION_CHANGE_ALT:
|
case MAV_CMD_CONDITION_CHANGE_ALT:
|
||||||
x=0; // Clear fields loaded above that we don't want sent for this command
|
x=0; // Clear fields loaded above that we don't want sent for this command
|
||||||
y=0;
|
y=0;
|
||||||
|
@ -1348,11 +1341,9 @@ void GCS_MAVLINK::handleMessage(mavlink_message_t* msg)
|
||||||
|
|
||||||
switch (tell_command.id) { // Switch to map APM command fields inot MAVLink command fields
|
switch (tell_command.id) { // Switch to map APM command fields inot MAVLink command fields
|
||||||
case MAV_CMD_NAV_WAYPOINT:
|
case MAV_CMD_NAV_WAYPOINT:
|
||||||
case MAV_CMD_NAV_LOITER_UNLIM:
|
|
||||||
case MAV_CMD_NAV_RETURN_TO_LAUNCH:
|
case MAV_CMD_NAV_RETURN_TO_LAUNCH:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MAV_CMD_NAV_LOITER_TURNS:
|
|
||||||
case MAV_CMD_NAV_TAKEOFF:
|
case MAV_CMD_NAV_TAKEOFF:
|
||||||
case MAV_CMD_DO_SET_HOME:
|
case MAV_CMD_DO_SET_HOME:
|
||||||
tell_command.p1 = packet.param1;
|
tell_command.p1 = packet.param1;
|
||||||
|
@ -1362,10 +1353,6 @@ void GCS_MAVLINK::handleMessage(mavlink_message_t* msg)
|
||||||
tell_command.lat = packet.param1;
|
tell_command.lat = packet.param1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MAV_CMD_NAV_LOITER_TIME:
|
|
||||||
tell_command.p1 = packet.param1 / 10; // APM loiter time is in ten second increments
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MAV_CMD_CONDITION_DELAY:
|
case MAV_CMD_CONDITION_DELAY:
|
||||||
case MAV_CMD_CONDITION_DISTANCE:
|
case MAV_CMD_CONDITION_DISTANCE:
|
||||||
tell_command.lat = packet.param1;
|
tell_command.lat = packet.param1;
|
||||||
|
@ -1807,8 +1794,8 @@ GCS_MAVLINK::queued_waypoint_send()
|
||||||
*/
|
*/
|
||||||
static void mavlink_delay(unsigned long t)
|
static void mavlink_delay(unsigned long t)
|
||||||
{
|
{
|
||||||
unsigned long tstart;
|
uint32_t tstart;
|
||||||
static unsigned long last_1hz, last_50hz;
|
static uint32_t last_1hz, last_50hz;
|
||||||
|
|
||||||
if (in_mavlink_delay) {
|
if (in_mavlink_delay) {
|
||||||
// this should never happen, but let's not tempt fate by
|
// this should never happen, but let's not tempt fate by
|
||||||
|
@ -1821,7 +1808,7 @@ static void mavlink_delay(unsigned long t)
|
||||||
|
|
||||||
tstart = millis();
|
tstart = millis();
|
||||||
do {
|
do {
|
||||||
unsigned long tnow = millis();
|
uint32_t tnow = millis();
|
||||||
if (tnow - last_1hz > 1000) {
|
if (tnow - last_1hz > 1000) {
|
||||||
last_1hz = tnow;
|
last_1hz = tnow;
|
||||||
gcs_send_message(MSG_HEARTBEAT);
|
gcs_send_message(MSG_HEARTBEAT);
|
||||||
|
|
|
@ -161,7 +161,7 @@ public:
|
||||||
k_param_command_total,
|
k_param_command_total,
|
||||||
k_param_command_index,
|
k_param_command_index,
|
||||||
k_param_waypoint_radius,
|
k_param_waypoint_radius,
|
||||||
k_param_loiter_radius,
|
k_param_loiter_radius, // unused
|
||||||
k_param_fence_action,
|
k_param_fence_action,
|
||||||
k_param_fence_total,
|
k_param_fence_total,
|
||||||
k_param_fence_channel,
|
k_param_fence_channel,
|
||||||
|
@ -262,7 +262,6 @@ public:
|
||||||
AP_Int8 command_total;
|
AP_Int8 command_total;
|
||||||
AP_Int8 command_index;
|
AP_Int8 command_index;
|
||||||
AP_Int8 waypoint_radius;
|
AP_Int8 waypoint_radius;
|
||||||
AP_Int8 loiter_radius;
|
|
||||||
|
|
||||||
// Fly-by-wire
|
// Fly-by-wire
|
||||||
//
|
//
|
||||||
|
|
|
@ -32,7 +32,6 @@ const AP_Param::Info var_info[] PROGMEM = {
|
||||||
GSCALAR(command_total, "CMD_TOTAL", 0),
|
GSCALAR(command_total, "CMD_TOTAL", 0),
|
||||||
GSCALAR(command_index, "CMD_INDEX", 0),
|
GSCALAR(command_index, "CMD_INDEX", 0),
|
||||||
GSCALAR(waypoint_radius, "WP_RADIUS", WP_RADIUS_DEFAULT),
|
GSCALAR(waypoint_radius, "WP_RADIUS", WP_RADIUS_DEFAULT),
|
||||||
GSCALAR(loiter_radius, "WP_LOITER_RAD", LOITER_RADIUS_DEFAULT),
|
|
||||||
|
|
||||||
GSCALAR(throttle_min, "THR_MIN", THROTTLE_MIN),
|
GSCALAR(throttle_min, "THR_MIN", THROTTLE_MIN),
|
||||||
GSCALAR(throttle_max, "THR_MAX", THROTTLE_MAX),
|
GSCALAR(throttle_max, "THR_MAX", THROTTLE_MAX),
|
||||||
|
|
|
@ -120,21 +120,12 @@ static void set_next_WP(struct Location *wp)
|
||||||
prev_WP = current_loc;
|
prev_WP = current_loc;
|
||||||
}
|
}
|
||||||
|
|
||||||
// zero out our loiter vals to watch for missed waypoints
|
|
||||||
loiter_delta = 0;
|
|
||||||
loiter_sum = 0;
|
|
||||||
loiter_total = 0;
|
|
||||||
|
|
||||||
// this is handy for the groundstation
|
// this is handy for the groundstation
|
||||||
wp_totalDistance = get_distance(¤t_loc, &next_WP);
|
wp_totalDistance = get_distance(¤t_loc, &next_WP);
|
||||||
wp_distance = wp_totalDistance;
|
wp_distance = wp_totalDistance;
|
||||||
target_bearing = get_bearing_cd(¤t_loc, &next_WP);
|
target_bearing = get_bearing_cd(¤t_loc, &next_WP);
|
||||||
nav_bearing = target_bearing;
|
nav_bearing = target_bearing;
|
||||||
|
|
||||||
// to check if we have missed the WP
|
|
||||||
// ----------------------------
|
|
||||||
old_target_bearing = target_bearing;
|
|
||||||
|
|
||||||
// set a new crosstrack bearing
|
// set a new crosstrack bearing
|
||||||
// ----------------------------
|
// ----------------------------
|
||||||
reset_crosstrack();
|
reset_crosstrack();
|
||||||
|
@ -155,10 +146,6 @@ static void set_guided_WP(void)
|
||||||
wp_distance = wp_totalDistance;
|
wp_distance = wp_totalDistance;
|
||||||
target_bearing = get_bearing_cd(¤t_loc, &next_WP);
|
target_bearing = get_bearing_cd(¤t_loc, &next_WP);
|
||||||
|
|
||||||
// to check if we have missed the WP
|
|
||||||
// ----------------------------
|
|
||||||
old_target_bearing = target_bearing;
|
|
||||||
|
|
||||||
// set a new crosstrack bearing
|
// set a new crosstrack bearing
|
||||||
// ----------------------------
|
// ----------------------------
|
||||||
reset_crosstrack();
|
reset_crosstrack();
|
||||||
|
|
|
@ -21,18 +21,6 @@ handle_process_nav_cmd()
|
||||||
do_nav_wp();
|
do_nav_wp();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MAV_CMD_NAV_LOITER_UNLIM: // Loiter indefinitely
|
|
||||||
do_loiter_unlimited();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MAV_CMD_NAV_LOITER_TURNS: // Loiter N Times
|
|
||||||
do_loiter_turns();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MAV_CMD_NAV_LOITER_TIME:
|
|
||||||
do_loiter_time();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MAV_CMD_NAV_RETURN_TO_LAUNCH:
|
case MAV_CMD_NAV_RETURN_TO_LAUNCH:
|
||||||
do_RTL();
|
do_RTL();
|
||||||
break;
|
break;
|
||||||
|
@ -139,32 +127,16 @@ static bool verify_nav_command() // Returns true if command complete
|
||||||
|
|
||||||
case MAV_CMD_NAV_TAKEOFF:
|
case MAV_CMD_NAV_TAKEOFF:
|
||||||
return verify_takeoff();
|
return verify_takeoff();
|
||||||
break;
|
|
||||||
|
|
||||||
case MAV_CMD_NAV_WAYPOINT:
|
case MAV_CMD_NAV_WAYPOINT:
|
||||||
return verify_nav_wp();
|
return verify_nav_wp();
|
||||||
break;
|
|
||||||
|
|
||||||
case MAV_CMD_NAV_LOITER_UNLIM:
|
|
||||||
return verify_loiter_unlim();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MAV_CMD_NAV_LOITER_TURNS:
|
|
||||||
return verify_loiter_turns();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MAV_CMD_NAV_LOITER_TIME:
|
|
||||||
return verify_loiter_time();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MAV_CMD_NAV_RETURN_TO_LAUNCH:
|
case MAV_CMD_NAV_RETURN_TO_LAUNCH:
|
||||||
return verify_RTL();
|
return verify_RTL();
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
gcs_send_text_P(SEVERITY_HIGH,PSTR("verify_nav: Invalid or no current Nav cmd"));
|
gcs_send_text_P(SEVERITY_HIGH,PSTR("verify_nav: Invalid or no current Nav cmd"));
|
||||||
return false;
|
return false;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -220,24 +192,6 @@ static void do_nav_wp()
|
||||||
set_next_WP(&next_nav_command);
|
set_next_WP(&next_nav_command);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void do_loiter_unlimited()
|
|
||||||
{
|
|
||||||
set_next_WP(&next_nav_command);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void do_loiter_turns()
|
|
||||||
{
|
|
||||||
set_next_WP(&next_nav_command);
|
|
||||||
loiter_total = next_nav_command.p1 * 360;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void do_loiter_time()
|
|
||||||
{
|
|
||||||
set_next_WP(&next_nav_command);
|
|
||||||
loiter_time = millis();
|
|
||||||
loiter_time_max = next_nav_command.p1; // units are (seconds * 10)
|
|
||||||
}
|
|
||||||
|
|
||||||
/********************************************************************************/
|
/********************************************************************************/
|
||||||
// Verify Nav (Must) commands
|
// Verify Nav (Must) commands
|
||||||
/********************************************************************************/
|
/********************************************************************************/
|
||||||
|
@ -254,7 +208,6 @@ static void calc_turn_radius(void) // JLN update - adjut automaticaly the wp_
|
||||||
|
|
||||||
static bool verify_nav_wp()
|
static bool verify_nav_wp()
|
||||||
{
|
{
|
||||||
hold_course = -1;
|
|
||||||
update_crosstrack();
|
update_crosstrack();
|
||||||
|
|
||||||
if ((wp_distance > 0) && (wp_distance <= g.waypoint_radius)) {
|
if ((wp_distance > 0) && (wp_distance <= g.waypoint_radius)) {
|
||||||
|
@ -273,13 +226,7 @@ static bool verify_nav_wp()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// have we circled around the waypoint?
|
// have we gone past the waypoint?
|
||||||
if (loiter_sum > 300) {
|
|
||||||
gcs_send_text_P(SEVERITY_MEDIUM,PSTR("Missed WP"));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// have we flown past the waypoint?
|
|
||||||
if (location_passed_point(current_loc, prev_WP, next_WP)) {
|
if (location_passed_point(current_loc, prev_WP, next_WP)) {
|
||||||
gcs_send_text_fmt(PSTR("Passed Waypoint #%i dist %um"),
|
gcs_send_text_fmt(PSTR("Passed Waypoint #%i dist %um"),
|
||||||
(unsigned)nav_command_index,
|
(unsigned)nav_command_index,
|
||||||
|
@ -290,37 +237,6 @@ static bool verify_nav_wp()
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool verify_loiter_unlim()
|
|
||||||
{
|
|
||||||
update_loiter();
|
|
||||||
calc_bearing_error();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool verify_loiter_time()
|
|
||||||
{
|
|
||||||
update_loiter();
|
|
||||||
calc_bearing_error();
|
|
||||||
if ((millis() - loiter_time) > (unsigned long)loiter_time_max * 10000l) { // scale loiter_time_max from (sec*10) to milliseconds
|
|
||||||
gcs_send_text_P(SEVERITY_LOW,PSTR("verify_nav: LOITER time complete"));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool verify_loiter_turns()
|
|
||||||
{
|
|
||||||
update_loiter();
|
|
||||||
calc_bearing_error();
|
|
||||||
if(loiter_sum > loiter_total) {
|
|
||||||
loiter_total = 0;
|
|
||||||
gcs_send_text_P(SEVERITY_LOW,PSTR("verify_nav: LOITER orbits complete"));
|
|
||||||
// clear the command queue;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool verify_RTL()
|
static bool verify_RTL()
|
||||||
{
|
{
|
||||||
if (wp_distance <= g.waypoint_radius) {
|
if (wp_distance <= g.waypoint_radius) {
|
||||||
|
@ -361,7 +277,7 @@ static void do_within_distance()
|
||||||
|
|
||||||
static bool verify_wait_delay()
|
static bool verify_wait_delay()
|
||||||
{
|
{
|
||||||
if ((unsigned)(millis() - condition_start) > condition_value){
|
if ((uint32_t)(millis() - condition_start) > (uint32_t)condition_value){
|
||||||
condition_value = 0;
|
condition_value = 0;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -390,11 +306,6 @@ static bool verify_within_distance()
|
||||||
// Do (Now) commands
|
// Do (Now) commands
|
||||||
/********************************************************************************/
|
/********************************************************************************/
|
||||||
|
|
||||||
static void do_loiter_at_location()
|
|
||||||
{
|
|
||||||
next_WP = current_loc;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void do_jump()
|
static void do_jump()
|
||||||
{
|
{
|
||||||
struct Location temp;
|
struct Location temp;
|
||||||
|
|
|
@ -649,19 +649,6 @@
|
||||||
# define WP_RADIUS_DEFAULT 30
|
# define WP_RADIUS_DEFAULT 30
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef LOITER_RADIUS_DEFAULT
|
|
||||||
# define LOITER_RADIUS_DEFAULT 60
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ALT_HOLD_HOME
|
|
||||||
# define ALT_HOLD_HOME 100
|
|
||||||
#endif
|
|
||||||
#define ALT_HOLD_HOME_CM ALT_HOLD_HOME*100
|
|
||||||
|
|
||||||
#ifndef USE_CURRENT_ALT
|
|
||||||
# define USE_CURRENT_ALT FALSE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
// Developer Items
|
// Developer Items
|
||||||
//
|
//
|
||||||
|
|
|
@ -12,7 +12,6 @@
|
||||||
#define ToDeg(x) (x*57.2957795131) // *180/pi
|
#define ToDeg(x) (x*57.2957795131) // *180/pi
|
||||||
|
|
||||||
#define DEBUG 0
|
#define DEBUG 0
|
||||||
#define LOITER_RANGE 60 // for calculating power outside of loiter radius
|
|
||||||
#define SERVO_MAX 4500 // This value represents 45 degrees and is just an arbitrary representation of servo max travel.
|
#define SERVO_MAX 4500 // This value represents 45 degrees and is just an arbitrary representation of servo max travel.
|
||||||
|
|
||||||
// failsafe
|
// failsafe
|
||||||
|
@ -98,7 +97,6 @@
|
||||||
|
|
||||||
#define AUTO 10
|
#define AUTO 10
|
||||||
#define RTL 11
|
#define RTL 11
|
||||||
#define LOITER 12
|
|
||||||
#define GUIDED 15
|
#define GUIDED 15
|
||||||
#define INITIALISING 16 // in startup routines
|
#define INITIALISING 16 // in startup routines
|
||||||
#define HEADALT 17 // Lock the current heading and altitude
|
#define HEADALT 17 // Lock the current heading and altitude
|
||||||
|
|
|
@ -15,7 +15,6 @@ static void failsafe_short_on_event(int fstype)
|
||||||
|
|
||||||
case AUTO:
|
case AUTO:
|
||||||
case GUIDED:
|
case GUIDED:
|
||||||
case LOITER:
|
|
||||||
if(g.short_fs_action == 1) {
|
if(g.short_fs_action == 1) {
|
||||||
set_mode(RTL);
|
set_mode(RTL);
|
||||||
}
|
}
|
||||||
|
@ -45,7 +44,6 @@ static void failsafe_long_on_event(int fstype)
|
||||||
|
|
||||||
case AUTO:
|
case AUTO:
|
||||||
case GUIDED:
|
case GUIDED:
|
||||||
case LOITER:
|
|
||||||
if(g.long_fs_action == 1) {
|
if(g.long_fs_action == 1) {
|
||||||
set_mode(RTL);
|
set_mode(RTL);
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,23 +13,16 @@ static void navigate()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if HIL_MODE != HIL_MODE_ATTITUDE
|
|
||||||
if ((next_WP.lat == 0)||(home_is_set==false)){
|
if ((next_WP.lat == 0)||(home_is_set==false)){
|
||||||
#else
|
|
||||||
if(next_WP.lat == 0){
|
|
||||||
#endif
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(control_mode < INITIALISING) {
|
|
||||||
|
|
||||||
// waypoint distance from plane
|
// waypoint distance from plane
|
||||||
// ----------------------------
|
// ----------------------------
|
||||||
wp_distance = get_distance(¤t_loc, &next_WP);
|
wp_distance = get_distance(¤t_loc, &next_WP);
|
||||||
|
|
||||||
if (wp_distance < 0){
|
if (wp_distance < 0){
|
||||||
gcs_send_text_P(SEVERITY_HIGH,PSTR("<navigate> WP error - distance < 0"));
|
gcs_send_text_P(SEVERITY_HIGH,PSTR("<navigate> WP error - distance < 0"));
|
||||||
//cliSerial->println(wp_distance,DEC);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,34 +34,12 @@ static void navigate()
|
||||||
// ------------------------------------------
|
// ------------------------------------------
|
||||||
nav_bearing = target_bearing;
|
nav_bearing = target_bearing;
|
||||||
|
|
||||||
// check if we have missed the WP
|
|
||||||
loiter_delta = (target_bearing - old_target_bearing)/100;
|
|
||||||
|
|
||||||
// reset the old value
|
|
||||||
old_target_bearing = target_bearing;
|
|
||||||
|
|
||||||
// wrap values
|
|
||||||
if (loiter_delta > 180) loiter_delta -= 360;
|
|
||||||
if (loiter_delta < -180) loiter_delta += 360;
|
|
||||||
loiter_sum += abs(loiter_delta);
|
|
||||||
}
|
|
||||||
|
|
||||||
// control mode specific updates to nav_bearing
|
// control mode specific updates to nav_bearing
|
||||||
// --------------------------------------------
|
// --------------------------------------------
|
||||||
update_navigation();
|
update_navigation();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
// Disabled for now
|
|
||||||
void calc_distance_error()
|
|
||||||
{
|
|
||||||
distance_estimate += (float)ground_speed * .0002 * cos(radians(bearing_error * .01));
|
|
||||||
distance_estimate -= DST_EST_GAIN * (float)(distance_estimate - GPS_wp_distance);
|
|
||||||
wp_distance = max(distance_estimate,10);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void calc_gndspeed_undershoot()
|
static void calc_gndspeed_undershoot()
|
||||||
{
|
{
|
||||||
if (g_gps->status() == GPS::GPS_OK) {
|
if (g_gps->status() == GPS::GPS_OK) {
|
||||||
|
@ -97,36 +68,6 @@ static long wrap_180(long error)
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void update_loiter()
|
|
||||||
{
|
|
||||||
float power;
|
|
||||||
|
|
||||||
if(wp_distance <= g.loiter_radius){
|
|
||||||
power = float(wp_distance) / float(g.loiter_radius);
|
|
||||||
power = constrain(power, 0.5, 1);
|
|
||||||
nav_bearing += (int)(9000.0 * (2.0 + power));
|
|
||||||
}else if(wp_distance < (g.loiter_radius + LOITER_RANGE)){
|
|
||||||
power = -((float)(wp_distance - g.loiter_radius - LOITER_RANGE) / LOITER_RANGE);
|
|
||||||
power = constrain(power, 0.5, 1); //power = constrain(power, 0, 1);
|
|
||||||
nav_bearing -= power * 9000;
|
|
||||||
|
|
||||||
}else{
|
|
||||||
update_crosstrack();
|
|
||||||
loiter_time = millis(); // keep start time for loiter updating till we get within LOITER_RANGE of orbit
|
|
||||||
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
if (wp_distance < g.loiter_radius){
|
|
||||||
nav_bearing += 9000;
|
|
||||||
}else{
|
|
||||||
nav_bearing -= 100 * M_PI / 180 * asin(g.loiter_radius / wp_distance);
|
|
||||||
}
|
|
||||||
|
|
||||||
update_crosstrack();
|
|
||||||
*/
|
|
||||||
nav_bearing = wrap_360(nav_bearing);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void update_crosstrack(void)
|
static void update_crosstrack(void)
|
||||||
{
|
{
|
||||||
// Crosstrack Error
|
// Crosstrack Error
|
||||||
|
|
|
@ -228,12 +228,11 @@ setup_flightmodes(uint8_t argc, const Menu::arg *argv)
|
||||||
mode != CIRCLE &&
|
mode != CIRCLE &&
|
||||||
mode != LEARNING &&
|
mode != LEARNING &&
|
||||||
mode != AUTO &&
|
mode != AUTO &&
|
||||||
mode != RTL &&
|
mode != RTL)
|
||||||
mode != LOITER)
|
|
||||||
{
|
{
|
||||||
if (mode < MANUAL)
|
if (mode < MANUAL)
|
||||||
mode = LOITER;
|
mode = RTL;
|
||||||
else if (mode >LOITER)
|
else if (mode > RTL)
|
||||||
mode = MANUAL;
|
mode = MANUAL;
|
||||||
else
|
else
|
||||||
mode += radioInputSwitch;
|
mode += radioInputSwitch;
|
||||||
|
|
|
@ -316,7 +316,6 @@ test_wp(uint8_t argc, const Menu::arg *argv)
|
||||||
|
|
||||||
cliSerial->printf_P(PSTR("%d waypoints\n"), (int)g.command_total);
|
cliSerial->printf_P(PSTR("%d waypoints\n"), (int)g.command_total);
|
||||||
cliSerial->printf_P(PSTR("Hit radius: %d\n"), (int)g.waypoint_radius);
|
cliSerial->printf_P(PSTR("Hit radius: %d\n"), (int)g.waypoint_radius);
|
||||||
cliSerial->printf_P(PSTR("Loiter radius: %d\n\n"), (int)g.loiter_radius);
|
|
||||||
|
|
||||||
for(byte i = 0; i <= g.command_total; i++){
|
for(byte i = 0; i <= g.command_total; i++){
|
||||||
struct Location temp = get_cmd_with_index(i);
|
struct Location temp = get_cmd_with_index(i);
|
||||||
|
|
Loading…
Reference in New Issue