@@ -345,10 +345,14 @@ void AC_AttitudeControl::input_quaternion(Quaternion& attitude_desired_quat, Vec
345
345
void AC_AttitudeControl::input_euler_angle_roll_pitch_euler_rate_yaw_cd (float euler_roll_angle_cd, float euler_pitch_angle_cd, float euler_yaw_rate_cds)
346
346
{
347
347
// Convert from centidegrees on public interface to radians
348
- float euler_roll_angle_rad = cd_to_rad (euler_roll_angle_cd);
348
+ const float euler_roll_angle_rad = cd_to_rad (euler_roll_angle_cd);
349
349
const float euler_pitch_angle_rad = cd_to_rad (euler_pitch_angle_cd);
350
350
const float euler_yaw_rate_rads = cd_to_rad (euler_yaw_rate_cds);
351
+ input_euler_angle_roll_pitch_euler_rate_yaw_rad (euler_roll_angle_rad, euler_pitch_angle_rad, euler_yaw_rate_rads);
352
+ }
351
353
354
+ void AC_AttitudeControl::input_euler_angle_roll_pitch_euler_rate_yaw_rad (float euler_roll_angle_rad, float euler_pitch_angle_rad, float euler_yaw_rate_rads)
355
+ {
352
356
// update attitude target
353
357
update_attitude_target ();
354
358
@@ -399,10 +403,15 @@ void AC_AttitudeControl::input_euler_angle_roll_pitch_euler_rate_yaw_cd(float eu
399
403
void AC_AttitudeControl::input_euler_angle_roll_pitch_yaw_cd (float euler_roll_angle_cd, float euler_pitch_angle_cd, float euler_yaw_angle_cd, bool slew_yaw)
400
404
{
401
405
// Convert from centidegrees on public interface to radians
402
- float euler_roll_angle_rad = cd_to_rad (euler_roll_angle_cd);
406
+ const float euler_roll_angle_rad = cd_to_rad (euler_roll_angle_cd);
403
407
const float euler_pitch_angle_rad = cd_to_rad (euler_pitch_angle_cd);
404
408
const float euler_yaw_angle_rad = cd_to_rad (euler_yaw_angle_cd);
405
409
410
+ input_euler_angle_roll_pitch_yaw_rad (euler_roll_angle_rad, euler_pitch_angle_rad, euler_yaw_angle_rad, slew_yaw);
411
+ }
412
+
413
+ void AC_AttitudeControl::input_euler_angle_roll_pitch_yaw_rad (float euler_roll_angle_rad, float euler_pitch_angle_rad, float euler_yaw_angle_rad, bool slew_yaw)
414
+ {
406
415
// update attitude target
407
416
update_attitude_target ();
408
417
@@ -465,6 +474,11 @@ void AC_AttitudeControl::input_euler_rate_roll_pitch_yaw_cds(float euler_roll_ra
465
474
const float euler_pitch_rate_rads = cd_to_rad (euler_pitch_rate_cds);
466
475
const float euler_yaw_rate_rads = cd_to_rad (euler_yaw_rate_cds);
467
476
477
+ input_euler_rate_roll_pitch_yaw_rads (euler_roll_rate_rads, euler_pitch_rate_rads, euler_yaw_rate_rads);
478
+ }
479
+
480
+ void AC_AttitudeControl::input_euler_rate_roll_pitch_yaw_rads (float euler_roll_rate_rads, float euler_pitch_rate_rads, float euler_yaw_rate_rads)
481
+ {
468
482
// update attitude target
469
483
update_attitude_target ();
470
484
@@ -511,6 +525,11 @@ void AC_AttitudeControl::input_rate_bf_roll_pitch_yaw_cds(float roll_rate_bf_cds
511
525
const float pitch_rate_bf_rads = cd_to_rad (pitch_rate_bf_cds);
512
526
const float yaw_rate_bf_rads = cd_to_rad (yaw_rate_bf_cds);
513
527
528
+ input_rate_bf_roll_pitch_yaw_rads (roll_rate_bf_rads, pitch_rate_bf_rads, yaw_rate_bf_rads);
529
+ }
530
+
531
+ void AC_AttitudeControl::input_rate_bf_roll_pitch_yaw_rads (float roll_rate_bf_rads, float pitch_rate_bf_rads, float yaw_rate_bf_rads)
532
+ {
514
533
// update attitude target
515
534
update_attitude_target ();
516
535
@@ -552,6 +571,11 @@ void AC_AttitudeControl::input_rate_bf_roll_pitch_yaw_2_cds(float roll_rate_bf_c
552
571
const float pitch_rate_bf_rads = cd_to_rad (pitch_rate_bf_cds);
553
572
const float yaw_rate_bf_rads = cd_to_rad (yaw_rate_bf_cds);
554
573
574
+ input_rate_bf_roll_pitch_yaw_2_rads (roll_rate_bf_rads, pitch_rate_bf_rads, yaw_rate_bf_rads);
575
+ }
576
+
577
+ void AC_AttitudeControl::input_rate_bf_roll_pitch_yaw_2_rads (float roll_rate_bf_rads, float pitch_rate_bf_rads, float yaw_rate_bf_rads)
578
+ {
555
579
// Compute acceleration-limited body frame rates
556
580
// When acceleration limiting is enabled, the input shaper constrains angular acceleration about the axis, slewing
557
581
// the output rate towards the input rate.
@@ -578,6 +602,11 @@ void AC_AttitudeControl::input_rate_bf_roll_pitch_yaw_3_cds(float roll_rate_bf_c
578
602
const float pitch_rate_bf_rads = cd_to_rad (pitch_rate_bf_cds);
579
603
const float yaw_rate_bf_rads = cd_to_rad (yaw_rate_bf_cds);
580
604
605
+ input_rate_bf_roll_pitch_yaw_3_rads (roll_rate_bf_rads, pitch_rate_bf_rads, yaw_rate_bf_rads);
606
+ }
607
+
608
+ void AC_AttitudeControl::input_rate_bf_roll_pitch_yaw_3_rads (float roll_rate_bf_rads, float pitch_rate_bf_rads, float yaw_rate_bf_rads)
609
+ {
581
610
// Update attitude error
582
611
Vector3f attitude_error;
583
612
_attitude_ang_error.to_axis_angle (attitude_error);
@@ -637,6 +666,12 @@ void AC_AttitudeControl::input_rate_bf_roll_pitch_yaw_no_shaping_cds(float roll_
637
666
const float pitch_rate_bf_rads = cd_to_rad (pitch_rate_bf_cds);
638
667
const float yaw_rate_bf_rads = cd_to_rad (yaw_rate_bf_cds);
639
668
669
+ input_rate_bf_roll_pitch_yaw_no_shaping_rads (roll_rate_bf_rads, pitch_rate_bf_rads, yaw_rate_bf_rads);
670
+ }
671
+
672
+ void AC_AttitudeControl::input_rate_bf_roll_pitch_yaw_no_shaping_rads (float roll_rate_bf_rads, float pitch_rate_bf_rads, float yaw_rate_bf_rads)
673
+ {
674
+
640
675
_ang_vel_target_rads.x = roll_rate_bf_rads;
641
676
_ang_vel_target_rads.y = pitch_rate_bf_rads;
642
677
_ang_vel_target_rads.z = yaw_rate_bf_rads;
@@ -661,6 +696,11 @@ void AC_AttitudeControl::input_angle_step_bf_roll_pitch_yaw_cd(float roll_angle_
661
696
const float pitch_angle_step_bf_rad = cd_to_rad (pitch_angle_step_bf_cd);
662
697
const float yaw_angle_step_bf_rad = cd_to_rad (yaw_angle_step_bf_cd);
663
698
699
+ input_angle_step_bf_roll_pitch_yaw_rad (roll_angle_step_bf_rad, pitch_angle_step_bf_rad, yaw_angle_step_bf_rad);
700
+ }
701
+
702
+ void AC_AttitudeControl::input_angle_step_bf_roll_pitch_yaw_rad (float roll_angle_step_bf_rad, float pitch_angle_step_bf_rad, float yaw_angle_step_bf_rad)
703
+ {
664
704
// rotate attitude target by desired step
665
705
Quaternion attitude_target_update;
666
706
attitude_target_update.from_axis_angle (Vector3f{roll_angle_step_bf_rad, pitch_angle_step_bf_rad, yaw_angle_step_bf_rad});
@@ -682,6 +722,16 @@ void AC_AttitudeControl::input_angle_step_bf_roll_pitch_yaw_cd(float roll_angle_
682
722
// Used to command a step in rate without exciting the orthogonal axis during autotune
683
723
// Done as a single thread-safe function to avoid intermediate zero values being seen by the attitude controller
684
724
void AC_AttitudeControl::input_rate_step_bf_roll_pitch_yaw_cds (float roll_rate_step_bf_cds, float pitch_rate_step_bf_cds, float yaw_rate_step_bf_cds)
725
+ {
726
+ // Convert from centidegrees on public interface to radians
727
+ const float roll_rate_step_bf_rads = cd_to_rad (roll_rate_step_bf_cds);
728
+ const float pitch_rate_step_bf_rads = cd_to_rad (pitch_rate_step_bf_cds);
729
+ const float yaw_rate_step_bf_rads = cd_to_rad (yaw_rate_step_bf_cds);
730
+
731
+ input_rate_step_bf_roll_pitch_yaw_rads (roll_rate_step_bf_rads, pitch_rate_step_bf_rads, yaw_rate_step_bf_rads);
732
+ }
733
+
734
+ void AC_AttitudeControl::input_rate_step_bf_roll_pitch_yaw_rads (float roll_rate_step_bf_rads, float pitch_rate_step_bf_rads, float yaw_rate_step_bf_rads)
685
735
{
686
736
// Update the unused targets attitude based on current attitude to condition mode change
687
737
_ahrs.get_quat_body_to_ned (_attitude_target);
@@ -691,17 +741,21 @@ void AC_AttitudeControl::input_rate_step_bf_roll_pitch_yaw_cds(float roll_rate_s
691
741
// Convert body-frame angular velocity into euler angle derivative of desired attitude
692
742
_euler_rate_target_rads.zero ();
693
743
694
- Vector3f ang_vel_body_rads {roll_rate_step_bf_cds, pitch_rate_step_bf_cds, yaw_rate_step_bf_cds};
695
- ang_vel_body_rads = ang_vel_body_rads * 0 .01f * DEG_TO_RAD;
696
744
// finally update the attitude target
697
- _ang_vel_body_rads = ang_vel_body_rads ;
745
+ _ang_vel_body_rads = Vector3f{roll_rate_step_bf_rads, pitch_rate_step_bf_rads, yaw_rate_step_bf_rads} ;
698
746
}
699
747
700
748
// Command a thrust vector and heading rate
701
749
void AC_AttitudeControl::input_thrust_vector_rate_heading_cds (const Vector3f& thrust_vector, float heading_rate_cds, bool slew_yaw)
702
750
{
703
751
// Convert from centidegrees on public interface to radians
704
- float heading_rate_rads = cd_to_rad (heading_rate_cds);
752
+ const float heading_rate_rads = cd_to_rad (heading_rate_cds);
753
+
754
+ input_thrust_vector_rate_heading_rads (thrust_vector, heading_rate_rads, slew_yaw);
755
+ }
756
+
757
+ void AC_AttitudeControl::input_thrust_vector_rate_heading_rads (const Vector3f& thrust_vector, float heading_rate_rads, bool slew_yaw)
758
+ {
705
759
if (slew_yaw) {
706
760
// a zero _angle_vel_yaw_max means that setting is disabled
707
761
const float slew_yaw_max_rads = get_slew_yaw_max_rads ();
@@ -755,13 +809,21 @@ void AC_AttitudeControl::input_thrust_vector_rate_heading_cds(const Vector3f& th
755
809
756
810
// Command a thrust vector, heading and heading rate
757
811
void AC_AttitudeControl::input_thrust_vector_heading_cd (const Vector3f& thrust_vector, float heading_angle_cd, float heading_rate_cds)
812
+ {
813
+ // Convert from centidegrees on public interface to radians
814
+ const float heading_rate_rads = cd_to_rad (heading_rate_cds);
815
+ const float heading_angle_rad = cd_to_rad (heading_angle_cd);
816
+
817
+ input_thrust_vector_heading_rad (thrust_vector, heading_angle_rad, heading_rate_rads);
818
+ }
819
+
820
+ void AC_AttitudeControl::input_thrust_vector_heading_rad (const Vector3f& thrust_vector, float heading_angle_rad, float heading_rate_rads)
758
821
{
759
822
// a zero _angle_vel_yaw_max means that setting is disabled
760
823
const float slew_yaw_max_rads = get_slew_yaw_max_rads ();
761
824
762
825
// Convert from centidegrees on public interface to radians
763
- const float heading_rate_rads = constrain_float (cd_to_rad (heading_rate_cds), -slew_yaw_max_rads, slew_yaw_max_rads);
764
- const float heading_angle_rad = cd_to_rad (heading_angle_cd);
826
+ heading_rate_rads = constrain_float (heading_rate_rads, -slew_yaw_max_rads, slew_yaw_max_rads);
765
827
766
828
// update attitude target
767
829
update_attitude_target ();
0 commit comments