PX4 ROS 2 Interface Library
Library to interface with PX4 from a companion computer using ROS 2
Loading...
Searching...
No Matches
mission.hpp
1/****************************************************************************
2 * Copyright (c) 2024 PX4 Development Team.
3 * SPDX-License-Identifier: BSD-3-Clause
4 ****************************************************************************/
5
6#pragma once
7
8#include <Eigen/Eigen>
9#include <filesystem>
10#include <optional>
11#include <px4_ros2/third_party/nlohmann/json_fwd.hpp>
12#include <rclcpp/rclcpp.hpp>
13#include <thread>
14#include <utility>
15#include <variant>
16
17namespace px4_ros2 {
26 public:
28
29 explicit ActionArguments(const nlohmann::json& json);
30
31 const nlohmann::json& json() const { return *_data; }
32
33 bool contains(const std::string& key) const;
34
35 template <typename T>
36 T at(const std::string& key) const;
37
43 bool resuming() const;
44
45 private:
46 std::shared_ptr<nlohmann::json> _data;
47};
48
49enum class MissionFrame {
50 Global,
52};
53
54static inline std::string missionFrameStr(MissionFrame frame)
55{
56 switch (frame) {
57 case MissionFrame::Global:
58 return "global";
59 }
60 return "unknown";
61}
62
63struct Waypoint {
64 Waypoint() = default;
65 explicit Waypoint(Eigen::Vector3d a_coordinate, MissionFrame a_frame = MissionFrame::Global)
66 : coordinate(std::move(a_coordinate)), frame(a_frame)
67 {
68 }
69
70 Eigen::Vector3d coordinate;
71
72 MissionFrame frame{MissionFrame::Global};
73
74 friend void from_json(const nlohmann::json& j, Waypoint& o); // NOLINT
75 friend void to_json(nlohmann::json& j, const Waypoint& o); // NOLINT
76};
77
78enum class NavigationItemType {
80};
81
83 NavigationItem() = default;
84 NavigationItem(const Waypoint& waypoint) // NOLINT(google-explicit-constructor)
85 : data(waypoint)
86 {
87 }
88
89 std::string id;
90 std::variant<Waypoint> data;
91
92 friend void from_json(const nlohmann::json& j, NavigationItem& o); // NOLINT
93 friend void to_json(nlohmann::json& j, const NavigationItem& o); // NOLINT
94};
95
96struct ActionItem {
97 ActionItem() = default;
98 explicit ActionItem(std::string a_name, ActionArguments a_arguments = {})
99 : name(std::move(a_name)), arguments(std::move(a_arguments))
100 {
101 }
102
103 std::string name;
104 std::string id;
105
106 ActionArguments arguments;
107
108 friend void from_json(const nlohmann::json& j, ActionItem& o); // NOLINT
109 friend void to_json(nlohmann::json& j, const ActionItem& o); // NOLINT
110};
111
112using MissionItem = std::variant<NavigationItem, ActionItem>;
113
115 std::optional<float> horizontal_velocity;
116 std::optional<float> vertical_velocity;
117 std::optional<float> max_heading_rate;
118
119 void combineWith(const TrajectoryOptions& options)
120 {
121 if (options.horizontal_velocity) {
123 }
124 if (options.vertical_velocity) {
126 }
127 if (options.max_heading_rate) {
129 }
130 }
131
132 friend void from_json(const nlohmann::json& j, TrajectoryOptions& o); // NOLINT
133 friend void to_json(nlohmann::json& j, const TrajectoryOptions& o); // NOLINT
134};
135
137 TrajectoryOptions trajectory_options;
138
139 friend void from_json(const nlohmann::json& j, MissionDefaults& o); // NOLINT
140 friend void to_json(nlohmann::json& j, const MissionDefaults& o); // NOLINT
141};
142
149class Mission {
150 public:
151 Mission() = default;
152
153 explicit Mission(std::vector<MissionItem> mission_items, MissionDefaults mission_defaults = {})
154 : _mission_defaults(mission_defaults), _mission_items(std::move(mission_items))
155 {
156 }
157
158 const MissionDefaults& defaults() const { return _mission_defaults; }
159
160 const std::vector<MissionItem>& items() const { return _mission_items; }
161
162 bool indexValid(int index) const
163 {
164 return index >= 0 && index < static_cast<int>(_mission_items.size());
165 }
166
167 friend void from_json(const nlohmann::json& j, Mission& o); // NOLINT
168 friend void to_json(nlohmann::json& j, const Mission& o); // NOLINT
169
170 std::string checksum() const;
171
172 private:
173 MissionDefaults _mission_defaults;
174 std::vector<MissionItem> _mission_items;
175};
176
182 public:
183 MissionFileMonitor(std::shared_ptr<rclcpp::Node> node, std::filesystem::path filename,
184 std::function<void(std::shared_ptr<Mission>)> on_mission_update);
186
187 private:
188 void run();
189 void fileUpdated();
190
191 std::shared_ptr<rclcpp::Node> _node;
192 const std::filesystem::path _filename;
193 const std::function<void(std::shared_ptr<Mission>)> _on_mission_update;
194 std::thread _thread;
195 int _event_fd{-1};
196 rclcpp::TimerBase::SharedPtr _update_timer;
197};
198
200} /* namespace px4_ros2 */
Arguments passed to an action from the mission JSON definition.
Definition mission.hpp:25
bool resuming() const
Check if the action is being resumed.
File monitor to load a mission from a JSON file.
Definition mission.hpp:181
Mission definition.
Definition mission.hpp:149
Definition mission.hpp:96
Definition mission.hpp:136
Definition mission.hpp:82
Definition mission.hpp:114
std::optional< float > max_heading_rate
[rad/s]
Definition mission.hpp:117
std::optional< float > vertical_velocity
[m/s]
Definition mission.hpp:116
std::optional< float > horizontal_velocity
[m/s]
Definition mission.hpp:115
Definition mission.hpp:63