You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
152 lines
4.3 KiB
152 lines
4.3 KiB
/* |
|
* |
|
* This test assumes you are at the LOWl demo Airport |
|
* |
|
*/ |
|
|
|
#include "Waypoints.h" |
|
#include "Navigation.h" |
|
#include "AP_GPS_IMU.h" |
|
#include "AP_RC.h" |
|
|
|
|
|
AP_GPS_IMU gps; |
|
Navigation nav((GPS *) &gps); |
|
AP_RC rc; |
|
|
|
#define CH_ROLL 0 |
|
#define CH_PITCH 1 |
|
#define CH_THROTTLE 2 |
|
#define CH_RUDDER 3 |
|
|
|
#define CH3_MIN 1100 |
|
#define CH3_MAX 1900 |
|
|
|
#define REVERSE_RUDDER 1 |
|
#define REVERSE_ROLL 1 |
|
#define REVERSE_PITCH 1 |
|
|
|
int8_t did_init_home; |
|
int16_t servo_out[4]; |
|
int16_t radio_trim[4] = {1500,1500,1100,1500}; |
|
int16_t radio_in[4]; |
|
|
|
void setup() |
|
{ |
|
Serial.begin(38400); |
|
Serial.println("Navigation test"); |
|
Waypoints::WP location_B = {0, 0, 74260, 472586364, 113366012}; |
|
nav.set_next_wp(location_B); |
|
rc.init(radio_trim); |
|
} |
|
|
|
void loop() |
|
{ |
|
delay(20); |
|
gps.update(); |
|
rc.read_pwm(); |
|
for(int y=0; y<4; y++) { |
|
//rc.set_ch_pwm(y, rc.input[y]); // send to Servos |
|
radio_in[y] = rc.input[y]; |
|
} |
|
|
|
servo_out[CH_ROLL] = ((radio_in[CH_ROLL] - radio_trim[CH_ROLL]) * 45 * REVERSE_ROLL) / 500; |
|
servo_out[CH_PITCH] = ((radio_in[CH_PITCH] - radio_trim[CH_PITCH]) * 45 * REVERSE_PITCH) / 500; |
|
servo_out[CH_RUDDER] = ((radio_in[CH_RUDDER] - radio_trim[CH_RUDDER]) * 45 * REVERSE_RUDDER) / 500; |
|
servo_out[CH_THROTTLE] = (float)(radio_in[CH_THROTTLE] - CH3_MIN) / (float)(CH3_MAX - CH3_MIN) *100; |
|
servo_out[CH_THROTTLE] = constrain(servo_out[CH_THROTTLE], 0, 100); |
|
|
|
output_Xplane(); |
|
if(gps.new_data /* && gps.fix */ ) { |
|
if(did_init_home == 0) { |
|
did_init_home = 1; |
|
Waypoints::WP wp = {0, 0, gps.altitude, gps.lattitude, gps.longitude}; |
|
nav.set_home(wp); |
|
Serial.println("MSG init home"); |
|
}else{ |
|
nav.update_gps(); |
|
} |
|
//print_loc(); |
|
} |
|
} |
|
|
|
void print_loc() |
|
{ |
|
Serial.print("MSG GPS: "); |
|
Serial.print(nav.location.lat, DEC); |
|
Serial.print(", "); |
|
Serial.print(nav.location.lng, DEC); |
|
Serial.print(", "); |
|
Serial.print(nav.location.alt, DEC); |
|
Serial.print("\tDistance = "); |
|
Serial.print(nav.distance, DEC); |
|
Serial.print(" Bearing = "); |
|
Serial.print(nav.bearing/100, DEC); |
|
Serial.print(" Bearing err = "); |
|
Serial.print(nav.bearing_error/100, DEC); |
|
Serial.print(" alt err = "); |
|
Serial.print(nav.altitude_error/100, DEC); |
|
Serial.print(" Alt above home = "); |
|
Serial.println(nav.altitude_above_home/100, DEC); |
|
} |
|
|
|
void print_pwm() |
|
{ |
|
Serial.print("ch1 "); |
|
Serial.print(rc.input[CH_ROLL],DEC); |
|
Serial.print("\tch2: "); |
|
Serial.print(rc.input[CH_PITCH],DEC); |
|
Serial.print("\tch3 :"); |
|
Serial.print(rc.input[CH_THROTTLE],DEC); |
|
Serial.print("\tch4 :"); |
|
Serial.println(rc.input[CH_RUDDER],DEC); |
|
} |
|
|
|
|
|
|
|
|
|
byte buf_len = 0; |
|
byte out_buffer[32]; |
|
|
|
void output_Xplane(void) |
|
{ |
|
// output real-time sensor data |
|
Serial.print("AAA"); // Message preamble |
|
output_int((int)(servo_out[CH_ROLL]*100)); // 0 bytes 0,1 |
|
output_int((int)(servo_out[CH_PITCH]*100)); // 1 bytes 2,3 |
|
output_int((int)(servo_out[CH_THROTTLE])); // 2 bytes 4,5 |
|
output_int((int)(servo_out[CH_RUDDER]*100)); // 3 bytes 6,7 |
|
output_int((int)nav.distance); // 4 bytes 8,9 |
|
output_int((int)nav.bearing_error); // 5 bytes 10,11 |
|
output_int((int)nav.altitude_error); // 6 bytes 12,13 |
|
output_int(0); // 7 bytes 14,15 |
|
output_byte(1); // 8 bytes 16 |
|
output_byte(1); // 9 bytes 17 |
|
|
|
// print out the buffer and checksum |
|
// --------------------------------- |
|
print_buffer(); |
|
} |
|
|
|
void output_int(int value) |
|
{ |
|
//buf_len += 2; |
|
out_buffer[buf_len++] = value & 0xff; |
|
out_buffer[buf_len++] = (value >> 8) & 0xff; |
|
} |
|
void output_byte(byte value) |
|
{ |
|
out_buffer[buf_len++] = value; |
|
} |
|
|
|
void print_buffer() |
|
{ |
|
byte ck_a = 0; |
|
byte ck_b = 0; |
|
for (byte i = 0; i < buf_len; i++) { |
|
Serial.print (out_buffer[i]); |
|
} |
|
Serial.print('\r'); |
|
Serial.print('\n'); |
|
buf_len = 0; |
|
}
|
|
|