PX4 ROS 2 Interface Library
Library to interface with PX4 from a companion computer using ROS 2
Loading...
Searching...
No Matches
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 <Eigen/Core>
9#include <chrono>
10#include <px4_msgs/msg/vehicle_command.hpp>
11#include <px4_msgs/msg/vehicle_local_position.hpp>
12#include <px4_msgs/msg/vtol_vehicle_status.hpp>
13#include <px4_ros2/common/context.hpp>
14#include <px4_ros2/components/shared_subscription.hpp>
15
16namespace px4_ros2 {
17struct VTOLConfig {
22 float deceleration_integrator_limit{0.3f};
23 std::chrono::seconds status_timeout{
24 5};
26 VTOLConfig& withBackTransitionDeceleration(const float back_transition_deceleration)
27 {
28 this->back_transition_deceleration = back_transition_deceleration;
29 return *this;
30 }
31
32 VTOLConfig& withDecelerationIntegratorLimit(const float deceleration_integrator_limit)
33 {
34 this->deceleration_integrator_limit = deceleration_integrator_limit;
35 return *this;
36 }
37
38 VTOLConfig& withBackTransitionDecelerationIGain(
40 {
41 this->back_transition_deceleration_setpoint_to_pitch_i =
43 return *this;
44 }
45
46 VTOLConfig& withStatusTimeout(const std::chrono::seconds timeout)
47 {
48 this->status_timeout = timeout;
49 return *this;
50 }
51};
52
60class VTOL {
61 public:
62 explicit VTOL(Context& context, const VTOLConfig& config = VTOLConfig{});
63
64 enum class State {
65 Undefined = 0,
66 TransitionToFixedWing = 1,
67 TransitionToMulticopter = 2,
68 Multicopter = 3,
69 FixedWing = 4
70 };
71
77 bool toFixedwing();
78
79 Eigen::Vector3f computeAccelerationSetpointDuringTransition(
80 std::optional<float> back_transition_deceleration_m_s2 = std::nullopt);
81
82 State getCurrentState() const { return _current_state; }
83
84 private:
85 rclcpp::Node& _node;
86 rclcpp::Publisher<px4_msgs::msg::VehicleCommand>::SharedPtr _vehicle_command_pub;
87 rclcpp::Subscription<px4_msgs::msg::VtolVehicleStatus>::SharedPtr _vtol_vehicle_status_sub;
88 SharedSubscriptionCallbackInstance _vehicle_local_position_cb;
89 rclcpp::Time _last_command_sent;
90 rclcpp::Time _last_vtol_vehicle_status_received{0, 0, _node.get_clock()->get_clock_type()};
91 rclcpp::Time _last_pitch_integrator_update{0, 0, _node.get_clock()->get_clock_type()};
92
93 float _vehicle_heading{NAN};
94 float _decel_error_bt_int{0.f};
95
96 Eigen::Vector2f _vehicle_acceleration_xy{NAN, NAN};
97
98 State _current_state{State::Undefined};
99
100 float computePitchSetpointDuringBacktransition(
101 std::optional<float> back_transition_deceleration_m_s2 = std::nullopt);
102
103 VTOLConfig _config;
104};
105
107} /* namespace px4_ros2 */
Definition context.hpp:18
Provides VTOL transition command.
Definition vtol.hpp:60
bool toMulticopter()
Definition vtol.hpp:17
float back_transition_deceleration
Definition vtol.hpp:18
std::chrono::seconds status_timeout
Definition vtol.hpp:23
float back_transition_deceleration_setpoint_to_pitch_i
Definition vtol.hpp:20