@@ -38,8 +38,6 @@ using namespace time_literals;
3838DifferentialAttControl::DifferentialAttControl (ModuleParams *parent) : ModuleParams(parent)
3939{
4040 _rover_rate_setpoint_pub.advertise ();
41- _rover_throttle_setpoint_pub.advertise ();
42- _rover_attitude_setpoint_pub.advertise ();
4341 _rover_attitude_status_pub.advertise ();
4442 updateParams ();
4543}
@@ -52,21 +50,20 @@ void DifferentialAttControl::updateParams()
5250 _max_yaw_rate = _param_ro_yaw_rate_limit.get () * M_DEG_TO_RAD_F;
5351 }
5452
53+ // Set up PID controller
5554 _pid_yaw.setGains (_param_ro_yaw_p.get (), 0 .f , 0 .f );
5655 _pid_yaw.setIntegralLimit (_max_yaw_rate);
5756 _pid_yaw.setOutputLimit (_max_yaw_rate);
57+
58+ // Set up slew rate
5859 _adjusted_yaw_setpoint.setSlewRate (_max_yaw_rate);
5960}
6061
6162void DifferentialAttControl::updateAttControl ()
6263{
63- const hrt_abstime timestamp_prev = _timestamp;
64+ hrt_abstime timestamp_prev = _timestamp;
6465 _timestamp = hrt_absolute_time ();
65- _dt = math::constrain (_timestamp - timestamp_prev, 1_ms, 5000_ms) * 1e-6f ;
66-
67- if (_vehicle_control_mode_sub.updated ()) {
68- _vehicle_control_mode_sub.copy (&_vehicle_control_mode);
69- }
66+ const float dt = math::constrain (_timestamp - timestamp_prev, 1_ms, 5000_ms) * 1e-6f ;
7067
7168 if (_vehicle_attitude_sub.updated ()) {
7269 vehicle_attitude_s vehicle_attitude{};
@@ -75,17 +72,20 @@ void DifferentialAttControl::updateAttControl()
7572 _vehicle_yaw = matrix::Eulerf (vehicle_attitude_quaternion).psi ();
7673 }
7774
78- if (_vehicle_control_mode. flag_control_attitude_enabled && _vehicle_control_mode. flag_armed && runSanityChecks ()) {
79-
80- if (_vehicle_control_mode. flag_control_manual_enabled || _vehicle_control_mode. flag_control_offboard_enabled ) {
81- generateAttitudeAndThrottleSetpoint () ;
82- }
75+ if (_rover_attitude_setpoint_sub. updated ()) {
76+ rover_attitude_setpoint_s rover_attitude_setpoint{};
77+ _rover_attitude_setpoint_sub. copy (&rover_attitude_setpoint);
78+ _yaw_setpoint = rover_attitude_setpoint. yaw_setpoint ;
79+ }
8380
84- generateRateSetpoint ();
81+ if (PX4_ISFINITE (_yaw_setpoint)) {
82+ const float yaw_rate_setpoint = RoverControl::attitudeControl (_adjusted_yaw_setpoint, _pid_yaw, _max_yaw_rate,
83+ _vehicle_yaw, _yaw_setpoint, dt);
84+ rover_rate_setpoint_s rover_rate_setpoint{};
85+ rover_rate_setpoint.timestamp = _timestamp;
86+ rover_rate_setpoint.yaw_rate_setpoint = math::constrain (yaw_rate_setpoint, -_max_yaw_rate, _max_yaw_rate);
87+ _rover_rate_setpoint_pub.publish (rover_rate_setpoint);
8588
86- } else { // Reset pid and slew rate when attitude control is not active
87- _pid_yaw.resetIntegral ();
88- _adjusted_yaw_setpoint.setForcedValue (0 .f );
8989 }
9090
9191 // Publish attitude controller status (logging only)
@@ -97,96 +97,6 @@ void DifferentialAttControl::updateAttControl()
9797
9898}
9999
100- void DifferentialAttControl::generateAttitudeAndThrottleSetpoint ()
101- {
102- const bool stab_mode_enabled = _vehicle_control_mode.flag_control_manual_enabled
103- && !_vehicle_control_mode.flag_control_position_enabled && _vehicle_control_mode.flag_control_attitude_enabled ;
104-
105- if (stab_mode_enabled && _manual_control_setpoint_sub.updated ()) { // Stab Mode
106- manual_control_setpoint_s manual_control_setpoint{};
107-
108- if (_manual_control_setpoint_sub.update (&manual_control_setpoint)) {
109-
110- rover_throttle_setpoint_s rover_throttle_setpoint{};
111- rover_throttle_setpoint.timestamp = _timestamp;
112- rover_throttle_setpoint.throttle_body_x = manual_control_setpoint.throttle ;
113- rover_throttle_setpoint.throttle_body_y = 0 .f ;
114- _rover_throttle_setpoint_pub.publish (rover_throttle_setpoint);
115-
116- const float yaw_delta = math::interpolate<float >(math::deadzone (manual_control_setpoint.roll ,
117- _param_ro_yaw_stick_dz.get ()), -1 .f , 1 .f , -_max_yaw_rate / _param_ro_yaw_p.get (),
118- _max_yaw_rate / _param_ro_yaw_p.get ());
119-
120- if (fabsf (yaw_delta) > FLT_EPSILON
121- || fabsf (rover_throttle_setpoint.throttle_body_x ) < FLT_EPSILON) { // Closed loop yaw rate control
122- _stab_yaw_ctl = false ;
123- const float yaw_setpoint = matrix::wrap_pi (_vehicle_yaw + yaw_delta);
124- rover_attitude_setpoint_s rover_attitude_setpoint{};
125- rover_attitude_setpoint.timestamp = _timestamp;
126- rover_attitude_setpoint.yaw_setpoint = yaw_setpoint;
127- _rover_attitude_setpoint_pub.publish (rover_attitude_setpoint);
128-
129- } else { // Closed loop yaw control if the yaw rate input is zero (keep current yaw)
130- if (!_stab_yaw_ctl) {
131- _stab_yaw_setpoint = _vehicle_yaw;
132- _stab_yaw_ctl = true ;
133- }
134-
135- rover_attitude_setpoint_s rover_attitude_setpoint{};
136- rover_attitude_setpoint.timestamp = _timestamp;
137- rover_attitude_setpoint.yaw_setpoint = _stab_yaw_setpoint;
138- _rover_attitude_setpoint_pub.publish (rover_attitude_setpoint);
139- }
140-
141-
142- }
143-
144- } else if (_vehicle_control_mode.flag_control_offboard_enabled ) { // Offboard attitude control
145- trajectory_setpoint_s trajectory_setpoint{};
146- _trajectory_setpoint_sub.copy (&trajectory_setpoint);
147-
148- if (_offboard_control_mode_sub.updated ()) {
149- _offboard_control_mode_sub.copy (&_offboard_control_mode);
150- }
151-
152- const bool offboard_att_control = _offboard_control_mode.attitude && !_offboard_control_mode.position
153- && !_offboard_control_mode.velocity ;
154-
155- if (offboard_att_control && PX4_ISFINITE (trajectory_setpoint.yaw )) {
156- rover_attitude_setpoint_s rover_attitude_setpoint{};
157- rover_attitude_setpoint.timestamp = _timestamp;
158- rover_attitude_setpoint.yaw_setpoint = trajectory_setpoint.yaw ;
159- _rover_attitude_setpoint_pub.publish (rover_attitude_setpoint);
160- }
161- }
162- }
163-
164- void DifferentialAttControl::generateRateSetpoint ()
165- {
166- if (_rover_attitude_setpoint_sub.updated ()) {
167- _rover_attitude_setpoint_sub.copy (&_rover_attitude_setpoint);
168- }
169-
170- if (_rover_rate_setpoint_sub.updated ()) {
171- _rover_rate_setpoint_sub.copy (&_rover_rate_setpoint);
172- }
173-
174- // Check if a new rate setpoint was already published from somewhere else
175- if (_rover_rate_setpoint.timestamp > _last_rate_setpoint_update
176- && _rover_rate_setpoint.timestamp > _rover_attitude_setpoint.timestamp ) {
177- return ;
178- }
179-
180- const float yaw_rate_setpoint = RoverControl::attitudeControl (_adjusted_yaw_setpoint, _pid_yaw, _max_yaw_rate,
181- _vehicle_yaw, _rover_attitude_setpoint.yaw_setpoint , _dt);
182-
183- _last_rate_setpoint_update = _timestamp;
184- rover_rate_setpoint_s rover_rate_setpoint{};
185- rover_rate_setpoint.timestamp = _timestamp;
186- rover_rate_setpoint.yaw_rate_setpoint = math::constrain (yaw_rate_setpoint, -_max_yaw_rate, _max_yaw_rate);
187- _rover_rate_setpoint_pub.publish (rover_rate_setpoint);
188- }
189-
190100bool DifferentialAttControl::runSanityChecks ()
191101{
192102 bool ret = true ;
@@ -197,13 +107,9 @@ bool DifferentialAttControl::runSanityChecks()
197107
198108 if (_param_ro_yaw_p.get () < FLT_EPSILON) {
199109 ret = false ;
200-
201- if (_prev_param_check_passed) {
202- events::send<float >(events::ID (" differential_att_control_conf_invalid_yaw_p" ), events::Log::Error,
203- " Invalid configuration of necessary parameter RO_YAW_P" , _param_ro_yaw_p.get ());
204- }
110+ events::send<float >(events::ID (" differential_att_control_conf_invalid_yaw_p" ), events::Log::Error,
111+ " Invalid configuration of necessary parameter RO_YAW_P" , _param_ro_yaw_p.get ());
205112 }
206113
207- _prev_param_check_passed = ret;
208114 return ret;
209115}
0 commit comments