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>
21class AsyncFunctionCalls;
22class 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);
151 const std::string& topic_namespace_prefix,
MissionExecutor& mission_executor)
152 :
ModeBase(node, settings, topic_namespace_prefix), _mission_executor(mission_executor)
161 _mission_executor.checkArmingAndRunConditions(reporter);
163 void updateSetpoint(
float dt_s)
override { _mission_executor.updateSetpoint(); }
165 void disableWatchdogTimer()
167 ModeBase::disableWatchdogTimer();
171 MissionExecutor& _mission_executor;
177 const std::string& topic_namespace_prefix,
179 :
ModeExecutorBase(settings, owned_mode), _mission_executor(mission_executor)
186 void onActivate()
override { _mission_executor.onActivate(); }
187 void onDeactivate(DeactivateReason reason)
override { _mission_executor.onDeactivate(reason); }
190 if (on_failsafe_deferred) {
191 on_failsafe_deferred();
196 float param5,
float param6,
float param7)
override
198 if (command_handler) {
199 return command_handler(command, param1) ? Result::Success :
Result::Rejected;
205 void setRegistration(
const std::shared_ptr<Registration>& registration)
207 setSkipMessageCompatibilityCheck();
208 overrideRegistration(registration);
211 void setSkipMessageCompatibilityCheck()
213 ModeExecutorBase::setSkipMessageCompatibilityCheck();
216 std::function<bool(uint32_t,
float)> command_handler{
nullptr};
217 std::function<void()> on_failsafe_deferred{
nullptr};
220 MissionExecutor& _mission_executor;
223 virtual bool doRegisterImpl(MissionMode& mode, MissionModeExecutor& executor_base);
225 void setCommandHandler(
const std::function<
bool(uint32_t,
float)>& command_handler)
227 _mode_executor->command_handler = command_handler;
232 ModeExecutorBase& modeExecutor() {
return *_mode_executor; }
234 std::shared_ptr<LandDetected> _land_detected;
237 using ActionID = int;
238 enum class AbortReason {
245 static std::string abortReasonStr(AbortReason reason);
247 void checkArmingAndRunConditions(HealthAndArmingCheckReporter& reporter);
248 void checkReadynessAndReport();
249 void updateSetpoint();
251 void onDeactivate(ModeExecutorBase::DeactivateReason reason);
253 bool isReady()
const {
return _has_valid_mission && _actions_ready; }
255 void runMode(
ModeBase::ModeID mode_id,
const std::function<
void()>& on_completed,
256 const std::function<
void()>& on_failure =
nullptr);
265 void runModeTakeoff(
float altitude,
float heading,
const std::function<
void()>& on_completed,
266 const std::function<
void()>& on_failure =
nullptr);
267 void runAction(
const std::string& action_name,
const ActionArguments& arguments,
268 const std::function<
void()>& on_completed);
269 void runTrajectory(
const std::shared_ptr<Mission>& trajectory,
int start_index,
int end_index,
270 const std::function<
void(
int)>& on_index_reached,
bool stop_at_last_item);
272 void runNextMissionItem();
273 void runCurrentMissionItem(
bool resuming);
274 void resetMissionState();
275 std::pair<int, bool> getNextTrajectorySegment(
int start_index)
const;
276 bool currentActionSupportsResumeFromLanded()
const;
278 void setTrajectoryOptions(
const TrajectoryOptions& options);
279 void clearTrajectoryOptions();
281 void setCurrentMissionIndex(
int index);
283 void abort(AbortReason reason);
284 void invalidateActionHandler();
286 void savePersistentState();
287 void clearPersistentState()
const;
288 bool tryLoadPersistentState();
289 nlohmann::json getOnResumeStateAndClear();
290 void runOnResumeStoreState();
294 ActionArguments arguments;
296 std::unique_ptr<ActionStateKeeper> addContinousAction(
const ActionState& state);
297 void removeContinousAction(ActionID
id);
298 void runStoredActions();
299 void deactivateAllActions();
301 struct PersistentState {
302 std::optional<int> current_index;
303 std::string mission_checksum;
305 std::map<ActionID, ActionState> continuous_actions;
307 void toJson(nlohmann::json& j)
const;
308 void fromJson(
const nlohmann::json& j);
311 PersistentState _state;
312 int _next_continuous_action_id{0};
313 const std::string _persistence_filename;
315 enum class MissionItemState {
319 MissionItemState _mission_item_state{MissionItemState::Other};
321 bool _is_active{
false};
323 std::optional<rclcpp::Time> _trajectory_update_warn;
325 std::shared_ptr<TrajectoryExecutorInterface> _trajectory_executor;
326 std::map<std::string, std::shared_ptr<ActionInterface>> _actions;
327 std::shared_ptr<Mission> _mission;
328 TrajectoryOptions _trajectory_options;
329 bool _has_valid_mission{
false};
330 static const std::vector<std::string> kNoMissionErrors;
331 std::vector<std::string> _mission_errors{kNoMissionErrors};
332 bool _actions_ready{
false};
333 rclcpp::TimerBase::SharedPtr _readyness_timer;
334 int _abort_recursion_level{
338 std::unique_ptr<MissionMode> _mode;
339 std::unique_ptr<MissionModeExecutor> _mode_executor;
340 std::shared_ptr<ActionHandler> _action_handler;
342 std::unique_ptr<AsyncFunctionCalls> _reporting;
344 std::function<void()> _on_activated;
345 std::function<void()> _on_deactivated;
346 std::function<void(
int)> _on_progress_update;
347 std::function<void()> _on_completed;
348 std::function<void(
const std::optional<std::string>&)> _on_activity_info_change;
349 std::function<void(
bool ready,
const std::vector<std::string>& errors)> _on_readyness_update;
351 friend class ActionHandler;
352 friend class ActionStateKeeper;
358 : _id(
id), _mission_executor(mission_executor)
377 void runMode(
ModeBase::ModeID mode_id,
const std::function<
void()>& on_completed,
378 const std::function<
void()>& on_failure =
nullptr)
381 RCLCPP_WARN(_mission_executor._node.get_logger(),
"ActionHandler is not valid anymore");
384 _mission_executor.runMode(mode_id, on_completed, on_failure);
394 void runModeTakeoff(
float altitude,
float heading,
const std::function<
void()>& on_completed,
395 const std::function<
void()>& on_failure =
nullptr)
398 RCLCPP_WARN(_mission_executor._node.get_logger(),
"ActionHandler is not valid anymore");
401 _mission_executor.runModeTakeoff(altitude, heading, on_completed, on_failure);
403 void runAction(
const std::string& action_name,
const ActionArguments& arguments,
404 const std::function<
void()>& on_completed)
407 RCLCPP_WARN(_mission_executor._node.get_logger(),
"ActionHandler is not valid anymore");
410 _mission_executor.runAction(action_name, arguments, on_completed);
412 void runTrajectory(
const std::shared_ptr<Mission>& trajectory,
413 const std::function<
void()>& on_completed,
bool stop_at_last_item =
true);
425 RCLCPP_WARN(_mission_executor._node.get_logger(),
"ActionHandler is not valid anymore");
428 _mission_executor.clearTrajectoryOptions();
438 RCLCPP_WARN(_mission_executor._node.get_logger(),
"ActionHandler is not valid anymore");
441 _mission_executor.setTrajectoryOptions(options);
455 RCLCPP_WARN(_mission_executor._node.get_logger(),
"ActionHandler is not valid anymore");
469 RCLCPP_WARN(_mission_executor._node.get_logger(),
"ActionHandler is not valid anymore");
475 std::optional<int> getCurrentMissionIndex()
const;
487 bool currentActionSupportsResumeFromLanded()
const;
503 std::unique_ptr<ActionStateKeeper>
storeState(
const std::string& action_name,
509 return _mission_executor.addContinousAction(
510 MissionExecutor::ActionState{action_name, arguments});
513 const Mission& mission()
const {
return _mission_executor.mission(); }
525 RCLCPP_WARN(_mission_executor._node.get_logger(),
"ActionHandler is not valid anymore");
531 bool controlAutoSetHome(
bool enabled)
534 RCLCPP_WARN(_mission_executor._node.get_logger(),
"ActionHandler is not valid anymore");
537 return _mission_executor.controlAutoSetHome(enabled);
548 RCLCPP_WARN(_mission_executor._node.get_logger(),
"ActionHandler is not valid anymore");
551 _mission_executor.onFailsafeDeferred(callback);
564 void setInvalid() { _valid =
false; }
567 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:373
void setTrajectoryOptions(const TrajectoryOptions &options)
Override the trajectory config options.
Definition mission_executor.hpp:435
TrajectoryOptions getTrajectoryOptions() const
get the current trajectory config options
Definition mission_executor.hpp:418
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:452
bool isValid() const
Check if the handler is still valid.
Definition mission_executor.hpp:560
void clearActivityInfo()
Clears the activity information. This method sets the activity info of the mission executor to std::n...
Definition mission_executor.hpp:466
bool deferFailsafes(bool enabled, int timeout_s=0)
enable/disable deferral of failsafes
Definition mission_executor.hpp:522
void clearTrajectoryOptions()
Reset the current trajectory config options to the mission defaults.
Definition mission_executor.hpp:422
void onFailsafeDeferred(const std::function< void()> &callback)
register callback for failsafe notification
Definition mission_executor.hpp:545
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:394
std::unique_ptr< ActionStateKeeper > storeState(const std::string &action_name, const ActionArguments &arguments)
store the state of a continuous action
Definition mission_executor.hpp:503
void setCurrentMissionIndex(int index)
Set the current mission index.
Definition mission_executor.hpp:355
Definition health_and_arming_checks.hpp:21
Definition mission_executor.hpp:174
void onActivate() override
Definition mission_executor.hpp:186
Result sendCommandSync(uint32_t command, float param1, float param2, float param3, float param4, float param5, float param6, float param7) override
Definition mission_executor.hpp:195
void onFailsafeDeferred() override
Definition mission_executor.hpp:188
void onDeactivate(DeactivateReason reason) override
Definition mission_executor.hpp:187
Definition mission_executor.hpp:148
void checkArmingAndRunConditions(HealthAndArmingCheckReporter &reporter) override
Definition mission_executor.hpp:159
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 ...
void setSkipMessageCompatibilityCheck()
Definition mission_executor.hpp:145
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