@ -110,6 +110,7 @@ private:
@@ -110,6 +110,7 @@ private:
int _control_mode_sub { - 1 } ; /**< vehicle control mode subscription */
int _params_sub { - 1 } ; /**< notification of parameter updates */
int _local_pos_sub { - 1 } ; /**< vehicle local position */
int _att_sub { - 1 } ; /**< vehicle attitude */
int _home_pos_sub { - 1 } ; /**< home position */
int _traj_wp_avoidance_sub { - 1 } ; /**< trajectory waypoint */
@ -149,7 +150,7 @@ private:
@@ -149,7 +150,7 @@ private:
FlightTasks _flight_tasks ; /**< class that generates position controller tracking setpoints*/
PositionControl _control ; /**< class that handles the core PID position controller */
PositionControlStates _states ; /**< structure that contains required state information for position control */
PositionControlStates _states { } ; /**< structure that contains required state information for position control */
hrt_abstime _last_warn = 0 ; /**< timer when the last warn message was sent out */
@ -433,6 +434,15 @@ MulticopterPositionControl::poll_subscriptions()
@@ -433,6 +434,15 @@ MulticopterPositionControl::poll_subscriptions()
orb_copy ( ORB_ID ( vehicle_local_position ) , _local_pos_sub , & _local_pos ) ;
}
orb_check ( _att_sub , & updated ) ;
if ( updated ) {
vehicle_attitude_s att ;
if ( orb_copy ( ORB_ID ( vehicle_attitude ) , _att_sub , & att ) = = PX4_OK & & PX4_ISFINITE ( att . q [ 0 ] ) ) {
_states . yaw = Eulerf ( Quatf ( att . q ) ) . psi ( ) ;
}
}
orb_check ( _home_pos_sub , & updated ) ;
if ( updated ) {
@ -536,9 +546,6 @@ MulticopterPositionControl::set_vehicle_states(const float &vel_sp_z)
@@ -536,9 +546,6 @@ MulticopterPositionControl::set_vehicle_states(const float &vel_sp_z)
}
if ( PX4_ISFINITE ( _local_pos . yaw ) ) {
_states . yaw = _local_pos . yaw ;
}
}
void
@ -550,6 +557,7 @@ MulticopterPositionControl::run()
@@ -550,6 +557,7 @@ MulticopterPositionControl::run()
_control_mode_sub = orb_subscribe ( ORB_ID ( vehicle_control_mode ) ) ;
_params_sub = orb_subscribe ( ORB_ID ( parameter_update ) ) ;
_local_pos_sub = orb_subscribe ( ORB_ID ( vehicle_local_position ) ) ;
_att_sub = orb_subscribe ( ORB_ID ( vehicle_attitude ) ) ;
_home_pos_sub = orb_subscribe ( ORB_ID ( home_position ) ) ;
_traj_wp_avoidance_sub = orb_subscribe ( ORB_ID ( vehicle_trajectory_waypoint ) ) ;
@ -611,7 +619,7 @@ MulticopterPositionControl::run()
@@ -611,7 +619,7 @@ MulticopterPositionControl::run()
_wv_controller - > deactivate ( ) ;
}
_wv_controller - > update ( matrix : : Quatf ( _att_sp . q_d ) , _local_po s . yaw ) ;
_wv_controller - > update ( matrix : : Quatf ( _att_sp . q_d ) , _state s . yaw ) ;
}
if ( _control_mode . flag_armed ) {
@ -787,7 +795,7 @@ MulticopterPositionControl::run()
@@ -787,7 +795,7 @@ MulticopterPositionControl::run()
} else {
// no flighttask is active: set attitude setpoint to idle
_att_sp . roll_body = _att_sp . pitch_body = 0.0f ;
_att_sp . yaw_body = _local_po s . yaw ;
_att_sp . yaw_body = _state s . yaw ;
_att_sp . yaw_sp_move_rate = 0.0f ;
_att_sp . fw_control_yaw = false ;
_att_sp . apply_flaps = false ;
@ -803,6 +811,7 @@ MulticopterPositionControl::run()
@@ -803,6 +811,7 @@ MulticopterPositionControl::run()
orb_unsubscribe ( _control_mode_sub ) ;
orb_unsubscribe ( _params_sub ) ;
orb_unsubscribe ( _local_pos_sub ) ;
orb_unsubscribe ( _att_sub ) ;
orb_unsubscribe ( _home_pos_sub ) ;
orb_unsubscribe ( _traj_wp_avoidance_sub ) ;
}