PX4 ROS 2 Interface Library
Library to interface with PX4 from a companion computer using ROS 2
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 
17 namespace 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 
49 enum class MissionFrame {
50  Global,
52 };
53 
54 static inline std::string missionFrameStr(MissionFrame frame)
55 {
56  switch (frame) {
57  case MissionFrame::Global:
58  return "global";
59  }
60  return "unknown";
61 }
62 
63 struct 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 
78 enum class NavigationItemType {
79  Waypoint,
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 
96 struct 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 
112 using 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 
149 class 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