PX4 ROS 2 Interface Library
Library to interface with PX4 from a companion computer using ROS 2
vtol.hpp
1 /****************************************************************************
2  * Copyright (c) 2025 PX4 Development Team.
3  * SPDX-License-Identifier: BSD-3-Clause
4  ****************************************************************************/
5 
6  #pragma once
7 
8  #include <px4_msgs/msg/vehicle_command.hpp>
9  #include <px4_msgs/msg/vtol_vehicle_status.hpp>
10  #include <px4_msgs/msg/vehicle_local_position.hpp>
11  #include <Eigen/Core>
12 
13  #include <px4_ros2/common/context.hpp>
14 
15 namespace px4_ros2
16 {
17 struct VTOLConfig
18 {
21  float deceleration_integrator_limit{0.3f};
22 
23  VTOLConfig & withBackTransitionDeceleration(
24  const float back_transition_deceleration)
25  {
26  this->back_transition_deceleration = back_transition_deceleration;
27  return *this;
28  }
29 
30  VTOLConfig & withDecelerationIntegratorLimit(
31  const float deceleration_integrator_limit)
32  {
33  this->deceleration_integrator_limit = deceleration_integrator_limit;
34  return *this;
35  }
36 
37  VTOLConfig & withBackTransitionDecelerationIGain(
39  {
40  this->back_transition_deceleration_setpoint_to_pitch_i =
42  return *this;
43  }
44 
45 
46 };
47 
55 class VTOL
56 {
57 public:
58  explicit VTOL(Context & context, const VTOLConfig & config = VTOLConfig{});
59 
60  enum class State
61  {
62  Undefined = 0,
63  TransitionToFixedWing = 1,
64  TransitionToMulticopter = 2,
65  Multicopter = 3,
66  FixedWing = 4
67  };
68 
73  bool toMulticopter();
74  bool toFixedwing();
75 
76  Eigen::Vector3f computeAccelerationSetpointDuringTransition(
77  std::optional<float> back_transition_deceleration_m_s2 = std::nullopt);
78 
79  VTOL::State getCurrentState() const {return _current_state;}
80 
81 private:
82  rclcpp::Node & _node;
83  rclcpp::Publisher<px4_msgs::msg::VehicleCommand>::SharedPtr _vehicle_command_pub;
84  rclcpp::Subscription<px4_msgs::msg::VtolVehicleStatus>::SharedPtr _vtol_vehicle_status_sub;
85  rclcpp::Subscription<px4_msgs::msg::VehicleLocalPosition>::SharedPtr _vehicle_local_position_sub;
86  rclcpp::Time _last_command_sent;
87  rclcpp::Time _last_vtol_vehicle_status_received;
88  rclcpp::Time _last_pitch_integrator_update{0, 0, _node.get_clock()->get_clock_type()};
89 
90  float _vehicle_heading{NAN};
91  float _decel_error_bt_int{0.f};
92 
93  Eigen::Vector2f _vehicle_acceleration_xy{NAN, NAN};
94 
95  VTOL::State _current_state{VTOL::State::Undefined};
96 
97  float computePitchSetpointDuringBacktransition(
98  std::optional<float> back_transition_deceleration_m_s2 = std::nullopt);
99 
100  VTOLConfig _config;
101 };
102 
104 } /* namespace px4_ros2 */
Definition: context.hpp:20
Provides VTOL transition command.
Definition: vtol.hpp:56
bool toMulticopter()
Definition: vtol.hpp:18
float back_transition_deceleration
Definition: vtol.hpp:19
float back_transition_deceleration_setpoint_to_pitch_i
Definition: vtol.hpp:20