mirror of
https://github.com/ArduPilot/ardupilot
synced 2025-02-23 16:23:56 -04:00
Removed Simple Mode
Added Simple option to mode switch positions removed unused OptFlow code added reset lat and lon error removed unused init_auto Fixed log formatting Added simple mode bitmask removed pitchmax added CLI setup for enabling Simple mode to any switch position
This commit is contained in:
parent
bca934b538
commit
ae81a758de
@ -46,10 +46,17 @@
|
|||||||
CH6_TRAVERSE_SPEED
|
CH6_TRAVERSE_SPEED
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
# define CH7_OPTION DO_SET_HOVER
|
||||||
|
/*
|
||||||
|
DO_SET_HOVER
|
||||||
|
DO_FLIP
|
||||||
|
SIMPLE_MODE_CONTROL
|
||||||
|
*/
|
||||||
|
|
||||||
// See the config.h and defines.h files for how to set this up!
|
// See the config.h and defines.h files for how to set this up!
|
||||||
//
|
//
|
||||||
// lets use SIMPLE mode for Roll and Pitch during Alt Hold
|
// lets use SIMPLE mode for Roll and Pitch during Alt Hold
|
||||||
#define ALT_HOLD_RP ROLL_PITCH_SIMPLE
|
//#define ALT_HOLD_RP ROLL_PITCH_SIMPLE
|
||||||
|
|
||||||
// lets use Manual throttle during Loiter
|
// lets use Manual throttle during Loiter
|
||||||
//#define LOITER_THR THROTTLE_MANUAL
|
//#define LOITER_THR THROTTLE_MANUAL
|
||||||
|
@ -237,7 +237,6 @@ static const char *comma = ",";
|
|||||||
static const char* flight_mode_strings[] = {
|
static const char* flight_mode_strings[] = {
|
||||||
"STABILIZE",
|
"STABILIZE",
|
||||||
"ACRO",
|
"ACRO",
|
||||||
"SIMPLE",
|
|
||||||
"ALT_HOLD",
|
"ALT_HOLD",
|
||||||
"AUTO",
|
"AUTO",
|
||||||
"GUIDED",
|
"GUIDED",
|
||||||
@ -275,6 +274,7 @@ static byte control_mode = STABILIZE;
|
|||||||
static byte old_control_mode = STABILIZE;
|
static byte old_control_mode = STABILIZE;
|
||||||
static byte oldSwitchPosition; // for remembering the control mode switch
|
static byte oldSwitchPosition; // for remembering the control mode switch
|
||||||
static int motor_out[8];
|
static int motor_out[8];
|
||||||
|
static bool do_simple = false;
|
||||||
|
|
||||||
// Heli
|
// Heli
|
||||||
// ----
|
// ----
|
||||||
@ -338,7 +338,7 @@ static float cos_pitch_x = 1;
|
|||||||
static float cos_yaw_x = 1;
|
static float cos_yaw_x = 1;
|
||||||
static float sin_pitch_y, sin_yaw_y, sin_roll_y;
|
static float sin_pitch_y, sin_yaw_y, sin_roll_y;
|
||||||
static long initial_simple_bearing; // used for Simple mode
|
static long initial_simple_bearing; // used for Simple mode
|
||||||
|
static float boost; // used to give a little extra to maintain altitude
|
||||||
|
|
||||||
// Acro
|
// Acro
|
||||||
#if CH7_OPTION == DO_FLIP
|
#if CH7_OPTION == DO_FLIP
|
||||||
@ -493,7 +493,7 @@ static int gps_fix_count;
|
|||||||
static unsigned long fast_loopTimer; // Time in miliseconds of main control loop
|
static unsigned long fast_loopTimer; // Time in miliseconds of main control loop
|
||||||
static unsigned long fast_loopTimeStamp; // Time Stamp when fast loop was complete
|
static unsigned long fast_loopTimeStamp; // Time Stamp when fast loop was complete
|
||||||
static uint8_t delta_ms_fast_loop; // Delta Time in miliseconds
|
static uint8_t delta_ms_fast_loop; // Delta Time in miliseconds
|
||||||
static int mainLoop_count;
|
//static int mainLoop_count;
|
||||||
|
|
||||||
static unsigned long medium_loopTimer; // Time in miliseconds of navigation control loop
|
static unsigned long medium_loopTimer; // Time in miliseconds of navigation control loop
|
||||||
static byte medium_loopCounter; // Counters for branching from main control loop to slower loops
|
static byte medium_loopCounter; // Counters for branching from main control loop to slower loops
|
||||||
@ -504,7 +504,6 @@ static uint8_t delta_ms_fiftyhz;
|
|||||||
|
|
||||||
static byte slow_loopCounter;
|
static byte slow_loopCounter;
|
||||||
static int superslow_loopCounter;
|
static int superslow_loopCounter;
|
||||||
static byte alt_timer; // for limiting the execution of flight mode thingys
|
|
||||||
static byte simple_timer; // for limiting the execution of flight mode thingys
|
static byte simple_timer; // for limiting the execution of flight mode thingys
|
||||||
|
|
||||||
|
|
||||||
@ -533,12 +532,7 @@ void loop()
|
|||||||
//PORTK |= B00010000;
|
//PORTK |= B00010000;
|
||||||
delta_ms_fast_loop = millis() - fast_loopTimer;
|
delta_ms_fast_loop = millis() - fast_loopTimer;
|
||||||
fast_loopTimer = millis();
|
fast_loopTimer = millis();
|
||||||
//load = float(fast_loopTimeStamp - fast_loopTimer) / delta_ms_fast_loop;
|
|
||||||
G_Dt = (float)delta_ms_fast_loop / 1000.f; // used by DCM integrator
|
G_Dt = (float)delta_ms_fast_loop / 1000.f; // used by DCM integrator
|
||||||
mainLoop_count++;
|
|
||||||
|
|
||||||
//if (delta_ms_fast_loop > 6)
|
|
||||||
// Log_Write_Performance();
|
|
||||||
|
|
||||||
// Execute the fast loop
|
// Execute the fast loop
|
||||||
// ---------------------
|
// ---------------------
|
||||||
@ -568,7 +562,7 @@ void loop()
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (millis() - perf_mon_timer > 20000) {
|
if (millis() - perf_mon_timer > 20000) {
|
||||||
if (mainLoop_count != 0) {
|
//if (mainLoop_count != 0) {
|
||||||
|
|
||||||
gcs.send_message(MSG_PERF_REPORT);
|
gcs.send_message(MSG_PERF_REPORT);
|
||||||
|
|
||||||
@ -576,7 +570,7 @@ void loop()
|
|||||||
Log_Write_Performance();
|
Log_Write_Performance();
|
||||||
|
|
||||||
resetPerfData();
|
resetPerfData();
|
||||||
}
|
//}
|
||||||
}
|
}
|
||||||
//PORTK &= B10111111;
|
//PORTK &= B10111111;
|
||||||
}
|
}
|
||||||
@ -610,7 +604,6 @@ static void fast_loop()
|
|||||||
// ---------------------------------------
|
// ---------------------------------------
|
||||||
update_yaw_mode();
|
update_yaw_mode();
|
||||||
update_roll_pitch_mode();
|
update_roll_pitch_mode();
|
||||||
update_throttle_mode();
|
|
||||||
|
|
||||||
// write out the servo PWM values
|
// write out the servo PWM values
|
||||||
// ------------------------------
|
// ------------------------------
|
||||||
@ -630,6 +623,12 @@ static void medium_loop()
|
|||||||
|
|
||||||
medium_loopCounter++;
|
medium_loopCounter++;
|
||||||
|
|
||||||
|
/*
|
||||||
|
if(g.optflow_enabled){
|
||||||
|
optflow.update()
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
if(GPS_enabled){
|
if(GPS_enabled){
|
||||||
update_GPS();
|
update_GPS();
|
||||||
}
|
}
|
||||||
@ -646,6 +645,10 @@ static void medium_loop()
|
|||||||
|
|
||||||
// auto_trim, uses an auto_level algorithm
|
// auto_trim, uses an auto_level algorithm
|
||||||
auto_trim();
|
auto_trim();
|
||||||
|
|
||||||
|
// record throttle output
|
||||||
|
// ------------------------------
|
||||||
|
throttle_integrator += g.rc_3.servo_out;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// This case performs some navigation computations
|
// This case performs some navigation computations
|
||||||
@ -654,13 +657,6 @@ static void medium_loop()
|
|||||||
loop_step = 2;
|
loop_step = 2;
|
||||||
medium_loopCounter++;
|
medium_loopCounter++;
|
||||||
|
|
||||||
// hack to stop navigation in Simple mode
|
|
||||||
if (control_mode == SIMPLE){
|
|
||||||
// clear GPS data
|
|
||||||
g_gps->new_data = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Auto control modes:
|
// Auto control modes:
|
||||||
if(g_gps->new_data && g_gps->fix){
|
if(g_gps->new_data && g_gps->fix){
|
||||||
loop_step = 11;
|
loop_step = 11;
|
||||||
@ -696,17 +692,14 @@ static void medium_loop()
|
|||||||
// --------------------------
|
// --------------------------
|
||||||
update_altitude();
|
update_altitude();
|
||||||
|
|
||||||
// altitude smoothing
|
|
||||||
// ------------------
|
|
||||||
//calc_altitude_smoothing_error();
|
|
||||||
|
|
||||||
altitude_error = get_altitude_error();
|
|
||||||
|
|
||||||
//camera_stabilization();
|
|
||||||
|
|
||||||
// invalidate the throttle hold value
|
// invalidate the throttle hold value
|
||||||
// ----------------------------------
|
// ----------------------------------
|
||||||
invalid_throttle = true;
|
invalid_throttle = true;
|
||||||
|
|
||||||
|
// calc boost
|
||||||
|
// ----------
|
||||||
|
boost = get_angle_boost();
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// This case deals with sending high rate telemetry
|
// This case deals with sending high rate telemetry
|
||||||
@ -722,11 +715,13 @@ static void medium_loop()
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if HIL_MODE != HIL_MODE_ATTITUDE
|
#if HIL_MODE != HIL_MODE_ATTITUDE
|
||||||
if (g.log_bitmask & MASK_LOG_ATTITUDE_MED)
|
if(motor_armed){
|
||||||
Log_Write_Attitude();
|
if (g.log_bitmask & MASK_LOG_ATTITUDE_MED)
|
||||||
|
Log_Write_Attitude();
|
||||||
|
|
||||||
if (g.log_bitmask & MASK_LOG_CTUN && motor_armed)
|
if (g.log_bitmask & MASK_LOG_CTUN)
|
||||||
Log_Write_Control_Tuning();
|
Log_Write_Control_Tuning();
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if GCS_PROTOCOL == GCS_PROTOCOL_MAVLINK
|
#if GCS_PROTOCOL == GCS_PROTOCOL_MAVLINK
|
||||||
@ -785,9 +780,9 @@ static void medium_loop()
|
|||||||
// ---------------------------
|
// ---------------------------
|
||||||
static void fifty_hz_loop()
|
static void fifty_hz_loop()
|
||||||
{
|
{
|
||||||
// record throttle output
|
// moved to slower loop
|
||||||
// ------------------------------
|
// --------------------
|
||||||
throttle_integrator += g.rc_3.servo_out;
|
update_throttle_mode();
|
||||||
|
|
||||||
// Read Sonar
|
// Read Sonar
|
||||||
// ----------
|
// ----------
|
||||||
@ -1010,86 +1005,6 @@ static void update_GPS(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef OPTFLOW_ENABLED
|
|
||||||
// blend gps and optical flow location
|
|
||||||
void update_location(void)
|
|
||||||
{
|
|
||||||
//static int count = 0;
|
|
||||||
// get GPS position
|
|
||||||
if(GPS_enabled){
|
|
||||||
update_GPS();
|
|
||||||
}
|
|
||||||
|
|
||||||
if( g.optflow_enabled ) {
|
|
||||||
int32_t temp_lat, temp_lng, diff_lat, diff_lng;
|
|
||||||
|
|
||||||
// get optical flow position
|
|
||||||
optflow.read();
|
|
||||||
optflow.get_position(dcm.roll, dcm.pitch, dcm.yaw, current_loc.alt-home.alt);
|
|
||||||
|
|
||||||
// write to log
|
|
||||||
if (g.log_bitmask & MASK_LOG_OPTFLOW){
|
|
||||||
Log_Write_Optflow();
|
|
||||||
}
|
|
||||||
|
|
||||||
temp_lat = optflow_offset.lat + optflow.lat;
|
|
||||||
temp_lng = optflow_offset.lng + optflow.lng;
|
|
||||||
|
|
||||||
// if we have good GPS values, don't let optical flow position stray too far
|
|
||||||
if( GPS_enabled && g_gps->fix ) {
|
|
||||||
// ensure current location is within 3m of gps location
|
|
||||||
diff_lat = g_gps->latitude - temp_lat;
|
|
||||||
diff_lng = g_gps->longitude - temp_lng;
|
|
||||||
if( diff_lat > 300 ) {
|
|
||||||
optflow_offset.lat += diff_lat - 300;
|
|
||||||
//Serial.println("lat inc!");
|
|
||||||
}
|
|
||||||
if( diff_lat < -300 ) {
|
|
||||||
optflow_offset.lat += diff_lat + 300;
|
|
||||||
//Serial.println("lat dec!");
|
|
||||||
}
|
|
||||||
if( diff_lng > 300 ) {
|
|
||||||
optflow_offset.lng += diff_lng - 300;
|
|
||||||
//Serial.println("lng inc!");
|
|
||||||
}
|
|
||||||
if( diff_lng < -300 ) {
|
|
||||||
optflow_offset.lng += diff_lng + 300;
|
|
||||||
//Serial.println("lng dec!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// update the current position
|
|
||||||
current_loc.lat = optflow_offset.lat + optflow.lat;
|
|
||||||
current_loc.lng = optflow_offset.lng + optflow.lng;
|
|
||||||
|
|
||||||
/*count++;
|
|
||||||
if( count >= 20 ) {
|
|
||||||
count = 0;
|
|
||||||
Serial.println();
|
|
||||||
Serial.print("lat:");
|
|
||||||
Serial.print(current_loc.lat);
|
|
||||||
Serial.print("\tlng:");
|
|
||||||
Serial.print(current_loc.lng);
|
|
||||||
Serial.print("\tr:");
|
|
||||||
Serial.print(nav_roll);
|
|
||||||
Serial.print("\tp:");
|
|
||||||
Serial.print(nav_pitch);
|
|
||||||
Serial.println();
|
|
||||||
}*/
|
|
||||||
|
|
||||||
// indicate we have a new position for nav functions
|
|
||||||
new_location = true;
|
|
||||||
|
|
||||||
}else{
|
|
||||||
// get current position from gps
|
|
||||||
current_loc.lng = g_gps->longitude; // Lon * 10 * *7
|
|
||||||
current_loc.lat = g_gps->latitude; // Lat * 10 * *7
|
|
||||||
|
|
||||||
new_location = g_gps->new_data;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void update_yaw_mode(void)
|
void update_yaw_mode(void)
|
||||||
{
|
{
|
||||||
switch(yaw_mode){
|
switch(yaw_mode){
|
||||||
@ -1100,8 +1015,11 @@ void update_yaw_mode(void)
|
|||||||
|
|
||||||
case YAW_HOLD:
|
case YAW_HOLD:
|
||||||
// calcualte new nav_yaw offset
|
// calcualte new nav_yaw offset
|
||||||
nav_yaw = get_nav_yaw_offset(g.rc_4.control_in, g.rc_3.control_in);
|
if (control_mode <= STABILIZE){
|
||||||
//Serial.printf("n:%d %ld, ",g.rc_4.control_in, nav_yaw);
|
nav_yaw = get_nav_yaw_offset(g.rc_4.control_in, g.rc_3.control_in);
|
||||||
|
}else{
|
||||||
|
nav_yaw = get_nav_yaw_offset(g.rc_4.control_in, 1);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case YAW_LOOK_AT_HOME:
|
case YAW_LOOK_AT_HOME:
|
||||||
@ -1136,6 +1054,29 @@ void update_roll_pitch_mode(void)
|
|||||||
|
|
||||||
int control_roll = 0, control_pitch = 0;
|
int control_roll = 0, control_pitch = 0;
|
||||||
|
|
||||||
|
if(do_simple){
|
||||||
|
simple_timer++;
|
||||||
|
if(simple_timer > 5){
|
||||||
|
simple_timer = 0;
|
||||||
|
|
||||||
|
int delta = wrap_360(dcm.yaw_sensor - initial_simple_bearing)/100;
|
||||||
|
|
||||||
|
// pre-calc rotation (stored in real degrees)
|
||||||
|
// roll
|
||||||
|
float cos_x = sin(radians(90 - delta));
|
||||||
|
// pitch
|
||||||
|
float sin_y = cos(radians(90 - delta));
|
||||||
|
|
||||||
|
// Rotate input by the initial bearing
|
||||||
|
// roll
|
||||||
|
control_roll = g.rc_1.control_in * cos_x + g.rc_2.control_in * sin_y;
|
||||||
|
// pitch
|
||||||
|
control_pitch = -(g.rc_1.control_in * sin_y - g.rc_2.control_in * cos_x);
|
||||||
|
|
||||||
|
g.rc_1.control_in = control_roll;
|
||||||
|
g.rc_2.control_in = control_pitch;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
switch(roll_pitch_mode){
|
switch(roll_pitch_mode){
|
||||||
case ROLL_PITCH_ACRO:
|
case ROLL_PITCH_ACRO:
|
||||||
@ -1152,29 +1093,6 @@ void update_roll_pitch_mode(void)
|
|||||||
control_pitch = g.rc_2.control_in;
|
control_pitch = g.rc_2.control_in;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ROLL_PITCH_SIMPLE:
|
|
||||||
simple_timer++;
|
|
||||||
if(simple_timer > 5){
|
|
||||||
simple_timer = 0;
|
|
||||||
|
|
||||||
int delta = wrap_360(dcm.yaw_sensor - initial_simple_bearing)/100;
|
|
||||||
|
|
||||||
// pre-calc rotation (stored in real degrees)
|
|
||||||
// roll
|
|
||||||
float cos_x = sin(radians(90 - delta));
|
|
||||||
// pitch
|
|
||||||
float sin_y = cos(radians(90 - delta));
|
|
||||||
|
|
||||||
// Rotate input by the initial bearing
|
|
||||||
// roll
|
|
||||||
nav_roll = g.rc_1.control_in * cos_x + g.rc_2.control_in * sin_y;
|
|
||||||
// pitch
|
|
||||||
nav_pitch = -(g.rc_1.control_in * sin_y - g.rc_2.control_in * cos_x);
|
|
||||||
}
|
|
||||||
control_roll = nav_roll;
|
|
||||||
control_pitch = nav_pitch;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ROLL_PITCH_AUTO:
|
case ROLL_PITCH_AUTO:
|
||||||
// mix in user control with Nav control
|
// mix in user control with Nav control
|
||||||
control_roll = g.rc_1.control_mix(nav_roll);
|
control_roll = g.rc_1.control_mix(nav_roll);
|
||||||
@ -1194,7 +1112,7 @@ void update_throttle_mode(void)
|
|||||||
{
|
{
|
||||||
switch(throttle_mode){
|
switch(throttle_mode){
|
||||||
case THROTTLE_MANUAL:
|
case THROTTLE_MANUAL:
|
||||||
g.rc_3.servo_out = get_throttle(g.rc_3.control_in);
|
g.rc_3.servo_out = g.rc_3.control_in + boost;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case THROTTLE_HOLD:
|
case THROTTLE_HOLD:
|
||||||
@ -1204,16 +1122,20 @@ void update_throttle_mode(void)
|
|||||||
// fall through
|
// fall through
|
||||||
|
|
||||||
case THROTTLE_AUTO:
|
case THROTTLE_AUTO:
|
||||||
|
// 10hz, don't run up i term
|
||||||
if(invalid_throttle && motor_auto_armed == true){
|
if(invalid_throttle && motor_auto_armed == true){
|
||||||
|
// how far off are we
|
||||||
|
altitude_error = get_altitude_error();
|
||||||
|
|
||||||
// get the AP throttle
|
// get the AP throttle
|
||||||
nav_throttle = get_nav_throttle(altitude_error, 200); //150 = target speed of 1.5m/s
|
nav_throttle = get_nav_throttle(altitude_error, 200); //150 = target speed of 1.5m/s
|
||||||
|
|
||||||
// apply throttle control
|
|
||||||
g.rc_3.servo_out = get_throttle(nav_throttle);
|
|
||||||
|
|
||||||
// clear the new data flag
|
// clear the new data flag
|
||||||
invalid_throttle = false;
|
invalid_throttle = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// apply throttle control at 200 hz
|
||||||
|
g.rc_3.servo_out = g.throttle_cruise + nav_throttle + boost;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1237,6 +1159,11 @@ static void update_navigation()
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case GUIDED:
|
case GUIDED:
|
||||||
|
wp_control = WP_MODE;
|
||||||
|
update_auto_yaw();
|
||||||
|
update_nav_wp();
|
||||||
|
break;
|
||||||
|
|
||||||
case RTL:
|
case RTL:
|
||||||
if(wp_distance > 4){
|
if(wp_distance > 4){
|
||||||
// calculates desired Yaw
|
// calculates desired Yaw
|
||||||
@ -1251,7 +1178,6 @@ static void update_navigation()
|
|||||||
//xtrack_enabled = false;
|
//xtrack_enabled = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// calculates the desired Roll and Pitch
|
// calculates the desired Roll and Pitch
|
||||||
update_nav_wp();
|
update_nav_wp();
|
||||||
break;
|
break;
|
||||||
@ -1273,8 +1199,8 @@ static void update_navigation()
|
|||||||
//circle_angle += dTnav; //1000 * (dTnav/1000);
|
//circle_angle += dTnav; //1000 * (dTnav/1000);
|
||||||
circle_angle = wrap_360(target_bearing + 2000 + 18000);
|
circle_angle = wrap_360(target_bearing + 2000 + 18000);
|
||||||
|
|
||||||
target_WP.lng = next_WP.lng + g.loiter_radius * cos(radians(90 - circle_angle));
|
target_WP.lng = next_WP.lng + (g.loiter_radius * 100 * cos(radians(90 - circle_angle)));
|
||||||
target_WP.lat = next_WP.lat + g.loiter_radius * sin(radians(90 - circle_angle));
|
target_WP.lat = next_WP.lat + (g.loiter_radius * 100 * sin(radians(90 - circle_angle)));
|
||||||
}
|
}
|
||||||
|
|
||||||
// calc the lat and long error to the target
|
// calc the lat and long error to the target
|
||||||
@ -1379,18 +1305,13 @@ static void update_altitude()
|
|||||||
static void
|
static void
|
||||||
adjust_altitude()
|
adjust_altitude()
|
||||||
{
|
{
|
||||||
alt_timer++;
|
if(g.rc_3.control_in <= 200){
|
||||||
if(alt_timer >= 2){
|
next_WP.alt -= 1; // 1 meter per second
|
||||||
alt_timer = 0;
|
next_WP.alt = max(next_WP.alt, (current_loc.alt - 400)); // don't go less than 4 meters below current location
|
||||||
|
next_WP.alt = max(next_WP.alt, 100); // don't go less than 1 meter
|
||||||
if(g.rc_3.control_in <= 200){
|
}else if (g.rc_3.control_in > 700){
|
||||||
next_WP.alt -= 1; // 1 meter per second
|
next_WP.alt += 1; // 1 meter per second
|
||||||
next_WP.alt = max(next_WP.alt, (current_loc.alt - 400)); // don't go less than 4 meters below current location
|
next_WP.alt = min(next_WP.alt, (current_loc.alt + 400)); // don't go more than 4 meters below current location
|
||||||
next_WP.alt = max(next_WP.alt, 100); // don't go less than 1 meter
|
|
||||||
}else if (g.rc_3.control_in > 700){
|
|
||||||
next_WP.alt += 1; // 1 meter per second
|
|
||||||
next_WP.alt = min(next_WP.alt, (current_loc.alt + 400)); // don't go more than 4 meters below current location
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -91,7 +91,7 @@ static int
|
|||||||
get_nav_throttle(long z_error, int target_speed)
|
get_nav_throttle(long z_error, int target_speed)
|
||||||
{
|
{
|
||||||
int rate_error;
|
int rate_error;
|
||||||
int throttle;
|
//int throttle;
|
||||||
float scaler = (float)target_speed/(float)ALT_ERROR_MAX;
|
float scaler = (float)target_speed/(float)ALT_ERROR_MAX;
|
||||||
|
|
||||||
// limit error to prevent I term run up
|
// limit error to prevent I term run up
|
||||||
@ -101,8 +101,11 @@ get_nav_throttle(long z_error, int target_speed)
|
|||||||
rate_error = target_speed - altitude_rate;
|
rate_error = target_speed - altitude_rate;
|
||||||
rate_error = constrain(rate_error, -110, 110);
|
rate_error = constrain(rate_error, -110, 110);
|
||||||
|
|
||||||
throttle = g.pi_throttle.get_pi(rate_error, delta_ms_medium_loop);
|
//throttle = g.pi_throttle.get_pi(rate_error, delta_ms_medium_loop);
|
||||||
return g.throttle_cruise + throttle;
|
//return g.throttle_cruise + throttle;
|
||||||
|
|
||||||
|
|
||||||
|
return g.pi_throttle.get_pi(rate_error, delta_ms_medium_loop);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -156,10 +159,16 @@ static void reset_hold_I(void)
|
|||||||
|
|
||||||
// Zeros out navigation Integrators if we are changing mode, have passed a waypoint, etc.
|
// Zeros out navigation Integrators if we are changing mode, have passed a waypoint, etc.
|
||||||
// Keeps outdated data out of our calculations
|
// Keeps outdated data out of our calculations
|
||||||
static void reset_nav_I(void)
|
static void reset_nav(void)
|
||||||
{
|
{
|
||||||
|
nav_throttle = 0;
|
||||||
|
invalid_throttle = true;
|
||||||
|
|
||||||
g.pi_nav_lat.reset_I();
|
g.pi_nav_lat.reset_I();
|
||||||
g.pi_nav_lon.reset_I();
|
g.pi_nav_lon.reset_I();
|
||||||
|
|
||||||
|
long_error = 0;
|
||||||
|
lat_error = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -169,11 +178,11 @@ throttle control
|
|||||||
|
|
||||||
// user input:
|
// user input:
|
||||||
// -----------
|
// -----------
|
||||||
static int get_throttle(int throttle_input)
|
//static int get_throttle(int throttle_input)
|
||||||
{
|
//{
|
||||||
throttle_input = (float)throttle_input * angle_boost();
|
// throttle_input = (float)throttle_input * angle_boost();
|
||||||
return max(throttle_input, 0);
|
// return max(throttle_input, 0);
|
||||||
}
|
//}
|
||||||
|
|
||||||
static long
|
static long
|
||||||
get_nav_yaw_offset(int yaw_input, int reset)
|
get_nav_yaw_offset(int yaw_input, int reset)
|
||||||
@ -188,7 +197,7 @@ get_nav_yaw_offset(int yaw_input, int reset)
|
|||||||
// re-define nav_yaw if we have stick input
|
// re-define nav_yaw if we have stick input
|
||||||
if(yaw_input != 0){
|
if(yaw_input != 0){
|
||||||
// set nav_yaw + or - the current location
|
// set nav_yaw + or - the current location
|
||||||
_yaw = (long)yaw_input + dcm.yaw_sensor;
|
_yaw = (long)yaw_input + dcm.yaw_sensor;
|
||||||
// we need to wrap our value so we can be 0 to 360 (*100)
|
// we need to wrap our value so we can be 0 to 360 (*100)
|
||||||
return wrap_360(_yaw);
|
return wrap_360(_yaw);
|
||||||
|
|
||||||
@ -210,7 +219,7 @@ static int alt_hold_velocity()
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static float angle_boost()
|
static float get_angle_boost()
|
||||||
{
|
{
|
||||||
float temp = cos_pitch_x * cos_roll_x;
|
float temp = cos_pitch_x * cos_roll_x;
|
||||||
temp = 2.0 - constrain(temp, .5, 1.0);
|
temp = 2.0 - constrain(temp, .5, 1.0);
|
||||||
|
@ -365,16 +365,15 @@ static void Log_Write_GPS()
|
|||||||
DataFlash.WriteByte(LOG_GPS_MSG);
|
DataFlash.WriteByte(LOG_GPS_MSG);
|
||||||
|
|
||||||
DataFlash.WriteLong(g_gps->time); // 1
|
DataFlash.WriteLong(g_gps->time); // 1
|
||||||
DataFlash.WriteByte(g_gps->fix); // 2
|
DataFlash.WriteByte(g_gps->num_sats); // 2
|
||||||
DataFlash.WriteByte(g_gps->num_sats); // 3
|
|
||||||
|
|
||||||
DataFlash.WriteLong(current_loc.lat); // 4
|
DataFlash.WriteLong(current_loc.lat); // 3
|
||||||
DataFlash.WriteLong(current_loc.lng); // 5
|
DataFlash.WriteLong(current_loc.lng); // 4
|
||||||
DataFlash.WriteLong(current_loc.alt); // 7
|
DataFlash.WriteLong(current_loc.alt); // 5
|
||||||
DataFlash.WriteLong(g_gps->altitude); // 6
|
DataFlash.WriteLong(g_gps->altitude); // 6
|
||||||
|
|
||||||
DataFlash.WriteInt(g_gps->ground_speed); // 8
|
DataFlash.WriteInt(g_gps->ground_speed); // 7
|
||||||
DataFlash.WriteInt((uint16_t)g_gps->ground_course); // 9
|
DataFlash.WriteInt((uint16_t)g_gps->ground_course); // 8
|
||||||
|
|
||||||
DataFlash.WriteByte(END_BYTE);
|
DataFlash.WriteByte(END_BYTE);
|
||||||
}
|
}
|
||||||
@ -382,21 +381,20 @@ static void Log_Write_GPS()
|
|||||||
// Read a GPS packet
|
// Read a GPS packet
|
||||||
static void Log_Read_GPS()
|
static void Log_Read_GPS()
|
||||||
{
|
{
|
||||||
Serial.printf_P(PSTR("GPS, %ld, %d, %d, "
|
Serial.printf_P(PSTR("GPS, %ld, %d, "
|
||||||
"%4.7f, %4.7f, %4.4f, %4.4f, "
|
"%4.7f, %4.7f, %4.4f, %4.4f, "
|
||||||
"%d, %u\n"),
|
"%d, %u\n"),
|
||||||
|
|
||||||
DataFlash.ReadLong(), // 1 time
|
DataFlash.ReadLong(), // 1 time
|
||||||
(int)DataFlash.ReadByte(), // 2 fix
|
(int)DataFlash.ReadByte(), // 2 sats
|
||||||
(int)DataFlash.ReadByte(), // 3 sats
|
|
||||||
|
|
||||||
(float)DataFlash.ReadLong() / t7, // 4 lat
|
(float)DataFlash.ReadLong() / t7, // 3 lat
|
||||||
(float)DataFlash.ReadLong() / t7, // 5 lon
|
(float)DataFlash.ReadLong() / t7, // 4 lon
|
||||||
(float)DataFlash.ReadLong() / 100.0, // 6 gps alt
|
(float)DataFlash.ReadLong() / 100.0, // 5 gps alt
|
||||||
(float)DataFlash.ReadLong() / 100.0, // 7 sensor alt
|
(float)DataFlash.ReadLong() / 100.0, // 6 sensor alt
|
||||||
|
|
||||||
DataFlash.ReadInt(), // 8 ground speed
|
DataFlash.ReadInt(), // 7 ground speed
|
||||||
(uint16_t)DataFlash.ReadInt()); // 9 ground course
|
(uint16_t)DataFlash.ReadInt()); // 8 ground course
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -514,7 +512,7 @@ static void Log_Write_Optflow()
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Read an attitude packet
|
|
||||||
static void Log_Read_Optflow()
|
static void Log_Read_Optflow()
|
||||||
{
|
{
|
||||||
Serial.printf_P(PSTR("OF, %d, %d, %d, %4.7f, %4.7f\n"),
|
Serial.printf_P(PSTR("OF, %d, %d, %d, %4.7f, %4.7f\n"),
|
||||||
@ -609,23 +607,18 @@ static void Log_Write_Control_Tuning()
|
|||||||
DataFlash.WriteByte(HEAD_BYTE2);
|
DataFlash.WriteByte(HEAD_BYTE2);
|
||||||
DataFlash.WriteByte(LOG_CONTROL_TUNING_MSG);
|
DataFlash.WriteByte(LOG_CONTROL_TUNING_MSG);
|
||||||
|
|
||||||
// Control
|
|
||||||
//DataFlash.WriteInt((int)(g.rc_4.control_in/100));
|
|
||||||
//DataFlash.WriteInt((int)(g.rc_4.servo_out/100));
|
|
||||||
|
|
||||||
// yaw
|
// yaw
|
||||||
DataFlash.WriteInt((int)(dcm.yaw_sensor/100));
|
DataFlash.WriteInt((int)(dcm.yaw_sensor/100)); //1
|
||||||
DataFlash.WriteInt((int)(nav_yaw/100));
|
DataFlash.WriteInt((int)(nav_yaw/100)); //2
|
||||||
DataFlash.WriteInt((int)yaw_error/100);
|
DataFlash.WriteInt((int)yaw_error/100); //3
|
||||||
|
|
||||||
// Alt hold
|
// Alt hold
|
||||||
DataFlash.WriteInt(g.rc_3.servo_out);
|
DataFlash.WriteInt(g.rc_3.servo_out); //4
|
||||||
DataFlash.WriteInt(sonar_alt); //
|
DataFlash.WriteInt(sonar_alt); //5
|
||||||
DataFlash.WriteInt(baro_alt); //
|
DataFlash.WriteInt(baro_alt); //6
|
||||||
|
|
||||||
DataFlash.WriteInt((int)next_WP.alt); //
|
DataFlash.WriteInt((int)next_WP.alt); //7
|
||||||
//DataFlash.WriteInt((int)altitude_error); //
|
DataFlash.WriteInt((int)g.pi_throttle.get_integrator());//8
|
||||||
DataFlash.WriteInt((int)g.pi_throttle.get_integrator());
|
|
||||||
|
|
||||||
DataFlash.WriteByte(END_BYTE);
|
DataFlash.WriteByte(END_BYTE);
|
||||||
}
|
}
|
||||||
@ -635,10 +628,9 @@ static void Log_Write_Control_Tuning()
|
|||||||
static void Log_Read_Control_Tuning()
|
static void Log_Read_Control_Tuning()
|
||||||
{
|
{
|
||||||
Serial.printf_P(PSTR( "CTUN, "
|
Serial.printf_P(PSTR( "CTUN, "
|
||||||
//"%d, %d, "
|
|
||||||
"%d, %d, %d, "
|
"%d, %d, %d, "
|
||||||
"%d, %d, %d, "
|
"%d, %d, %d, "
|
||||||
"%d, %d, %d\n"),
|
"%d, %d\n"),
|
||||||
|
|
||||||
// Control
|
// Control
|
||||||
DataFlash.ReadInt(),
|
DataFlash.ReadInt(),
|
||||||
@ -670,21 +662,18 @@ static void Log_Write_Performance()
|
|||||||
|
|
||||||
|
|
||||||
//*
|
//*
|
||||||
DataFlash.WriteLong( millis()- perf_mon_timer);
|
//DataFlash.WriteLong( millis()- perf_mon_timer);
|
||||||
DataFlash.WriteInt ( mainLoop_count);
|
//DataFlash.WriteInt ( mainLoop_count);
|
||||||
DataFlash.WriteInt ( G_Dt_max);
|
DataFlash.WriteInt ( G_Dt_max); //1
|
||||||
|
|
||||||
DataFlash.WriteByte( dcm.gyro_sat_count);
|
DataFlash.WriteByte( dcm.gyro_sat_count); //2
|
||||||
DataFlash.WriteByte( imu.adc_constraints);
|
DataFlash.WriteByte( imu.adc_constraints); //3
|
||||||
DataFlash.WriteByte( dcm.renorm_sqrt_count);
|
DataFlash.WriteByte( dcm.renorm_sqrt_count); //4
|
||||||
DataFlash.WriteByte( dcm.renorm_blowup_count);
|
DataFlash.WriteByte( dcm.renorm_blowup_count); //5
|
||||||
DataFlash.WriteByte( gps_fix_count);
|
DataFlash.WriteByte( gps_fix_count); //6
|
||||||
|
|
||||||
DataFlash.WriteInt ( (int)(dcm.get_health() * 1000));
|
DataFlash.WriteInt ( (int)(dcm.get_health() * 1000)); //7
|
||||||
DataFlash.WriteLong ( throttle_integrator);
|
DataFlash.WriteLong ( throttle_integrator); //8
|
||||||
|
|
||||||
//*/
|
|
||||||
//PM, 20005, 3742, 10,0,0,0,0,89,1000,
|
|
||||||
|
|
||||||
DataFlash.WriteByte(END_BYTE);
|
DataFlash.WriteByte(END_BYTE);
|
||||||
}
|
}
|
||||||
@ -692,24 +681,23 @@ static void Log_Write_Performance()
|
|||||||
// Read a performance packet
|
// Read a performance packet
|
||||||
static void Log_Read_Performance()
|
static void Log_Read_Performance()
|
||||||
{
|
{
|
||||||
Serial.printf_P(PSTR( "PM, %ld, %d, %d, "
|
Serial.printf_P(PSTR( "PM, %d, %d, %d, "
|
||||||
"%d, %d, %d, %d, %d, "
|
"%d, %d, %d, "
|
||||||
"%d, %ld\n"),
|
"%d, %ld\n"),
|
||||||
|
|
||||||
// Control
|
// Control
|
||||||
DataFlash.ReadLong(),
|
//DataFlash.ReadLong(),
|
||||||
DataFlash.ReadInt(),
|
//DataFlash.ReadInt(),
|
||||||
DataFlash.ReadInt(),
|
DataFlash.ReadInt(), //1
|
||||||
|
DataFlash.ReadByte(), //2
|
||||||
|
DataFlash.ReadByte(), //3
|
||||||
|
|
||||||
DataFlash.ReadByte(),
|
DataFlash.ReadByte(), //4
|
||||||
DataFlash.ReadByte(),
|
DataFlash.ReadByte(), //5
|
||||||
|
DataFlash.ReadByte(), //6
|
||||||
|
|
||||||
DataFlash.ReadByte(),
|
DataFlash.ReadInt(), //7
|
||||||
DataFlash.ReadByte(),
|
DataFlash.ReadLong()); //8
|
||||||
DataFlash.ReadByte(),
|
|
||||||
|
|
||||||
DataFlash.ReadInt(),
|
|
||||||
DataFlash.ReadLong());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write a command processing packet.
|
// Write a command processing packet.
|
||||||
@ -760,19 +748,28 @@ static void Log_Write_Attitude()
|
|||||||
DataFlash.WriteByte(HEAD_BYTE1);
|
DataFlash.WriteByte(HEAD_BYTE1);
|
||||||
DataFlash.WriteByte(HEAD_BYTE2);
|
DataFlash.WriteByte(HEAD_BYTE2);
|
||||||
DataFlash.WriteByte(LOG_ATTITUDE_MSG);
|
DataFlash.WriteByte(LOG_ATTITUDE_MSG);
|
||||||
|
|
||||||
DataFlash.WriteInt((int)dcm.roll_sensor);
|
DataFlash.WriteInt((int)dcm.roll_sensor);
|
||||||
DataFlash.WriteInt((int)dcm.pitch_sensor);
|
DataFlash.WriteInt((int)dcm.pitch_sensor);
|
||||||
DataFlash.WriteInt((uint16_t)dcm.yaw_sensor);
|
DataFlash.WriteInt((uint16_t)dcm.yaw_sensor);
|
||||||
|
|
||||||
|
DataFlash.WriteInt((int)g.rc_1.servo_out);
|
||||||
|
DataFlash.WriteInt((int)g.rc_2.servo_out);
|
||||||
|
DataFlash.WriteInt((int)g.rc_4.servo_out);
|
||||||
|
|
||||||
DataFlash.WriteByte(END_BYTE);
|
DataFlash.WriteByte(END_BYTE);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read an attitude packet
|
// Read an attitude packet
|
||||||
static void Log_Read_Attitude()
|
static void Log_Read_Attitude()
|
||||||
{
|
{
|
||||||
Serial.printf_P(PSTR("ATT, %d, %d, %u\n"),
|
Serial.printf_P(PSTR("ATT, %d, %d, %u, %d, %d, $d\n"),
|
||||||
DataFlash.ReadInt(),
|
DataFlash.ReadInt(),
|
||||||
DataFlash.ReadInt(),
|
DataFlash.ReadInt(),
|
||||||
(uint16_t)DataFlash.ReadInt());
|
(uint16_t)DataFlash.ReadInt(),
|
||||||
|
DataFlash.ReadInt(),
|
||||||
|
DataFlash.ReadInt(),
|
||||||
|
DataFlash.ReadInt());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write a mode packet. Total length : 5 bytes
|
// Write a mode packet. Total length : 5 bytes
|
||||||
@ -827,6 +824,8 @@ static void Log_Read(int start_page, int end_page)
|
|||||||
case 0:
|
case 0:
|
||||||
if(data == HEAD_BYTE1) // Head byte 1
|
if(data == HEAD_BYTE1) // Head byte 1
|
||||||
log_step++;
|
log_step++;
|
||||||
|
else
|
||||||
|
Serial.println(".");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
|
@ -83,7 +83,6 @@ public:
|
|||||||
// 160: Navigation parameters
|
// 160: Navigation parameters
|
||||||
//
|
//
|
||||||
k_param_crosstrack_entry_angle = 160,
|
k_param_crosstrack_entry_angle = 160,
|
||||||
k_param_pitch_max,
|
|
||||||
k_param_RTL_altitude,
|
k_param_RTL_altitude,
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -139,7 +138,7 @@ public:
|
|||||||
k_param_flight_mode4,
|
k_param_flight_mode4,
|
||||||
k_param_flight_mode5,
|
k_param_flight_mode5,
|
||||||
k_param_flight_mode6,
|
k_param_flight_mode6,
|
||||||
|
k_param_simple_modes,
|
||||||
|
|
||||||
//
|
//
|
||||||
// 220: Waypoint data
|
// 220: Waypoint data
|
||||||
@ -179,7 +178,7 @@ public:
|
|||||||
//
|
//
|
||||||
AP_Int16 sysid_this_mav;
|
AP_Int16 sysid_this_mav;
|
||||||
AP_Int16 sysid_my_gcs;
|
AP_Int16 sysid_my_gcs;
|
||||||
AP_Int8 serial3_baud;
|
AP_Int8 serial3_baud;
|
||||||
|
|
||||||
|
|
||||||
// Crosstrack navigation
|
// Crosstrack navigation
|
||||||
@ -213,6 +212,7 @@ public:
|
|||||||
AP_Int8 flight_mode4;
|
AP_Int8 flight_mode4;
|
||||||
AP_Int8 flight_mode5;
|
AP_Int8 flight_mode5;
|
||||||
AP_Int8 flight_mode6;
|
AP_Int8 flight_mode6;
|
||||||
|
AP_Int8 simple_modes;
|
||||||
|
|
||||||
// Radio settings
|
// Radio settings
|
||||||
//
|
//
|
||||||
@ -221,8 +221,6 @@ public:
|
|||||||
//AP_Var_group pwm_throttle;
|
//AP_Var_group pwm_throttle;
|
||||||
//AP_Var_group pwm_yaw;
|
//AP_Var_group pwm_yaw;
|
||||||
|
|
||||||
AP_Int16 pitch_max;
|
|
||||||
|
|
||||||
// Misc
|
// Misc
|
||||||
//
|
//
|
||||||
AP_Int16 log_bitmask;
|
AP_Int16 log_bitmask;
|
||||||
@ -324,8 +322,7 @@ public:
|
|||||||
flight_mode4 (FLIGHT_MODE_4, k_param_flight_mode4, PSTR("FLTMODE4")),
|
flight_mode4 (FLIGHT_MODE_4, k_param_flight_mode4, PSTR("FLTMODE4")),
|
||||||
flight_mode5 (FLIGHT_MODE_5, k_param_flight_mode5, PSTR("FLTMODE5")),
|
flight_mode5 (FLIGHT_MODE_5, k_param_flight_mode5, PSTR("FLTMODE5")),
|
||||||
flight_mode6 (FLIGHT_MODE_6, k_param_flight_mode6, PSTR("FLTMODE6")),
|
flight_mode6 (FLIGHT_MODE_6, k_param_flight_mode6, PSTR("FLTMODE6")),
|
||||||
|
simple_modes (0, k_param_simple_modes, PSTR("SIMPLE")),
|
||||||
pitch_max (PITCH_MAX * 100, k_param_pitch_max, PSTR("PITCH_MAX")),
|
|
||||||
|
|
||||||
log_bitmask (DEFAULT_LOG_BITMASK, k_param_log_bitmask, PSTR("LOG_BITMASK")),
|
log_bitmask (DEFAULT_LOG_BITMASK, k_param_log_bitmask, PSTR("LOG_BITMASK")),
|
||||||
RTL_altitude (ALT_HOLD_HOME * 100, k_param_RTL_altitude, PSTR("ALT_HOLD_RTL")),
|
RTL_altitude (ALT_HOLD_HOME * 100, k_param_RTL_altitude, PSTR("ALT_HOLD_RTL")),
|
||||||
|
@ -1,18 +1,5 @@
|
|||||||
// -*- tab-width: 4; Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*-
|
// -*- tab-width: 4; Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*-
|
||||||
|
|
||||||
|
|
||||||
/*static void init_auto()
|
|
||||||
{
|
|
||||||
//if (g.waypoint_index == g.waypoint_total) {
|
|
||||||
// do_RTL();
|
|
||||||
//}
|
|
||||||
|
|
||||||
// initialize commands
|
|
||||||
// -------------------
|
|
||||||
init_commands();
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
static void init_commands()
|
static void init_commands()
|
||||||
{
|
{
|
||||||
// zero is home, but we always load the next command (1), in the code.
|
// zero is home, but we always load the next command (1), in the code.
|
||||||
|
@ -311,13 +311,10 @@ static void do_loiter_turns()
|
|||||||
|
|
||||||
static void do_loiter_time()
|
static void do_loiter_time()
|
||||||
{
|
{
|
||||||
///*
|
wp_control = LOITER_MODE;
|
||||||
wp_control = LOITER_MODE;
|
|
||||||
set_next_WP(¤t_loc);
|
set_next_WP(¤t_loc);
|
||||||
loiter_time = millis();
|
loiter_time = millis();
|
||||||
loiter_time_max = next_command.p1 * 1000; // units are (seconds)
|
loiter_time_max = next_command.p1 * 1000; // units are (seconds)
|
||||||
//Serial.printf("dlt %ld, max %ld\n",loiter_time, loiter_time_max);
|
|
||||||
//*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/********************************************************************************/
|
/********************************************************************************/
|
||||||
@ -464,11 +461,12 @@ static void do_change_alt()
|
|||||||
{
|
{
|
||||||
Location temp = next_WP;
|
Location temp = next_WP;
|
||||||
condition_start = current_loc.alt;
|
condition_start = current_loc.alt;
|
||||||
if (next_command.options & WP_OPTION_ALT_RELATIVE) {
|
condition_value = next_command.alt;
|
||||||
condition_value = next_command.alt + home.alt;
|
//if (next_command.options & WP_OPTION_ALT_RELATIVE) {
|
||||||
} else {
|
// condition_value = next_command.alt + home.alt;
|
||||||
condition_value = next_command.alt;
|
//} else {
|
||||||
}
|
|
||||||
|
//}
|
||||||
temp.alt = condition_value;
|
temp.alt = condition_value;
|
||||||
set_next_WP(&temp);
|
set_next_WP(&temp);
|
||||||
}
|
}
|
||||||
|
@ -579,7 +579,7 @@
|
|||||||
# define LOG_ATTITUDE_FAST DISABLED
|
# define LOG_ATTITUDE_FAST DISABLED
|
||||||
#endif
|
#endif
|
||||||
#ifndef LOG_ATTITUDE_MED
|
#ifndef LOG_ATTITUDE_MED
|
||||||
# define LOG_ATTITUDE_MED DISABLED
|
# define LOG_ATTITUDE_MED ENABLED
|
||||||
#endif
|
#endif
|
||||||
#ifndef LOG_GPS
|
#ifndef LOG_GPS
|
||||||
# define LOG_GPS ENABLED
|
# define LOG_GPS ENABLED
|
||||||
|
@ -13,6 +13,12 @@ static void read_control_switch()
|
|||||||
switch_debouncer = false;
|
switch_debouncer = false;
|
||||||
|
|
||||||
set_mode(flight_modes[switchPosition]);
|
set_mode(flight_modes[switchPosition]);
|
||||||
|
|
||||||
|
// setup Simple mode
|
||||||
|
// do we enable simple mode?
|
||||||
|
do_simple = (g.simple_modes & 1 << switchPosition);
|
||||||
|
Serial.printf("do simple: %d \n", (int)do_simple);
|
||||||
|
|
||||||
}else{
|
}else{
|
||||||
switch_debouncer = true;
|
switch_debouncer = true;
|
||||||
}
|
}
|
||||||
@ -47,6 +53,10 @@ static void read_trim_switch()
|
|||||||
do_flip = true;
|
do_flip = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#elif CH7_OPTION == SIMPLE_MODE_CONTROL
|
||||||
|
|
||||||
|
do_simple = (g.rc_7.control_in > 800);
|
||||||
|
|
||||||
#elif CH7_OPTION == DO_SET_HOVER
|
#elif CH7_OPTION == DO_SET_HOVER
|
||||||
// switch is engaged
|
// switch is engaged
|
||||||
if (g.rc_7.control_in > 800){
|
if (g.rc_7.control_in > 800){
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
// CH 7 control
|
// CH 7 control
|
||||||
#define DO_SET_HOVER 0
|
#define DO_SET_HOVER 0
|
||||||
#define DO_FLIP 1
|
#define DO_FLIP 1
|
||||||
|
#define SIMPLE_MODE_CONTROL 2
|
||||||
|
|
||||||
// Frame types
|
// Frame types
|
||||||
#define QUAD_FRAME 0
|
#define QUAD_FRAME 0
|
||||||
@ -121,14 +122,20 @@
|
|||||||
// ----------------
|
// ----------------
|
||||||
#define STABILIZE 0 // hold level position
|
#define STABILIZE 0 // hold level position
|
||||||
#define ACRO 1 // rate control
|
#define ACRO 1 // rate control
|
||||||
#define SIMPLE 2 //
|
#define ALT_HOLD 2 // AUTO control
|
||||||
#define ALT_HOLD 3 // AUTO control
|
#define AUTO 3 // AUTO control
|
||||||
#define AUTO 4 // AUTO control
|
#define GUIDED 4 // AUTO control
|
||||||
#define GUIDED 5 // AUTO control
|
#define LOITER 5 // Hold a single location
|
||||||
#define LOITER 6 // Hold a single location
|
#define RTL 6 // AUTO control
|
||||||
#define RTL 7 // AUTO control
|
#define CIRCLE 7 // AUTO control
|
||||||
#define CIRCLE 8 // AUTO control
|
#define NUM_MODES 8
|
||||||
#define NUM_MODES 9
|
|
||||||
|
#define SIMPLE_1 1
|
||||||
|
#define SIMPLE_2 2
|
||||||
|
#define SIMPLE_3 4
|
||||||
|
#define SIMPLE_4 8
|
||||||
|
#define SIMPLE_5 16
|
||||||
|
#define SIMPLE_6 32
|
||||||
|
|
||||||
// CH_6 Tuning
|
// CH_6 Tuning
|
||||||
// -----------
|
// -----------
|
||||||
|
@ -101,9 +101,11 @@ setup_show(uint8_t argc, const Menu::arg *argv)
|
|||||||
report_flight_modes();
|
report_flight_modes();
|
||||||
report_imu();
|
report_imu();
|
||||||
report_compass();
|
report_compass();
|
||||||
|
|
||||||
#ifdef OPTFLOW_ENABLED
|
#ifdef OPTFLOW_ENABLED
|
||||||
report_optflow();
|
report_optflow();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if FRAME_CONFIG == HELI_FRAME
|
#if FRAME_CONFIG == HELI_FRAME
|
||||||
report_heli();
|
report_heli();
|
||||||
report_gyro();
|
report_gyro();
|
||||||
@ -302,7 +304,7 @@ setup_flightmodes(uint8_t argc, const Menu::arg *argv)
|
|||||||
byte _oldSwitchPosition = 0;
|
byte _oldSwitchPosition = 0;
|
||||||
byte mode = 0;
|
byte mode = 0;
|
||||||
|
|
||||||
Serial.printf_P(PSTR("\nMove RC toggle switch to each position to edit, move aileron stick to select modes."));
|
Serial.printf_P(PSTR("\nMove mode switch to edit, aileron: select modes, rudder: Simple on/off"));
|
||||||
print_hit_enter();
|
print_hit_enter();
|
||||||
|
|
||||||
while(1){
|
while(1){
|
||||||
@ -318,14 +320,14 @@ setup_flightmodes(uint8_t argc, const Menu::arg *argv)
|
|||||||
mode = constrain(mode, 0, NUM_MODES-1);
|
mode = constrain(mode, 0, NUM_MODES-1);
|
||||||
|
|
||||||
// update the user
|
// update the user
|
||||||
print_switch(_switchPosition, mode);
|
print_switch(_switchPosition, mode, (g.simple_modes & (1<<_switchPosition)));
|
||||||
|
|
||||||
// Remember switch position
|
// Remember switch position
|
||||||
_oldSwitchPosition = _switchPosition;
|
_oldSwitchPosition = _switchPosition;
|
||||||
}
|
}
|
||||||
|
|
||||||
// look for stick input
|
// look for stick input
|
||||||
if (radio_input_switch() == true){
|
if (abs(g.rc_1.control_in) > 3000){
|
||||||
mode++;
|
mode++;
|
||||||
if(mode >= NUM_MODES)
|
if(mode >= NUM_MODES)
|
||||||
mode = 0;
|
mode = 0;
|
||||||
@ -334,13 +336,31 @@ setup_flightmodes(uint8_t argc, const Menu::arg *argv)
|
|||||||
flight_modes[_switchPosition] = mode;
|
flight_modes[_switchPosition] = mode;
|
||||||
|
|
||||||
// print new mode
|
// print new mode
|
||||||
print_switch(_switchPosition, mode);
|
print_switch(_switchPosition, mode, (g.simple_modes & (1<<_switchPosition)));
|
||||||
|
delay(500);
|
||||||
|
}
|
||||||
|
|
||||||
|
// look for stick input
|
||||||
|
if (abs(g.rc_4.control_in) > 3000){
|
||||||
|
g.simple_modes |= (1<<_switchPosition);
|
||||||
|
// print new mode
|
||||||
|
print_switch(_switchPosition, mode, (g.simple_modes & (1<<_switchPosition)));
|
||||||
|
delay(500);
|
||||||
|
}
|
||||||
|
|
||||||
|
// look for stick input
|
||||||
|
if (abs(g.rc_4.control_in) < 3000){
|
||||||
|
g.simple_modes &= ~(1<<_switchPosition);
|
||||||
|
// print new mode
|
||||||
|
print_switch(_switchPosition, mode, (g.simple_modes & (1<<_switchPosition)));
|
||||||
|
delay(500);
|
||||||
}
|
}
|
||||||
|
|
||||||
// escape hatch
|
// escape hatch
|
||||||
if(Serial.available() > 0){
|
if(Serial.available() > 0){
|
||||||
for (mode=0; mode<6; mode++)
|
for (mode = 0; mode < 6; mode++)
|
||||||
flight_modes[mode].save();
|
flight_modes[mode].save();
|
||||||
|
|
||||||
print_done();
|
print_done();
|
||||||
report_flight_modes();
|
report_flight_modes();
|
||||||
return (0);
|
return (0);
|
||||||
@ -872,7 +892,7 @@ static void report_flight_modes()
|
|||||||
print_divider();
|
print_divider();
|
||||||
|
|
||||||
for(int i = 0; i < 6; i++ ){
|
for(int i = 0; i < 6; i++ ){
|
||||||
print_switch(i, flight_modes[i]);
|
print_switch(i, flight_modes[i], (g.simple_modes & (1<<i)));
|
||||||
}
|
}
|
||||||
print_blanks(2);
|
print_blanks(2);
|
||||||
}
|
}
|
||||||
@ -956,10 +976,15 @@ print_radio_values()
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
print_switch(byte p, byte m)
|
print_switch(byte p, byte m, bool b)
|
||||||
{
|
{
|
||||||
Serial.printf_P(PSTR("Pos %d: "),p);
|
Serial.printf_P(PSTR("Pos %d: "),p);
|
||||||
Serial.println(flight_mode_strings[m]);
|
Serial.print(flight_mode_strings[m]);
|
||||||
|
Serial.printf_P(PSTR(", Simple: "));
|
||||||
|
if(b)
|
||||||
|
Serial.printf_P(PSTR("T\n"));
|
||||||
|
else
|
||||||
|
Serial.printf_P(PSTR("F\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -968,32 +993,6 @@ print_done()
|
|||||||
Serial.printf_P(PSTR("\nSaved Settings\n\n"));
|
Serial.printf_P(PSTR("\nSaved Settings\n\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
// read at 50Hz
|
|
||||||
static bool
|
|
||||||
radio_input_switch(void)
|
|
||||||
{
|
|
||||||
static int8_t bouncer = 0;
|
|
||||||
|
|
||||||
if (int16_t(g.rc_1.radio_in - g.rc_1.radio_trim) > 100) {
|
|
||||||
bouncer = 10;
|
|
||||||
}
|
|
||||||
if (int16_t(g.rc_1.radio_in - g.rc_1.radio_trim) < -100) {
|
|
||||||
bouncer = -10;
|
|
||||||
}
|
|
||||||
if (bouncer >0) {
|
|
||||||
bouncer --;
|
|
||||||
}
|
|
||||||
if (bouncer <0) {
|
|
||||||
bouncer ++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bouncer == 1 || bouncer == -1) {
|
|
||||||
return bouncer;
|
|
||||||
}else{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void zero_eeprom(void)
|
static void zero_eeprom(void)
|
||||||
{
|
{
|
||||||
|
@ -249,11 +249,6 @@ static void init_ardupilot()
|
|||||||
start_new_log();
|
start_new_log();
|
||||||
}
|
}
|
||||||
|
|
||||||
//#if(GROUND_START_DELAY > 0)
|
|
||||||
//gcs.send_text_P(SEVERITY_LOW, PSTR(" With Delay"));
|
|
||||||
// delay(GROUND_START_DELAY * 1000);
|
|
||||||
//#endif
|
|
||||||
|
|
||||||
GPS_enabled = false;
|
GPS_enabled = false;
|
||||||
|
|
||||||
// Read in the GPS
|
// Read in the GPS
|
||||||
@ -292,10 +287,8 @@ static void init_ardupilot()
|
|||||||
// ---------------------------
|
// ---------------------------
|
||||||
reset_control_switch();
|
reset_control_switch();
|
||||||
|
|
||||||
//delay(100);
|
|
||||||
startup_ground();
|
startup_ground();
|
||||||
|
|
||||||
//Serial.printf_P(PSTR("\nloiter: %d\n"), location_error_max);
|
|
||||||
Log_Write_Startup();
|
Log_Write_Startup();
|
||||||
|
|
||||||
SendDebug("\nReady to FLY ");
|
SendDebug("\nReady to FLY ");
|
||||||
@ -361,9 +354,7 @@ static void set_mode(byte mode)
|
|||||||
// report the GPS and Motor arming status
|
// report the GPS and Motor arming status
|
||||||
led_mode = NORMAL_LEDS;
|
led_mode = NORMAL_LEDS;
|
||||||
|
|
||||||
// most modes do not calculate crosstrack correction
|
reset_nav();
|
||||||
//xtrack_enabled = false;
|
|
||||||
reset_nav_I();
|
|
||||||
|
|
||||||
switch(control_mode)
|
switch(control_mode)
|
||||||
{
|
{
|
||||||
@ -381,13 +372,6 @@ static void set_mode(byte mode)
|
|||||||
reset_hold_I();
|
reset_hold_I();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SIMPLE:
|
|
||||||
yaw_mode = SIMPLE_YAW;
|
|
||||||
roll_pitch_mode = SIMPLE_RP;
|
|
||||||
throttle_mode = SIMPLE_THR;
|
|
||||||
reset_hold_I();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ALT_HOLD:
|
case ALT_HOLD:
|
||||||
yaw_mode = ALT_HOLD_YAW;
|
yaw_mode = ALT_HOLD_YAW;
|
||||||
roll_pitch_mode = ALT_HOLD_RP;
|
roll_pitch_mode = ALT_HOLD_RP;
|
||||||
@ -395,7 +379,7 @@ static void set_mode(byte mode)
|
|||||||
reset_hold_I();
|
reset_hold_I();
|
||||||
|
|
||||||
init_throttle_cruise();
|
init_throttle_cruise();
|
||||||
next_WP.alt = current_loc.alt;
|
next_WP = current_loc;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AUTO:
|
case AUTO:
|
||||||
@ -407,12 +391,7 @@ static void set_mode(byte mode)
|
|||||||
init_throttle_cruise();
|
init_throttle_cruise();
|
||||||
|
|
||||||
// loads the commands from where we left off
|
// loads the commands from where we left off
|
||||||
//init_auto();
|
|
||||||
init_commands();
|
init_commands();
|
||||||
|
|
||||||
// do crosstrack correction
|
|
||||||
// XXX move to flight commands
|
|
||||||
//xtrack_enabled = true;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CIRCLE:
|
case CIRCLE:
|
||||||
@ -491,7 +470,7 @@ static void set_failsafe(boolean mode)
|
|||||||
|
|
||||||
|
|
||||||
static void resetPerfData(void) {
|
static void resetPerfData(void) {
|
||||||
mainLoop_count = 0;
|
//mainLoop_count = 0;
|
||||||
G_Dt_max = 0;
|
G_Dt_max = 0;
|
||||||
gps_fix_count = 0;
|
gps_fix_count = 0;
|
||||||
perf_mon_timer = millis();
|
perf_mon_timer = millis();
|
||||||
@ -541,7 +520,7 @@ static void
|
|||||||
init_throttle_cruise()
|
init_throttle_cruise()
|
||||||
{
|
{
|
||||||
// are we moving from manual throttle to auto_throttle?
|
// are we moving from manual throttle to auto_throttle?
|
||||||
if((old_control_mode <= SIMPLE) && (g.rc_3.control_in > MINIMUM_THROTTLE)){
|
if((old_control_mode <= STABILIZE) && (g.rc_3.control_in > MINIMUM_THROTTLE)){
|
||||||
g.pi_throttle.reset_I();
|
g.pi_throttle.reset_I();
|
||||||
g.throttle_cruise.set_and_save(g.rc_3.control_in);
|
g.throttle_cruise.set_and_save(g.rc_3.control_in);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user