15#include "auto_apms_px4_interfaces/action/set_actuators.hpp"
17#include "auto_apms_behavior_tree_core/node.hpp"
19#define INPUT_KEY_MOTOR_COMMANDS "motor_commands"
20#define INPUT_KEY_SERVO_COMMANDS "servo_commands"
21#define INPUT_KEY_HOLD_PERIOD_MS "hold_period_ms"
26class SetActuatorsAction
27:
public auto_apms_behavior_tree::core::RosActionNode<auto_apms_px4_interfaces::action::SetActuators>
30 using RosActionNode::RosActionNode;
32 static BT::PortsList providedPorts()
35 BT::InputPort<std::vector<float>>(
36 INPUT_KEY_MOTOR_COMMANDS,
37 "Motor commands as a semicolon-separated list. Range: [-1, 1], 'nan'|'NaN'|'NAN' = disarmed"),
38 BT::InputPort<std::vector<float>>(
39 INPUT_KEY_SERVO_COMMANDS,
40 "Servo commands as a semicolon-separated list. Range: [-1, 1], 'nan'|'NaN'|'NAN' = disarmed"),
41 BT::InputPort<uint32_t>(
42 INPUT_KEY_HOLD_PERIOD_MS,
static_cast<uint32_t
>(0),
43 "Hold the commands for this duration [ms] before stopping. 0 = send once then stop immediately")};
46 bool setGoal(Goal & goal)
48 auto read_vector = [
this](
const char * key, std::vector<float> & out) ->
bool {
49 BT::PortsRemapping::iterator it = config().input_ports.find(key);
50 if (it == config().input_ports.end() || it->second.empty()) {
53 if (
const BT::Expected<std::vector<float>> expected = getInput<std::vector<float>>(key)) {
54 out = expected.value();
57 logger_,
"%s - %s", context_.getFullyQualifiedTreeNodeName(
this).c_str(), expected.error().c_str());
63 if (!read_vector(INPUT_KEY_MOTOR_COMMANDS, goal.motor_commands))
return false;
64 if (!read_vector(INPUT_KEY_SERVO_COMMANDS, goal.servo_commands))
return false;
66 if (
const BT::Expected<uint32_t> expected = getInput<uint32_t>(INPUT_KEY_HOLD_PERIOD_MS)) {
67 goal.hold_period_ms = expected.value();
69 RCLCPP_ERROR(logger_,
"%s - %s", context_.getFullyQualifiedTreeNodeName(
this).c_str(), expected.error().c_str());
#define AUTO_APMS_BEHAVIOR_TREE_REGISTER_NODE(type)
Macro for registering a behavior tree node plugin.
Implementation of PX4 mode peers offered by px4_ros2_cpp enabling integration with AutoAPMS.