15#include "auto_apms_interfaces/action/arm_disarm.hpp"
16#include "auto_apms_interfaces/action/land.hpp"
17#include "auto_apms_interfaces/action/takeoff.hpp"
18#include "auto_apms_util/action_client_wrapper.hpp"
20using namespace std::chrono_literals;
21using ArmDisarmAction = auto_apms_interfaces::action::ArmDisarm;
22using TakeoffAction = auto_apms_interfaces::action::Takeoff;
23using LandAction = auto_apms_interfaces::action::Land;
25int main(
int argc,
char * argv[])
27 rclcpp::init(argc, argv);
30 auto node_ptr = std::make_shared<rclcpp::Node>(std::string(EXAMPLE_NAME) +
"_node");
32 RCLCPP_INFO(node_ptr->get_logger(),
"Running example '%s' ...", EXAMPLE_NAME);
38 RCLCPP_INFO(node_ptr->get_logger(),
"Arming ...");
40 ArmDisarmAction::Goal arm_goal;
41 arm_goal.arming_state = arm_goal.ARMING_STATE_ARM;
42 auto arm_future = arm_disarm_client.syncSendGoal(arm_goal);
44 if (arm_future.wait_for(0s) == std::future_status::ready && !arm_future.get()) {
45 std::cerr <<
"Arming goal was rejected\n";
50 while (rclcpp::spin_until_future_complete(node_ptr, arm_future, 1s) != rclcpp::FutureReturnCode::SUCCESS) {
51 RCLCPP_INFO(node_ptr->get_logger(),
"Waiting for the vehicle to be armed");
58 auto arm_result = arm_future.get();
61 std::cerr <<
"Arm result is nullptr\n";
66 if ((*arm_result).code == rclcpp_action::ResultCode::SUCCEEDED) {
67 RCLCPP_INFO(node_ptr->get_logger(),
"Arming succeeded");
69 std::cerr <<
"Arming did not succeed\n";
74 RCLCPP_INFO(node_ptr->get_logger(),
"Taking off ...");
76 TakeoffAction::Goal takeoff_goal;
77 takeoff_goal.altitude_amsl_m = 1e9;
78 auto takeoff_future = takeoff_client.syncSendGoal(takeoff_goal);
80 if (takeoff_future.wait_for(0s) == std::future_status::ready && !takeoff_future.get()) {
81 std::cerr <<
"Takeoff goal was rejected\n";
87 rclcpp::sleep_for(5s);
89 RCLCPP_INFO(node_ptr->get_logger(),
"Canceling takeoff ...");
91 if (!takeoff_client.syncCancelLastGoal()) {
92 std::cerr <<
"Cancellation of takeoff was rejected\n";
97 RCLCPP_INFO(node_ptr->get_logger(),
"Landing ...");
99 auto land_future = land_client.syncSendGoal();
101 if (land_future.wait_for(0s) == std::future_status::ready && !land_future.get()) {
102 std::cerr <<
"Landing goal was rejected\n";
107 while (rclcpp::spin_until_future_complete(node_ptr, land_future, 1s) != rclcpp::FutureReturnCode::SUCCESS) {
108 RCLCPP_INFO(node_ptr->get_logger(),
"Waiting for landing");
115 auto land_result = land_future.get();
118 std::cerr <<
"Land result is nullptr\n";
123 if ((*land_result).code == rclcpp_action::ResultCode::SUCCEEDED) {
124 RCLCPP_INFO(node_ptr->get_logger(),
"Landing succeeded");
126 std::cerr <<
"Landing did not succeed\n";
Convenience wrapper for a rclcpp_action::Client that introduces synchronous goal handling functions.