Hi Doug
I have an understanding problem with tuning the PID's.
I followed your instructions in the manual.
I adjusted the servo_roll P to 1.2 and the plane acts very crisp as in manual. But 45° angle is achived by maybe 30% stick input.
With this setting all settings for nav tend to overshoot or to miss waypoints. The best I found for nav was 0.8/0.18/0 & XTrackGain 0.8.
When heading for home after switching to RTL, it flies straight and level in direction home but never loiters "round". When flying a mission the plane turns maybe 160° at the 1st wp before turning the other way around for the next WP (flying "S"). When I reduce nav P, it almost never finds the next wp.
Now I wonder if I should set the servo_roll to a "linear resolution" for the stickmovement. eg 100% stick -> 45°, 50% stick 22.5% ect. and add some I to have it "crisp".
I am stuck at the moment. I need a push in the right direction.
Thanks in advance for your advice.
Christof
Replies
Hi Doug
I made the logging work with CLI -> disable cur, enable cur. Last time I used disable all and then enabled log by log.
As soon as I have a log, I will let you know. But the next days are not very promissing. Too much rain.
Best
Christof
Doug
I was flying today and the code is awsome. The last flight was the "best" regarding orientation of the plane. Unfortunately there where no logs recorded although they where enabled.
I think we can close this now.
Christof
Hi Doug
I was looking at the sin() & cos() as well but I does not seem to solve the problem. We have good corrections this way at east orientation only. If you find a solution without trigo functions - good. I stop then refreshing my geometry skills and wait what you come up with.
Best
Christof
Doug
I was flying the SQRT corrected compass today. The syptoms persist. Whenever nav_roll turns negative, compass has an upper and a lower cap.
Ah, when we power two negative values we get a positive value. But for one side correction we need positive and for the other we need negative. I go on digging later on.
Christof
07-05-11 11-45 5.log
Doug
a simple question
Trigo definition: sin2 A + cos2 A = 1
in Compass.pde Line 78
sin_roll = 1 - (cos_roll * cos_roll);
in MHO it should read sin_roll = SQRT( 1 - cos_roll2) according to the trigo rules.
same for sin_pitch.
I did not calculate it yet to test the values.
Christof
Doug
I have two logs ready for you with extended logging
1. Compass enabled: FBW A - AUTO - FBW A l&r circles
2. Compass disabled: FBW A - AUTO, the Mission was completed although the PID's really would need some tuning....
Best
Christof
05-05-11 09-31 1.log
05-05-11 09-33 2.log
I cannot get it to act up on the bench, so we will need to gather some more detailed data while flying. Below are two new replacement functions for the NTUN logging. If possible please make one flight flying the mission you have been flying and one flight in FBW-A where you fly several sets of 3 circles to the right and then 3 circles to the left.
// Read a nav tuning packet
void Log_Read_Nav_Tuning()
{
Serial.printf_P(PSTR("NTUN: %4.4f, %d, %4.4f, %4.4f, %4.4f, %4.4f, %4.4f,"), // \n
(float)((uint16_t)DataFlash.ReadInt())/100.0,
DataFlash.ReadInt(),
(float)((uint16_t)DataFlash.ReadInt())/100.0,
(float)((uint16_t)DataFlash.ReadInt())/100.0,
(float)DataFlash.ReadInt()/100.0,
(float)DataFlash.ReadInt()/100.0,
(float)DataFlash.ReadInt()/1000.0);
Serial.print(comma); // Just a temp hack
Serial.print(DataFlash.ReadInt()); // Just a temp hack
Serial.print(comma); // Just a temp hack
Serial.print(DataFlash.ReadLong()); // Just a temp hack
Serial.print(comma); // Just a temp hack
Serial.print((float)DataFlash.ReadInt()/1000); // Just a temp hack
Serial.print(comma); // Just a temp hack
Serial.print((float)DataFlash.ReadInt()/1000); // Just a temp hack
Serial.print(comma); // Just a temp hack
Serial.print((float)DataFlash.ReadInt()/1000); // Just a temp hack
Serial.print(comma); // Just a temp hack
Serial.println((float)DataFlash.ReadInt()/1000); // Just a temp hack
}
// Write a navigation tuning packet. Total length : 18 bytes
void Log_Write_Nav_Tuning()
{
Matrix3f tempmat = dcm.get_dcm_matrix();
DataFlash.WriteByte(HEAD_BYTE1);
DataFlash.WriteByte(HEAD_BYTE2);
DataFlash.WriteByte(LOG_NAV_TUNING_MSG);
DataFlash.WriteInt((uint16_t)dcm.yaw_sensor);
DataFlash.WriteInt((int)wp_distance);
DataFlash.WriteInt((uint16_t)target_bearing);
DataFlash.WriteInt((uint16_t)nav_bearing);
DataFlash.WriteInt(altitude_error);
DataFlash.WriteInt((int)airspeed);
DataFlash.WriteInt((int)(nav_gain_scaler*1000));
DataFlash.WriteInt((int)(wrap_360(ToDeg(compass.heading)*100)/100)); // Just a temp hack
DataFlash.WriteLong(compass.last_update); // Just a temp hack
DataFlash.WriteInt((int)(tempmat.b.x*1000)); // Just a temp hack
DataFlash.WriteInt((int)(compass.heading_x*1000)); // Just a temp hack
DataFlash.WriteInt((int)(tempmat.a.x*1000)); // Just a temp hack
DataFlash.WriteInt((int)(compass.heading_y*1000)); // Just a temp hack
DataFlash.WriteByte(END_BYTE);
}
Doug
I see. When I inserted the extra log I was not aware of that. I only corrected the "comma" and "line" thing to get the log readable. I do not understand why the logged yaw values do not oscilate 0-360° when the plane circels but they oscilate somewhat 10°-60° .
Doug
Jason
In navigation.pde update_crosstrack(void) crosstrack following is limited to 45° "off track"
if (abs(wrap_180(target_bearing - crosstrack_bearing)) < 4500)
Where do we go if nav_bearing is not updated?