2010-08-24 01:13:27 -03:00
|
|
|
/*
|
2012-08-17 03:20:45 -03:00
|
|
|
*
|
|
|
|
* This test assumes you are at the LOWl demo Airport
|
|
|
|
*
|
|
|
|
*/
|
2010-08-24 01:13:27 -03:00
|
|
|
|
|
|
|
#include "Waypoints.h"
|
|
|
|
#include "Navigation.h"
|
|
|
|
#include "AP_GPS_IMU.h"
|
|
|
|
#include "AP_RC.h"
|
|
|
|
|
|
|
|
|
|
|
|
AP_GPS_IMU gps;
|
2012-08-17 03:20:45 -03:00
|
|
|
Navigation nav((GPS *) &gps);
|
2010-08-24 01:13:27 -03:00
|
|
|
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()
|
|
|
|
{
|
2012-08-17 03:20:45 -03:00
|
|
|
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);
|
2010-08-24 01:13:27 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
void loop()
|
|
|
|
{
|
2012-08-17 03:20:45 -03:00
|
|
|
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();
|
|
|
|
}
|
2010-08-24 01:13:27 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
void print_loc()
|
|
|
|
{
|
2012-08-17 03:20:45 -03:00
|
|
|
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);
|
2010-08-24 01:13:27 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
void print_pwm()
|
|
|
|
{
|
2012-08-17 03:20:45 -03:00
|
|
|
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);
|
2010-08-24 01:13:27 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
byte buf_len = 0;
|
|
|
|
byte out_buffer[32];
|
|
|
|
|
|
|
|
void output_Xplane(void)
|
|
|
|
{
|
2012-08-17 03:20:45 -03:00
|
|
|
// 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();
|
2010-08-24 01:13:27 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
void output_int(int value)
|
|
|
|
{
|
2012-08-17 03:20:45 -03:00
|
|
|
//buf_len += 2;
|
|
|
|
out_buffer[buf_len++] = value & 0xff;
|
|
|
|
out_buffer[buf_len++] = (value >> 8) & 0xff;
|
2010-08-24 01:13:27 -03:00
|
|
|
}
|
|
|
|
void output_byte(byte value)
|
|
|
|
{
|
2012-08-17 03:20:45 -03:00
|
|
|
out_buffer[buf_len++] = value;
|
2010-08-24 01:13:27 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
void print_buffer()
|
|
|
|
{
|
2012-08-17 03:20:45 -03:00
|
|
|
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;
|
2010-08-24 01:13:27 -03:00
|
|
|
}
|