@@ -719,6 +719,10 @@ void AC_AutoTune_Heli::rate_ff_test_run(float max_angle_cd, float target_rate_cd
719
719
float tgt_rate_reading = 0 .0f ;
720
720
const uint32_t now = AP_HAL::millis ();
721
721
722
+ const int32_t ahrs_roll_cd = ahrs_view->roll_sensor ;
723
+ const int32_t ahrs_pitch_cd = ahrs_view->pitch_sensor ;
724
+ const int32_t ahrs_yaw_cd = ahrs_view->yaw_sensor ;
725
+
722
726
target_rate_cds = dir_sign * target_rate_cds;
723
727
724
728
switch (axis) {
@@ -730,30 +734,30 @@ void AC_AutoTune_Heli::rate_ff_test_run(float max_angle_cd, float target_rate_cd
730
734
settle_time--;
731
735
trim_command_reading = motors->get_roll ();
732
736
rate_request_cds.reset (gyro_reading);
733
- } else if (((ahrs_view-> roll_sensor <= max_angle_cd + start_angle && is_positive (dir_sign))
734
- || (ahrs_view-> roll_sensor >= -max_angle_cd + start_angle && !is_positive (dir_sign)))
737
+ } else if (((ahrs_roll_cd <= max_angle_cd + start_angle && is_positive (dir_sign))
738
+ || (ahrs_roll_cd >= -max_angle_cd + start_angle && !is_positive (dir_sign)))
735
739
&& ff_test_phase == 0 ) {
736
740
rate_request_cds.apply (target_rate_cds, AP::scheduler ().get_loop_period_s ());
737
741
attitude_control->input_rate_bf_roll_pitch_yaw (rate_request_cds.get (), 0 .0f , 0 .0f );
738
- } else if (((ahrs_view-> roll_sensor > max_angle_cd + start_angle && is_positive (dir_sign))
739
- || (ahrs_view-> roll_sensor < -max_angle_cd + start_angle && !is_positive (dir_sign)))
742
+ } else if (((ahrs_roll_cd > max_angle_cd + start_angle && is_positive (dir_sign))
743
+ || (ahrs_roll_cd < -max_angle_cd + start_angle && !is_positive (dir_sign)))
740
744
&& ff_test_phase == 0 ) {
741
745
ff_test_phase = 1 ;
742
746
rate_request_cds.apply (-target_rate_cds, AP::scheduler ().get_loop_period_s ());
743
747
attitude_control->input_rate_bf_roll_pitch_yaw (rate_request_cds.get (), 0 .0f , 0 .0f );
744
748
attitude_control->rate_bf_roll_target (rate_request_cds.get ());
745
- } else if (((ahrs_view-> roll_sensor >= -max_angle_cd + start_angle && is_positive (dir_sign))
746
- || (ahrs_view-> roll_sensor <= max_angle_cd + start_angle && !is_positive (dir_sign)))
749
+ } else if (((ahrs_roll_cd >= -max_angle_cd + start_angle && is_positive (dir_sign))
750
+ || (ahrs_roll_cd <= max_angle_cd + start_angle && !is_positive (dir_sign)))
747
751
&& ff_test_phase == 1 ) {
748
752
rate_request_cds.apply (-target_rate_cds, AP::scheduler ().get_loop_period_s ());
749
753
attitude_control->input_rate_bf_roll_pitch_yaw (rate_request_cds.get (), 0 .0f , 0 .0f );
750
754
attitude_control->rate_bf_roll_target (rate_request_cds.get ());
751
- } else if (((ahrs_view-> roll_sensor < -max_angle_cd + start_angle && is_positive (dir_sign))
752
- || (ahrs_view-> roll_sensor > max_angle_cd + start_angle && !is_positive (dir_sign)))
755
+ } else if (((ahrs_roll_cd < -max_angle_cd + start_angle && is_positive (dir_sign))
756
+ || (ahrs_roll_cd > max_angle_cd + start_angle && !is_positive (dir_sign)))
753
757
&& ff_test_phase == 1 ) {
754
758
ff_test_phase = 2 ;
755
759
attitude_control->reset_target_and_rate (false );
756
- angle_request_cd.reset (ahrs_view-> roll_sensor );
760
+ angle_request_cd.reset (ahrs_roll_cd );
757
761
attitude_control->input_euler_angle_roll_pitch_euler_rate_yaw (angle_request_cd.get (), start_angles.y , 0 .0f );
758
762
} else if (ff_test_phase == 2 ) {
759
763
angle_request_cd.apply (start_angles.x , AP::scheduler ().get_loop_period_s ());
@@ -769,30 +773,30 @@ void AC_AutoTune_Heli::rate_ff_test_run(float max_angle_cd, float target_rate_cd
769
773
settle_time--;
770
774
trim_command_reading = motors->get_pitch ();
771
775
rate_request_cds.reset (gyro_reading);
772
- } else if (((ahrs_view-> pitch_sensor <= max_angle_cd + start_angle && is_positive (dir_sign))
773
- || (ahrs_view-> pitch_sensor >= -max_angle_cd + start_angle && !is_positive (dir_sign)))
776
+ } else if (((ahrs_pitch_cd <= max_angle_cd + start_angle && is_positive (dir_sign))
777
+ || (ahrs_pitch_cd >= -max_angle_cd + start_angle && !is_positive (dir_sign)))
774
778
&& ff_test_phase == 0 ) {
775
779
rate_request_cds.apply (target_rate_cds, AP::scheduler ().get_loop_period_s ());
776
780
attitude_control->input_rate_bf_roll_pitch_yaw (0 .0f , rate_request_cds.get (), 0 .0f );
777
- } else if (((ahrs_view-> pitch_sensor > max_angle_cd + start_angle && is_positive (dir_sign))
778
- || (ahrs_view-> pitch_sensor < -max_angle_cd + start_angle && !is_positive (dir_sign)))
781
+ } else if (((ahrs_pitch_cd > max_angle_cd + start_angle && is_positive (dir_sign))
782
+ || (ahrs_pitch_cd < -max_angle_cd + start_angle && !is_positive (dir_sign)))
779
783
&& ff_test_phase == 0 ) {
780
784
ff_test_phase = 1 ;
781
785
rate_request_cds.apply (-target_rate_cds, AP::scheduler ().get_loop_period_s ());
782
786
attitude_control->input_rate_bf_roll_pitch_yaw (0 .0f , rate_request_cds.get (), 0 .0f );
783
787
attitude_control->rate_bf_pitch_target (rate_request_cds.get ());
784
- } else if (((ahrs_view-> pitch_sensor >= -max_angle_cd + start_angle && is_positive (dir_sign))
785
- || (ahrs_view-> pitch_sensor <= max_angle_cd + start_angle && !is_positive (dir_sign)))
788
+ } else if (((ahrs_pitch_cd >= -max_angle_cd + start_angle && is_positive (dir_sign))
789
+ || (ahrs_pitch_cd <= max_angle_cd + start_angle && !is_positive (dir_sign)))
786
790
&& ff_test_phase == 1 ) {
787
791
rate_request_cds.apply (-target_rate_cds, AP::scheduler ().get_loop_period_s ());
788
792
attitude_control->input_rate_bf_roll_pitch_yaw (0 .0f , rate_request_cds.get (), 0 .0f );
789
793
attitude_control->rate_bf_pitch_target (rate_request_cds.get ());
790
- } else if (((ahrs_view-> pitch_sensor < -max_angle_cd + start_angle && is_positive (dir_sign))
791
- || (ahrs_view-> pitch_sensor > max_angle_cd + start_angle && !is_positive (dir_sign)))
794
+ } else if (((ahrs_pitch_cd < -max_angle_cd + start_angle && is_positive (dir_sign))
795
+ || (ahrs_pitch_cd > max_angle_cd + start_angle && !is_positive (dir_sign)))
792
796
&& ff_test_phase == 1 ) {
793
797
ff_test_phase = 2 ;
794
798
attitude_control->reset_target_and_rate (false );
795
- angle_request_cd.reset (ahrs_view-> pitch_sensor );
799
+ angle_request_cd.reset (ahrs_pitch_cd );
796
800
attitude_control->input_euler_angle_roll_pitch_euler_rate_yaw (start_angles.x , angle_request_cd.get (), 0 .0f );
797
801
} else if (ff_test_phase == 2 ) {
798
802
angle_request_cd.apply (start_angles.y , AP::scheduler ().get_loop_period_s ());
@@ -808,32 +812,32 @@ void AC_AutoTune_Heli::rate_ff_test_run(float max_angle_cd, float target_rate_cd
808
812
if (settle_time > 0 ) {
809
813
settle_time--;
810
814
trim_command_reading = motors->get_yaw ();
811
- trim_heading = ahrs_view-> yaw_sensor ;
815
+ trim_heading = ahrs_yaw_cd ;
812
816
rate_request_cds.reset (gyro_reading);
813
- } else if (((wrap_180_cd (ahrs_view-> yaw_sensor - trim_heading) <= 2 .0f * max_angle_cd && is_positive (dir_sign))
814
- || (wrap_180_cd (ahrs_view-> yaw_sensor - trim_heading) >= -2 .0f * max_angle_cd && !is_positive (dir_sign)))
817
+ } else if (((wrap_180_cd (ahrs_yaw_cd - trim_heading) <= 2 .0f * max_angle_cd && is_positive (dir_sign))
818
+ || (wrap_180_cd (ahrs_yaw_cd - trim_heading) >= -2 .0f * max_angle_cd && !is_positive (dir_sign)))
815
819
&& ff_test_phase == 0 ) {
816
820
rate_request_cds.apply (target_rate_cds, AP::scheduler ().get_loop_period_s ());
817
821
attitude_control->input_rate_bf_roll_pitch_yaw (0 .0f , 0 .0f , rate_request_cds.get ());
818
- } else if (((wrap_180_cd (ahrs_view-> yaw_sensor - trim_heading) > 2 .0f * max_angle_cd && is_positive (dir_sign))
819
- || (wrap_180_cd (ahrs_view-> yaw_sensor - trim_heading) < -2 .0f * max_angle_cd && !is_positive (dir_sign)))
822
+ } else if (((wrap_180_cd (ahrs_yaw_cd - trim_heading) > 2 .0f * max_angle_cd && is_positive (dir_sign))
823
+ || (wrap_180_cd (ahrs_yaw_cd - trim_heading) < -2 .0f * max_angle_cd && !is_positive (dir_sign)))
820
824
&& ff_test_phase == 0 ) {
821
825
ff_test_phase = 1 ;
822
826
rate_request_cds.apply (-target_rate_cds, AP::scheduler ().get_loop_period_s ());
823
827
attitude_control->input_rate_bf_roll_pitch_yaw (0 .0f , 0 .0f , rate_request_cds.get ());
824
828
attitude_control->rate_bf_yaw_target (rate_request_cds.get ());
825
- } else if (((wrap_180_cd (ahrs_view-> yaw_sensor - trim_heading) >= -2 .0f * max_angle_cd && is_positive (dir_sign))
826
- || (wrap_180_cd (ahrs_view-> yaw_sensor - trim_heading) <= 2 .0f * max_angle_cd && !is_positive (dir_sign)))
829
+ } else if (((wrap_180_cd (ahrs_yaw_cd - trim_heading) >= -2 .0f * max_angle_cd && is_positive (dir_sign))
830
+ || (wrap_180_cd (ahrs_yaw_cd - trim_heading) <= 2 .0f * max_angle_cd && !is_positive (dir_sign)))
827
831
&& ff_test_phase == 1 ) {
828
832
rate_request_cds.apply (-target_rate_cds, AP::scheduler ().get_loop_period_s ());
829
833
attitude_control->input_rate_bf_roll_pitch_yaw (0 .0f , 0 .0f , rate_request_cds.get ());
830
834
attitude_control->rate_bf_yaw_target (rate_request_cds.get ());
831
- } else if (((wrap_180_cd (ahrs_view-> yaw_sensor - trim_heading) < -2 .0f * max_angle_cd && is_positive (dir_sign))
832
- || (wrap_180_cd (ahrs_view-> yaw_sensor - trim_heading) > 2 .0f * max_angle_cd && !is_positive (dir_sign)))
835
+ } else if (((wrap_180_cd (ahrs_yaw_cd - trim_heading) < -2 .0f * max_angle_cd && is_positive (dir_sign))
836
+ || (wrap_180_cd (ahrs_yaw_cd - trim_heading) > 2 .0f * max_angle_cd && !is_positive (dir_sign)))
833
837
&& ff_test_phase == 1 ) {
834
838
ff_test_phase = 2 ;
835
839
attitude_control->reset_yaw_target_and_rate (false );
836
- angle_request_cd.reset (wrap_180_cd (ahrs_view-> yaw_sensor - trim_heading));
840
+ angle_request_cd.reset (wrap_180_cd (ahrs_yaw_cd - trim_heading));
837
841
attitude_control->input_euler_angle_roll_pitch_yaw (start_angles.x , start_angles.y , angle_request_cd.get (), false );
838
842
} else if (ff_test_phase == 2 ) {
839
843
angle_request_cd.apply (0 .0f , AP::scheduler ().get_loop_period_s ());
@@ -852,17 +856,17 @@ void AC_AutoTune_Heli::rate_ff_test_run(float max_angle_cd, float target_rate_cd
852
856
// record steady state rate and motor command
853
857
switch (axis) {
854
858
case ROLL:
855
- if (((ahrs_view-> roll_sensor >= -max_angle_cd + start_angle && is_positive (dir_sign))
856
- || (ahrs_view-> roll_sensor <= max_angle_cd + start_angle && !is_positive (dir_sign)))
859
+ if (((ahrs_roll_cd >= -max_angle_cd + start_angle && is_positive (dir_sign))
860
+ || (ahrs_roll_cd <= max_angle_cd + start_angle && !is_positive (dir_sign)))
857
861
&& ff_test_phase == 1 ) {
858
862
test_rate_filt = rotation_rate;
859
863
test_command_filt = command_out;
860
864
test_tgt_rate_filt = filt_target_rate;
861
865
}
862
866
break ;
863
867
case PITCH:
864
- if (((ahrs_view-> pitch_sensor >= -max_angle_cd + start_angle && is_positive (dir_sign))
865
- || (ahrs_view-> pitch_sensor <= max_angle_cd + start_angle && !is_positive (dir_sign)))
868
+ if (((ahrs_pitch_cd >= -max_angle_cd + start_angle && is_positive (dir_sign))
869
+ || (ahrs_pitch_cd <= max_angle_cd + start_angle && !is_positive (dir_sign)))
866
870
&& ff_test_phase == 1 ) {
867
871
test_rate_filt = rotation_rate;
868
872
test_command_filt = command_out;
@@ -871,8 +875,8 @@ void AC_AutoTune_Heli::rate_ff_test_run(float max_angle_cd, float target_rate_cd
871
875
break ;
872
876
case YAW:
873
877
case YAW_D:
874
- if (((wrap_180_cd (ahrs_view-> yaw_sensor - trim_heading) >= -2 .0f * max_angle_cd && is_positive (dir_sign))
875
- || (wrap_180_cd (ahrs_view-> yaw_sensor - trim_heading) <= 2 .0f * max_angle_cd && !is_positive (dir_sign)))
878
+ if (((wrap_180_cd (ahrs_yaw_cd - trim_heading) >= -2 .0f * max_angle_cd && is_positive (dir_sign))
879
+ || (wrap_180_cd (ahrs_yaw_cd - trim_heading) <= 2 .0f * max_angle_cd && !is_positive (dir_sign)))
876
880
&& ff_test_phase == 1 ) {
877
881
test_rate_filt = rotation_rate;
878
882
test_command_filt = command_out;
@@ -987,7 +991,11 @@ void AC_AutoTune_Heli::dwell_test_run(uint8_t freq_resp_input, float start_frq,
987
991
velocity_bf.y = -velocity_ned.x * ahrs_view->sin_yaw () + velocity_ned.y * ahrs_view->cos_yaw ();
988
992
}
989
993
990
- Vector3f attitude_cd = Vector3f ((float )ahrs_view->roll_sensor , (float )ahrs_view->pitch_sensor , (float )ahrs_view->yaw_sensor );
994
+ const int32_t ahrs_roll_cd = ahrs_view->roll_sensor ;
995
+ const int32_t ahrs_pitch_cd = ahrs_view->pitch_sensor ;
996
+ const int32_t ahrs_yaw_cd = ahrs_view->yaw_sensor ;
997
+
998
+ Vector3f attitude_cd = Vector3f ((float )ahrs_roll_cd, (float )ahrs_pitch_cd, (float )ahrs_yaw_cd);
991
999
if (settle_time == 0 ) {
992
1000
if (dwell_type == RATE) {
993
1001
target_rate_cds = -chirp_input.update ((now - dwell_start_time_ms) * 0.001 , target_rate_mag_cds);
@@ -1012,7 +1020,7 @@ void AC_AutoTune_Heli::dwell_test_run(uint8_t freq_resp_input, float start_frq,
1012
1020
} else {
1013
1021
target_angle_cd = 0 .0f ;
1014
1022
trim_yaw_tgt_reading = (float )attitude_control->get_att_target_euler_cd ().z ;
1015
- trim_yaw_heading_reading = (float )ahrs_view-> yaw_sensor ;
1023
+ trim_yaw_heading_reading = (float )ahrs_yaw_cd ;
1016
1024
}
1017
1025
dwell_start_time_ms = now;
1018
1026
filt_att_fdbk_from_velxy_cd.reset (Vector2f (0 .0f ,0 .0f ));
@@ -1100,32 +1108,32 @@ void AC_AutoTune_Heli::dwell_test_run(uint8_t freq_resp_input, float start_frq,
1100
1108
command_reading = motors->get_roll ();
1101
1109
if (dwell_type == DRB) {
1102
1110
tgt_rate_reading = (target_angle_cd) / 5730 .0f ;
1103
- gyro_reading = ((float )ahrs_view-> roll_sensor + trim_angle_cd.x - target_angle_cd) / 5730 .0f ;
1111
+ gyro_reading = ((float )ahrs_roll_cd + trim_angle_cd.x - target_angle_cd) / 5730 .0f ;
1104
1112
} else {
1105
1113
tgt_rate_reading = ((float )attitude_control->get_att_target_euler_cd ().x ) / 5730 .0f ;
1106
- gyro_reading = ((float )ahrs_view-> roll_sensor ) / 5730 .0f ;
1114
+ gyro_reading = ((float )ahrs_roll_cd ) / 5730 .0f ;
1107
1115
}
1108
1116
break ;
1109
1117
case PITCH:
1110
1118
attitude_control->input_euler_angle_roll_pitch_euler_rate_yaw (trim_angle_cd.x , target_angle_cd + trim_angle_cd.y , 0 .0f );
1111
1119
command_reading = motors->get_pitch ();
1112
1120
if (dwell_type == DRB) {
1113
1121
tgt_rate_reading = (target_angle_cd) / 5730 .0f ;
1114
- gyro_reading = ((float )ahrs_view-> pitch_sensor + trim_angle_cd.y - target_angle_cd) / 5730 .0f ;
1122
+ gyro_reading = ((float )ahrs_pitch_cd + trim_angle_cd.y - target_angle_cd) / 5730 .0f ;
1115
1123
} else {
1116
1124
tgt_rate_reading = ((float )attitude_control->get_att_target_euler_cd ().y ) / 5730 .0f ;
1117
- gyro_reading = ((float )ahrs_view-> pitch_sensor ) / 5730 .0f ;
1125
+ gyro_reading = ((float )ahrs_pitch_cd ) / 5730 .0f ;
1118
1126
}
1119
1127
break ;
1120
1128
case YAW:
1121
1129
case YAW_D:
1122
1130
command_reading = motors->get_yaw ();
1123
1131
if (dwell_type == DRB) {
1124
1132
tgt_rate_reading = (target_angle_cd) / 5730 .0f ;
1125
- gyro_reading = (wrap_180_cd ((float )ahrs_view-> yaw_sensor - trim_yaw_heading_reading - target_angle_cd)) / 5730 .0f ;
1133
+ gyro_reading = (wrap_180_cd ((float )ahrs_yaw_cd - trim_yaw_heading_reading - target_angle_cd)) / 5730 .0f ;
1126
1134
} else {
1127
1135
tgt_rate_reading = (wrap_180_cd ((float )attitude_control->get_att_target_euler_cd ().z - trim_yaw_tgt_reading)) / 5730 .0f ;
1128
- gyro_reading = (wrap_180_cd ((float )ahrs_view-> yaw_sensor - trim_yaw_heading_reading)) / 5730 .0f ;
1136
+ gyro_reading = (wrap_180_cd ((float )ahrs_yaw_cd - trim_yaw_heading_reading)) / 5730 .0f ;
1129
1137
}
1130
1138
attitude_control->input_euler_angle_roll_pitch_yaw (trim_angle_cd.x , trim_angle_cd.y , wrap_180_cd (trim_yaw_tgt_reading + target_angle_cd), false );
1131
1139
break ;
0 commit comments