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);
109 const std::function<
void(
const std::optional<std::string> &)> & callback)
111 _on_activity_info_change = callback;
136 bool controlAutoSetHome(
bool enabled);
149 rclcpp::Node & node,
const Settings & settings,
const std::string & topic_namespace_prefix,
151 :
ModeBase(node, settings, topic_namespace_prefix), _mission_executor(mission_executor)
160 _mission_executor.checkArmingAndRunConditions(reporter);
164 void updateSetpoint(
float dt_s)
override {_mission_executor.updateSetpoint();}
166 void disableWatchdogTimer()
168 ModeBase::disableWatchdogTimer();
172 MissionExecutor & _mission_executor;
180 const std::string & topic_namespace_prefix,
MissionExecutor & mission_executor)
190 void onDeactivate(DeactivateReason reason)
override {_mission_executor.onDeactivate(reason);}
193 if (on_failsafe_deferred) {
194 on_failsafe_deferred();
199 uint32_t command,
float param1,
float param2,
float param3,
200 float param4,
float param5,
float param6,
float param7)
override
202 if (command_handler) {
203 return command_handler(
208 command, param1, param2, param3, param4, param5,
212 void setRegistration(
const std::shared_ptr<Registration> & registration)
214 setSkipMessageCompatibilityCheck();
215 overrideRegistration(registration);
217 std::function<bool(uint32_t,
float)> command_handler{
nullptr};
218 std::function<void()> on_failsafe_deferred{
nullptr};
221 MissionExecutor & _mission_executor;
224 virtual bool doRegisterImpl(MissionMode & mode, MissionModeExecutor & executor_base);
226 void setCommandHandler(
const std::function<
bool(uint32_t,
float)> & command_handler)
228 _mode_executor->command_handler = command_handler;
233 ModeExecutorBase & modeExecutor() {
return *_mode_executor;}
235 std::shared_ptr<LandDetected> _land_detected;
238 using ActionID = int;
239 enum class AbortReason
247 static std::string abortReasonStr(AbortReason reason);
249 void checkArmingAndRunConditions(HealthAndArmingCheckReporter & reporter);
250 void checkReadynessAndReport();
251 void updateSetpoint();
253 void onDeactivate(ModeExecutorBase::DeactivateReason reason);
255 bool isReady()
const {
return _has_valid_mission && _actions_ready;}
259 const std::function<
void()> & on_completed,
const std::function<
void()> & on_failure =
nullptr);
268 float altitude,
float heading,
269 const std::function<
void()> & on_completed,
const std::function<
void()> & on_failure =
nullptr);
271 const std::string & action_name,
const ActionArguments & arguments,
272 const std::function<
void()> & on_completed);
274 const std::shared_ptr<Mission> & trajectory,
int start_index,
int end_index,
275 const std::function<
void(
int)> & on_index_reached,
bool stop_at_last_item);
277 void runNextMissionItem();
278 void runCurrentMissionItem(
bool resuming);
279 void resetMissionState();
280 std::pair<int, bool> getNextTrajectorySegment(
int start_index)
const;
281 bool currentActionSupportsResumeFromLanded()
const;
283 void setTrajectoryOptions(
const TrajectoryOptions & options);
284 void clearTrajectoryOptions();
286 void setCurrentMissionIndex(
int index);
288 void abort(AbortReason reason);
289 void invalidateActionHandler();
291 void savePersistentState();
292 void clearPersistentState()
const;
293 bool tryLoadPersistentState();
294 nlohmann::json getOnResumeStateAndClear();
295 void runOnResumeStoreState();
300 ActionArguments arguments;
302 std::unique_ptr<ActionStateKeeper> addContinousAction(
const ActionState & state);
303 void removeContinousAction(ActionID
id);
304 void runStoredActions();
305 void deactivateAllActions();
307 struct PersistentState
309 std::optional<int> current_index;
310 std::string mission_checksum;
312 std::map<ActionID, ActionState> continuous_actions;
314 void toJson(nlohmann::json & j)
const;
315 void fromJson(
const nlohmann::json & j);
318 PersistentState _state;
319 int _next_continuous_action_id{0};
320 const std::string _persistence_filename;
322 enum class MissionItemState
327 MissionItemState _mission_item_state{MissionItemState::Other};
329 bool _is_active{
false};
331 std::optional<rclcpp::Time> _trajectory_update_warn;
333 std::shared_ptr<TrajectoryExecutorInterface> _trajectory_executor;
334 std::map<std::string, std::shared_ptr<ActionInterface>> _actions;
335 std::shared_ptr<Mission> _mission;
336 TrajectoryOptions _trajectory_options;
337 bool _has_valid_mission{
false};
338 static const std::vector<std::string> kNoMissionErrors;
339 std::vector<std::string> _mission_errors{kNoMissionErrors};
340 bool _actions_ready{
false};
341 rclcpp::TimerBase::SharedPtr _readyness_timer;
342 int _abort_recursion_level{0};
344 rclcpp::Node & _node;
345 std::unique_ptr<MissionMode> _mode;
346 std::unique_ptr<MissionModeExecutor> _mode_executor;
347 std::shared_ptr<ActionHandler> _action_handler;
349 std::unique_ptr<AsyncFunctionCalls> _reporting;
350 std::function<void()> _on_activated;
351 std::function<void()> _on_deactivated;
352 std::function<void(
int)> _on_progress_update;
353 std::function<void()> _on_completed;
354 std::function<void(
const std::optional<std::string> &)> _on_activity_info_change;
355 std::function<void(
bool ready,
const std::vector<std::string> & errors)> _on_readyness_update;
357 friend class ActionHandler;
358 friend class ActionStateKeeper;
365 : _id(
id), _mission_executor(mission_executor) {}
369 _mission_executor.removeContinousAction(_id);
385 : _mission_executor(mission_executor) {}
389 const std::function<
void()> & on_completed,
const std::function<
void()> & on_failure =
nullptr)
392 RCLCPP_WARN(_mission_executor._node.get_logger(),
"ActionHandler is not valid anymore");
395 _mission_executor.runMode(mode_id, on_completed, on_failure);
405 float altitude,
float heading,
406 const std::function<
void()> & on_completed,
const std::function<
void()> & on_failure =
nullptr)
409 RCLCPP_WARN(_mission_executor._node.get_logger(),
"ActionHandler is not valid anymore");
412 _mission_executor.runModeTakeoff(altitude, heading, on_completed, on_failure);
416 const std::function<
void()> & on_completed)
419 RCLCPP_WARN(_mission_executor._node.get_logger(),
"ActionHandler is not valid anymore");
422 _mission_executor.runAction(action_name, arguments, on_completed);
425 const std::shared_ptr<Mission> & trajectory,
426 const std::function<
void()> & on_completed,
bool stop_at_last_item =
true);
438 RCLCPP_WARN(_mission_executor._node.get_logger(),
"ActionHandler is not valid anymore");
441 _mission_executor.clearTrajectoryOptions();
451 RCLCPP_WARN(_mission_executor._node.get_logger(),
"ActionHandler is not valid anymore");
454 _mission_executor.setTrajectoryOptions(options);
467 RCLCPP_WARN(_mission_executor._node.get_logger(),
"ActionHandler is not valid anymore");
481 RCLCPP_WARN(_mission_executor._node.get_logger(),
"ActionHandler is not valid anymore");
487 std::optional<int> getCurrentMissionIndex()
const;
497 bool currentActionSupportsResumeFromLanded()
const;
511 const std::string & action_name,
517 return _mission_executor.addContinousAction(
518 MissionExecutor::ActionState{action_name,
522 const Mission & mission()
const {
return _mission_executor.mission();}
534 RCLCPP_WARN(_mission_executor._node.get_logger(),
"ActionHandler is not valid anymore");
540 bool controlAutoSetHome(
bool enabled)
543 RCLCPP_WARN(_mission_executor._node.get_logger(),
"ActionHandler is not valid anymore");
546 return _mission_executor.controlAutoSetHome(enabled);
557 RCLCPP_WARN(_mission_executor._node.get_logger(),
"ActionHandler is not valid anymore");
560 _mission_executor.onFailsafeDeferred(callback);
574 void setInvalid() {_valid =
false;}
577 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:382
void setTrajectoryOptions(const TrajectoryOptions &options)
Override the trajectory config options.
Definition: mission_executor.hpp:448
TrajectoryOptions getTrajectoryOptions() const
get the current trajectory config options
Definition: mission_executor.hpp:431
void setActvityInfo(const std::string &activity_info)
Sets the activity info for the mission executor. This method forwards the provided activity string to...
Definition: mission_executor.hpp:464
bool isValid() const
Check if the handler is still valid.
Definition: mission_executor.hpp:570
void clearActivityInfo()
Clears the activity information. This method sets the activity info of the mission executor to std::n...
Definition: mission_executor.hpp:478
bool deferFailsafes(bool enabled, int timeout_s=0)
enable/disable deferral of failsafes
Definition: mission_executor.hpp:531
void clearTrajectoryOptions()
Reset the current trajectory config options to the mission defaults.
Definition: mission_executor.hpp:435
void onFailsafeDeferred(const std::function< void()> &callback)
register callback for failsafe notification
Definition: mission_executor.hpp:554
void runModeTakeoff(float altitude, float heading, const std::function< void()> &on_completed, const std::function< void()> &on_failure=nullptr)
Trigger a takeoff.
Definition: mission_executor.hpp:404
std::unique_ptr< ActionStateKeeper > storeState(const std::string &action_name, const ActionArguments &arguments)
store the state of a continuous action
Definition: mission_executor.hpp:510
void setCurrentMissionIndex(int index)
Set the current mission index.
Definition: mission_executor.hpp:362
Definition: health_and_arming_checks.hpp:24
Definition: mission_executor.hpp:176
void onActivate() override
Definition: mission_executor.hpp:189
Result sendCommandSync(uint32_t command, float param1, float param2, float param3, float param4, float param5, float param6, float param7) override
Definition: mission_executor.hpp:198
void onFailsafeDeferred() override
Definition: mission_executor.hpp:191
void onDeactivate(DeactivateReason reason) override
Definition: mission_executor.hpp:190
Definition: mission_executor.hpp:146
void onDeactivate() override
Definition: mission_executor.hpp:163
void checkArmingAndRunConditions(HealthAndArmingCheckReporter &reporter) override
Definition: mission_executor.hpp:158
void onActivate() override
Definition: mission_executor.hpp:162
Mission execution state machine.
Definition: mission_executor.hpp:31
void onActivityInfoChange(const std::function< void(const std::optional< std::string > &)> &callback)
Registers a callback to be invoked when the activity information changes. This callback provides a wa...
Definition: mission_executor.hpp:108
bool deferFailsafes(bool enabled, int timeout_s=0)
void onProgressUpdate(const std::function< void(int)> &callback)
Definition: mission_executor.hpp:95
void setActivityInfo(const std::optional< std::string > &activity_info)
Sets a string with extra information about the current activity. This provides more specific context ...
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