10 #include <px4_ros2/components/mode.hpp>
11 #include <px4_ros2/components/mode_executor.hpp>
12 #include <px4_ros2/mission/mission.hpp>
13 #include <px4_ros2/mission/actions/action.hpp>
14 #include <px4_ros2/mission/trajectory/trajectory_executor.hpp>
15 #include <px4_ros2/vehicle_state/land_detected.hpp>
23 class AsyncFunctionCalls;
24 class ActionStateKeeper;
35 std::vector<std::function<std::shared_ptr<ActionInterface>(
ModeBase & mode)>>
36 custom_actions_factory;
37 std::set<std::string> default_actions{
"changeSettings",
"onResume",
"onFailure",
"takeoff",
38 "rtl",
"land",
"hold"};
39 std::function<std::shared_ptr<TrajectoryExecutorInterface>(
ModeBase & mode)>
40 trajectory_executor_factory;
41 std::string persistence_filename;
43 template<
class ActionType,
typename ... Args>
46 custom_actions_factory.push_back(
47 [args = std::tie(std::forward<Args>(args) ...)](
ModeBase & mode)
mutable {
49 [&mode](
auto &&... args)
51 return std::make_shared<ActionType>(mode, std::forward<Args>(args)...);
56 template<
typename TrajectoryExecutorType,
typename ... Args>
59 trajectory_executor_factory =
60 [args = std::tie(std::forward<Args>(args) ...)](
ModeBase & mode)
mutable {
62 [&mode](
auto &&... args)
64 return std::make_shared<TrajectoryExecutorType>(mode, std::forward<Args>(args)...);
69 Configuration & withPersistenceFile(
const std::string & filename)
71 persistence_filename = filename;
77 const std::string & mode_name,
const Configuration & configuration,
78 rclcpp::Node & node,
const std::string & topic_namespace_prefix =
"");
84 void setMission(
const Mission & mission);
87 const Mission & mission()
const {
return *_mission;}
89 void onActivated(
const std::function<
void()> & callback) {_on_activated = callback;}
90 void onDeactivated(
const std::function<
void()> & callback) {_on_deactivated = callback;}
95 void onProgressUpdate(
const std::function<
void(
int)> & callback) {_on_progress_update = callback;}
96 void onCompleted(
const std::function<
void()> & callback) {_on_completed = callback;}
97 void onFailsafeDeferred(
const std::function<
void()> & callback);
98 void onReadynessUpdate(
99 const std::function<
void(
bool ready,
100 const std::vector<std::string> & errors)> & callback);
125 rclcpp::Node & node,
const Settings & settings,
const std::string & topic_namespace_prefix,
127 :
ModeBase(node, settings, topic_namespace_prefix), _mission_executor(mission_executor)
136 _mission_executor.checkArmingAndRunConditions(reporter);
140 void updateSetpoint(
float dt_s)
override {_mission_executor.updateSetpoint();}
142 void disableWatchdogTimer()
144 ModeBase::disableWatchdogTimer();
148 MissionExecutor & _mission_executor;
156 const std::string & topic_namespace_prefix,
MissionExecutor & mission_executor)
157 :
ModeExecutorBase(node, settings, owned_mode, topic_namespace_prefix), _mission_executor(
166 void onDeactivate(DeactivateReason reason)
override {_mission_executor.onDeactivate(reason);}
169 if (on_failsafe_deferred) {
170 on_failsafe_deferred();
175 uint32_t command,
float param1,
float param2,
float param3,
176 float param4,
float param5,
float param6,
float param7)
override
178 if (command_handler) {
179 return command_handler(
184 command, param1, param2, param3, param4, param5,
188 void setRegistration(
const std::shared_ptr<Registration> & registration)
190 setSkipMessageCompatibilityCheck();
191 overrideRegistration(registration);
193 std::function<bool(uint32_t,
float)> command_handler{
nullptr};
194 std::function<void()> on_failsafe_deferred{
nullptr};
197 MissionExecutor & _mission_executor;
200 virtual bool doRegisterImpl(MissionMode & mode, MissionModeExecutor & executor_base);
202 void setCommandHandler(
const std::function<
bool(uint32_t,
float)> & command_handler)
204 _mode_executor->command_handler = command_handler;
209 ModeExecutorBase & modeExecutor() {
return *_mode_executor;}
211 std::shared_ptr<LandDetected> _land_detected;
214 using ActionID = int;
215 enum class AbortReason
223 static std::string abortReasonStr(AbortReason reason);
225 void checkArmingAndRunConditions(HealthAndArmingCheckReporter & reporter);
226 void checkReadynessAndReport();
227 void updateSetpoint();
229 void onDeactivate(ModeExecutorBase::DeactivateReason reason);
231 bool isReady()
const {
return _has_valid_mission && _actions_ready;}
235 const std::function<
void()> & on_completed,
const std::function<
void()> & on_failure =
nullptr);
237 const std::string & action_name,
const ActionArguments & arguments,
238 const std::function<
void()> & on_completed);
240 const std::shared_ptr<Mission> & trajectory,
int start_index,
int end_index,
241 const std::function<
void(
int)> & on_index_reached,
bool stop_at_last_item);
243 void runNextMissionItem();
244 void runCurrentMissionItem(
bool resuming);
245 void resetMissionState();
246 std::pair<int, bool> getNextTrajectorySegment(
int start_index)
const;
247 bool currentActionSupportsResumeFromLanded()
const;
249 void setTrajectoryOptions(
const TrajectoryOptions & options);
250 void clearTrajectoryOptions();
252 void setCurrentMissionIndex(
int index);
254 void abort(AbortReason reason);
255 void invalidateActionHandler();
257 void savePersistentState();
258 void clearPersistentState()
const;
259 bool tryLoadPersistentState();
260 nlohmann::json getOnResumeStateAndClear();
261 void runOnResumeStoreState();
266 ActionArguments arguments;
268 std::unique_ptr<ActionStateKeeper> addContinousAction(
const ActionState & state);
269 void removeContinousAction(ActionID
id);
270 void runStoredActions();
271 void deactivateAllActions();
273 struct PersistentState
275 std::optional<int> current_index;
276 std::string mission_checksum;
278 std::map<ActionID, ActionState> continuous_actions;
280 void toJson(nlohmann::json & j)
const;
281 void fromJson(
const nlohmann::json & j);
284 PersistentState _state;
285 int _next_continuous_action_id{0};
286 const std::string _persistence_filename;
288 enum class MissionItemState
293 MissionItemState _mission_item_state{MissionItemState::Other};
295 bool _is_active{
false};
297 std::optional<rclcpp::Time> _trajectory_update_warn;
299 std::shared_ptr<TrajectoryExecutorInterface> _trajectory_executor;
300 std::map<std::string, std::shared_ptr<ActionInterface>> _actions;
301 std::shared_ptr<Mission> _mission;
302 TrajectoryOptions _trajectory_options;
303 bool _has_valid_mission{
false};
304 static const std::vector<std::string> kNoMissionErrors;
305 std::vector<std::string> _mission_errors{kNoMissionErrors};
306 bool _actions_ready{
false};
307 rclcpp::TimerBase::SharedPtr _readyness_timer;
308 int _abort_recursion_level{0};
310 rclcpp::Node & _node;
311 std::unique_ptr<MissionMode> _mode;
312 std::unique_ptr<MissionModeExecutor> _mode_executor;
313 std::shared_ptr<ActionHandler> _action_handler;
315 std::unique_ptr<AsyncFunctionCalls> _reporting;
316 std::function<void()> _on_activated;
317 std::function<void()> _on_deactivated;
318 std::function<void(
int)> _on_progress_update;
319 std::function<void()> _on_completed;
320 std::function<void(
bool ready,
const std::vector<std::string> & errors)> _on_readyness_update;
322 friend class ActionHandler;
323 friend class ActionStateKeeper;
330 : _id(
id), _mission_executor(mission_executor) {}
334 _mission_executor.removeContinousAction(_id);
350 : _mission_executor(mission_executor) {}
354 const std::function<
void()> & on_completed,
const std::function<
void()> & on_failure =
nullptr)
357 RCLCPP_WARN(_mission_executor._node.get_logger(),
"ActionHandler is not valid anymore");
360 _mission_executor.runMode(mode_id, on_completed, on_failure);
364 const std::function<
void()> & on_completed)
367 RCLCPP_WARN(_mission_executor._node.get_logger(),
"ActionHandler is not valid anymore");
370 _mission_executor.runAction(action_name, arguments, on_completed);
373 const std::shared_ptr<Mission> & trajectory,
374 const std::function<
void()> & on_completed,
bool stop_at_last_item =
true);
386 RCLCPP_WARN(_mission_executor._node.get_logger(),
"ActionHandler is not valid anymore");
389 _mission_executor.clearTrajectoryOptions();
399 RCLCPP_WARN(_mission_executor._node.get_logger(),
"ActionHandler is not valid anymore");
402 _mission_executor.setTrajectoryOptions(options);
406 std::optional<int> getCurrentMissionIndex()
const;
416 bool currentActionSupportsResumeFromLanded()
const;
430 const std::string & action_name,
436 return _mission_executor.addContinousAction(
437 MissionExecutor::ActionState{action_name,
441 const Mission & mission()
const {
return _mission_executor.mission();}
453 RCLCPP_WARN(_mission_executor._node.get_logger(),
"ActionHandler is not valid anymore");
467 RCLCPP_WARN(_mission_executor._node.get_logger(),
"ActionHandler is not valid anymore");
470 _mission_executor.onFailsafeDeferred(callback);
484 void setInvalid() {_valid =
false;}
487 MissionExecutor & _mission_executor;
Arguments passed to an action from the mission JSON definition.
Definition: mission.hpp:29
Handler passed to custom actions to run modes, actions and trajectories.
Definition: mission_executor.hpp:347
void setTrajectoryOptions(const TrajectoryOptions &options)
Override the trajectory config options.
Definition: mission_executor.hpp:396
TrajectoryOptions getTrajectoryOptions() const
get the current trajectory config options
Definition: mission_executor.hpp:379
bool isValid() const
Check if the handler is still valid.
Definition: mission_executor.hpp:480
bool deferFailsafes(bool enabled, int timeout_s=0)
enable/disable deferral of failsafes
Definition: mission_executor.hpp:450
void clearTrajectoryOptions()
Reset the current trajectory config options to the mission defaults.
Definition: mission_executor.hpp:383
void onFailsafeDeferred(const std::function< void()> &callback)
register callback for failsafe notification
Definition: mission_executor.hpp:464
std::unique_ptr< ActionStateKeeper > storeState(const std::string &action_name, const ActionArguments &arguments)
store the state of a continuous action
Definition: mission_executor.hpp:429
void setCurrentMissionIndex(int index)
Set the current mission index.
Definition: mission_executor.hpp:327
Definition: health_and_arming_checks.hpp:24
Definition: mission_executor.hpp:152
void onActivate() override
Definition: mission_executor.hpp:165
Result sendCommandSync(uint32_t command, float param1, float param2, float param3, float param4, float param5, float param6, float param7) override
Definition: mission_executor.hpp:174
void onFailsafeDeferred() override
Definition: mission_executor.hpp:167
void onDeactivate(DeactivateReason reason) override
Definition: mission_executor.hpp:166
Definition: mission_executor.hpp:122
void onDeactivate() override
Definition: mission_executor.hpp:139
void checkArmingAndRunConditions(HealthAndArmingCheckReporter &reporter) override
Definition: mission_executor.hpp:134
void onActivate() override
Definition: mission_executor.hpp:138
Mission execution state machine.
Definition: mission_executor.hpp:31
bool deferFailsafes(bool enabled, int timeout_s=0)
void onProgressUpdate(const std::function< void(int)> &callback)
Definition: mission_executor.hpp:95
Mission definition.
Definition: mission.hpp:158
Base class for a mode.
Definition: mode.hpp:71
uint8_t ModeID
Mode ID, corresponds to nav_state.
Definition: mode.hpp:73
Base class for a mode executor.
Definition: mode_executor.hpp:32
virtual Result sendCommandSync(uint32_t command, float param1=NAN, float param2=NAN, float param3=NAN, float param4=NAN, float param5=NAN, float param6=NAN, float param7=NAN)
Result
Definition: mode.hpp:31
@ Rejected
The request was rejected.
Definition: mission_executor.hpp:34
Definition: mode_executor.hpp:37
Definition: mission.hpp:121