8 #include <px4_ros2/components/mode.hpp>
9 #include <px4_ros2/components/mode_executor.hpp>
10 #include <px4_ros2/mission/actions/action.hpp>
11 #include <px4_ros2/mission/mission.hpp>
12 #include <px4_ros2/mission/trajectory/trajectory_executor.hpp>
13 #include <px4_ros2/vehicle_state/land_detected.hpp>
21 class AsyncFunctionCalls;
22 class ActionStateKeeper;
31 std::vector<std::function<std::shared_ptr<ActionInterface>(
ModeBase& mode)>>
32 custom_actions_factory;
33 std::set<std::string> default_actions{
34 "changeSettings",
"onResume",
"onFailure",
"takeoff",
"rtl",
"land",
"hold"};
35 std::function<std::shared_ptr<TrajectoryExecutorInterface>(
ModeBase& mode)>
36 trajectory_executor_factory;
37 std::string persistence_filename;
39 template <
class ActionType,
typename... Args>
42 custom_actions_factory.push_back(
43 [args = std::tie(std::forward<Args>(args)...)](
ModeBase& mode)
mutable {
45 [&mode](
auto&&... args) {
46 return std::make_shared<ActionType>(mode, std::forward<Args>(args)...);
52 template <
typename TrajectoryExecutorType,
typename... Args>
55 trajectory_executor_factory = [args = std::tie(std::forward<Args>(args)...)](
58 [&mode](
auto&&... args) {
59 return std::make_shared<TrajectoryExecutorType>(mode, std::forward<Args>(args)...);
65 Configuration& withPersistenceFile(
const std::string& filename)
67 persistence_filename = filename;
73 rclcpp::Node& node,
const std::string& topic_namespace_prefix =
"");
79 void setMission(
const Mission& mission);
82 const Mission& mission()
const {
return *_mission; }
84 void onActivated(
const std::function<
void()>& callback) { _on_activated = callback; }
85 void onDeactivated(
const std::function<
void()>& callback) { _on_deactivated = callback; }
92 _on_progress_update = callback;
94 void onCompleted(
const std::function<
void()>& callback) { _on_completed = callback; }
95 void onFailsafeDeferred(
const std::function<
void()>& callback);
96 void onReadynessUpdate(
97 const std::function<
void(
bool ready,
const std::vector<std::string>& errors)>& callback);
107 _on_activity_info_change = callback;
133 bool controlAutoSetHome(
bool enabled);
145 const std::string& topic_namespace_prefix,
MissionExecutor& mission_executor)
146 :
ModeBase(node, settings, topic_namespace_prefix), _mission_executor(mission_executor)
155 _mission_executor.checkArmingAndRunConditions(reporter);
157 void updateSetpoint(
float dt_s)
override { _mission_executor.updateSetpoint(); }
159 void disableWatchdogTimer()
161 ModeBase::disableWatchdogTimer();
165 MissionExecutor& _mission_executor;
171 const std::string& topic_namespace_prefix,
173 :
ModeExecutorBase(settings, owned_mode), _mission_executor(mission_executor)
180 void onActivate()
override { _mission_executor.onActivate(); }
181 void onDeactivate(DeactivateReason reason)
override { _mission_executor.onDeactivate(reason); }
184 if (on_failsafe_deferred) {
185 on_failsafe_deferred();
190 float param5,
float param6,
float param7)
override
192 if (command_handler) {
193 return command_handler(command, param1) ? Result::Success :
Result::Rejected;
199 void setRegistration(
const std::shared_ptr<Registration>& registration)
201 setSkipMessageCompatibilityCheck();
202 overrideRegistration(registration);
204 std::function<bool(uint32_t,
float)> command_handler{
nullptr};
205 std::function<void()> on_failsafe_deferred{
nullptr};
208 MissionExecutor& _mission_executor;
211 virtual bool doRegisterImpl(MissionMode& mode, MissionModeExecutor& executor_base);
213 void setCommandHandler(
const std::function<
bool(uint32_t,
float)>& command_handler)
215 _mode_executor->command_handler = command_handler;
220 ModeExecutorBase& modeExecutor() {
return *_mode_executor; }
222 std::shared_ptr<LandDetected> _land_detected;
225 using ActionID = int;
226 enum class AbortReason {
233 static std::string abortReasonStr(AbortReason reason);
235 void checkArmingAndRunConditions(HealthAndArmingCheckReporter& reporter);
236 void checkReadynessAndReport();
237 void updateSetpoint();
239 void onDeactivate(ModeExecutorBase::DeactivateReason reason);
241 bool isReady()
const {
return _has_valid_mission && _actions_ready; }
243 void runMode(
ModeBase::ModeID mode_id,
const std::function<
void()>& on_completed,
244 const std::function<
void()>& on_failure =
nullptr);
253 void runModeTakeoff(
float altitude,
float heading,
const std::function<
void()>& on_completed,
254 const std::function<
void()>& on_failure =
nullptr);
255 void runAction(
const std::string& action_name,
const ActionArguments& arguments,
256 const std::function<
void()>& on_completed);
257 void runTrajectory(
const std::shared_ptr<Mission>& trajectory,
int start_index,
int end_index,
258 const std::function<
void(
int)>& on_index_reached,
bool stop_at_last_item);
260 void runNextMissionItem();
261 void runCurrentMissionItem(
bool resuming);
262 void resetMissionState();
263 std::pair<int, bool> getNextTrajectorySegment(
int start_index)
const;
264 bool currentActionSupportsResumeFromLanded()
const;
266 void setTrajectoryOptions(
const TrajectoryOptions& options);
267 void clearTrajectoryOptions();
269 void setCurrentMissionIndex(
int index);
271 void abort(AbortReason reason);
272 void invalidateActionHandler();
274 void savePersistentState();
275 void clearPersistentState()
const;
276 bool tryLoadPersistentState();
277 nlohmann::json getOnResumeStateAndClear();
278 void runOnResumeStoreState();
282 ActionArguments arguments;
284 std::unique_ptr<ActionStateKeeper> addContinousAction(
const ActionState& state);
285 void removeContinousAction(ActionID
id);
286 void runStoredActions();
287 void deactivateAllActions();
289 struct PersistentState {
290 std::optional<int> current_index;
291 std::string mission_checksum;
293 std::map<ActionID, ActionState> continuous_actions;
295 void toJson(nlohmann::json& j)
const;
296 void fromJson(
const nlohmann::json& j);
299 PersistentState _state;
300 int _next_continuous_action_id{0};
301 const std::string _persistence_filename;
303 enum class MissionItemState {
307 MissionItemState _mission_item_state{MissionItemState::Other};
309 bool _is_active{
false};
311 std::optional<rclcpp::Time> _trajectory_update_warn;
313 std::shared_ptr<TrajectoryExecutorInterface> _trajectory_executor;
314 std::map<std::string, std::shared_ptr<ActionInterface>> _actions;
315 std::shared_ptr<Mission> _mission;
316 TrajectoryOptions _trajectory_options;
317 bool _has_valid_mission{
false};
318 static const std::vector<std::string> kNoMissionErrors;
319 std::vector<std::string> _mission_errors{kNoMissionErrors};
320 bool _actions_ready{
false};
321 rclcpp::TimerBase::SharedPtr _readyness_timer;
322 int _abort_recursion_level{
326 std::unique_ptr<MissionMode> _mode;
327 std::unique_ptr<MissionModeExecutor> _mode_executor;
328 std::shared_ptr<ActionHandler> _action_handler;
330 std::unique_ptr<AsyncFunctionCalls> _reporting;
332 std::function<void()> _on_activated;
333 std::function<void()> _on_deactivated;
334 std::function<void(
int)> _on_progress_update;
335 std::function<void()> _on_completed;
336 std::function<void(
const std::optional<std::string>&)> _on_activity_info_change;
337 std::function<void(
bool ready,
const std::vector<std::string>& errors)> _on_readyness_update;
339 friend class ActionHandler;
340 friend class ActionStateKeeper;
346 : _id(
id), _mission_executor(mission_executor)
365 void runMode(
ModeBase::ModeID mode_id,
const std::function<
void()>& on_completed,
366 const std::function<
void()>& on_failure =
nullptr)
369 RCLCPP_WARN(_mission_executor._node.get_logger(),
"ActionHandler is not valid anymore");
372 _mission_executor.runMode(mode_id, on_completed, on_failure);
382 void runModeTakeoff(
float altitude,
float heading,
const std::function<
void()>& on_completed,
383 const std::function<
void()>& on_failure =
nullptr)
386 RCLCPP_WARN(_mission_executor._node.get_logger(),
"ActionHandler is not valid anymore");
389 _mission_executor.runModeTakeoff(altitude, heading, on_completed, on_failure);
391 void runAction(
const std::string& action_name,
const ActionArguments& arguments,
392 const std::function<
void()>& on_completed)
395 RCLCPP_WARN(_mission_executor._node.get_logger(),
"ActionHandler is not valid anymore");
398 _mission_executor.runAction(action_name, arguments, on_completed);
400 void runTrajectory(
const std::shared_ptr<Mission>& trajectory,
401 const std::function<
void()>& on_completed,
bool stop_at_last_item =
true);
413 RCLCPP_WARN(_mission_executor._node.get_logger(),
"ActionHandler is not valid anymore");
416 _mission_executor.clearTrajectoryOptions();
426 RCLCPP_WARN(_mission_executor._node.get_logger(),
"ActionHandler is not valid anymore");
429 _mission_executor.setTrajectoryOptions(options);
443 RCLCPP_WARN(_mission_executor._node.get_logger(),
"ActionHandler is not valid anymore");
457 RCLCPP_WARN(_mission_executor._node.get_logger(),
"ActionHandler is not valid anymore");
463 std::optional<int> getCurrentMissionIndex()
const;
475 bool currentActionSupportsResumeFromLanded()
const;
491 std::unique_ptr<ActionStateKeeper>
storeState(
const std::string& action_name,
497 return _mission_executor.addContinousAction(
498 MissionExecutor::ActionState{action_name, arguments});
501 const Mission& mission()
const {
return _mission_executor.mission(); }
513 RCLCPP_WARN(_mission_executor._node.get_logger(),
"ActionHandler is not valid anymore");
519 bool controlAutoSetHome(
bool enabled)
522 RCLCPP_WARN(_mission_executor._node.get_logger(),
"ActionHandler is not valid anymore");
525 return _mission_executor.controlAutoSetHome(enabled);
536 RCLCPP_WARN(_mission_executor._node.get_logger(),
"ActionHandler is not valid anymore");
539 _mission_executor.onFailsafeDeferred(callback);
552 void setInvalid() { _valid =
false; }
555 MissionExecutor& _mission_executor;
Arguments passed to an action from the mission JSON definition.
Definition: mission.hpp:25
Handler passed to custom actions to run modes, actions and trajectories.
Definition: mission_executor.hpp:361
void setTrajectoryOptions(const TrajectoryOptions &options)
Override the trajectory config options.
Definition: mission_executor.hpp:423
TrajectoryOptions getTrajectoryOptions() const
get the current trajectory config options
Definition: mission_executor.hpp:406
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:440
bool isValid() const
Check if the handler is still valid.
Definition: mission_executor.hpp:548
void clearActivityInfo()
Clears the activity information. This method sets the activity info of the mission executor to std::n...
Definition: mission_executor.hpp:454
bool deferFailsafes(bool enabled, int timeout_s=0)
enable/disable deferral of failsafes
Definition: mission_executor.hpp:510
void clearTrajectoryOptions()
Reset the current trajectory config options to the mission defaults.
Definition: mission_executor.hpp:410
void onFailsafeDeferred(const std::function< void()> &callback)
register callback for failsafe notification
Definition: mission_executor.hpp:533
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:382
std::unique_ptr< ActionStateKeeper > storeState(const std::string &action_name, const ActionArguments &arguments)
store the state of a continuous action
Definition: mission_executor.hpp:491
void setCurrentMissionIndex(int index)
Set the current mission index.
Definition: mission_executor.hpp:343
Definition: health_and_arming_checks.hpp:21
Definition: mission_executor.hpp:168
void onActivate() override
Definition: mission_executor.hpp:180
Result sendCommandSync(uint32_t command, float param1, float param2, float param3, float param4, float param5, float param6, float param7) override
Definition: mission_executor.hpp:189
void onFailsafeDeferred() override
Definition: mission_executor.hpp:182
void onDeactivate(DeactivateReason reason) override
Definition: mission_executor.hpp:181
Definition: mission_executor.hpp:142
void checkArmingAndRunConditions(HealthAndArmingCheckReporter &reporter) override
Definition: mission_executor.hpp:153
Mission execution state machine.
Definition: mission_executor.hpp:28
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:105
bool deferFailsafes(bool enabled, int timeout_s=0)
void onProgressUpdate(const std::function< void(int)> &callback)
Definition: mission_executor.hpp:90
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:149
Base class for a mode.
Definition: mode.hpp:73
uint8_t ModeID
Mode ID, corresponds to nav_state.
Definition: mode.hpp:75
Base class for a mode executor.
Definition: mode_executor.hpp:29
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:29
@ Rejected
The request was rejected.
Definition: mission_executor.hpp:30
Definition: mode_executor.hpp:33
Definition: mission.hpp:114