46 using SyncActionNode::SyncActionNode;
48 static BT::PortsList providedPorts()
51 BT::InputPort<double>(INPUT_KEY_LAT,
"{lat}",
"Latitude [°] of the position to offset"),
52 BT::InputPort<double>(INPUT_KEY_LON,
"{lon}",
"Longitude [°] of the position to offset"),
53 BT::InputPort<double>(INPUT_KEY_ALT,
"{alt}",
"Altitude [m] (AMSL) of the position to offset"),
54 BT::InputPort<double>(INPUT_KEY_N, 0.0,
"Offset towards north [m]"),
55 BT::InputPort<double>(INPUT_KEY_E, 0.0,
"Offset towards east [m]"),
56 BT::InputPort<double>(INPUT_KEY_D, 0.0,
"Offset downwards [m] (negative to go up)"),
57 BT::OutputPort<double>(OUTPUT_KEY_LAT,
"{target_lat}",
"Resulting latitude [°]"),
58 BT::OutputPort<double>(OUTPUT_KEY_LON,
"{target_lon}",
"Resulting longitude [°]"),
59 BT::OutputPort<double>(OUTPUT_KEY_ALT,
"{target_alt}",
"Resulting altitude [m] (AMSL)"),
60 BT::OutputPort<Eigen::MatrixXd>(
61 OUTPUT_KEY_VEC,
"{target_vec}",
62 "Resulting global position vector (latitude [°], longitude [°], altitude AMSL [m])")};
65 BT::NodeStatus tick()
override final
67 auto get_input = [
this](
const char * key) {
68 const BT::Expected<double> expected = getInput<double>(key);
70 throw BT::RuntimeError(name() +
" (" + registrationName() +
") - " + expected.error());
72 return expected.value();
74 const Eigen::Vector3d global_position(get_input(INPUT_KEY_LAT), get_input(INPUT_KEY_LON), get_input(INPUT_KEY_ALT));
75 const Eigen::Vector3f vector_ned =
76 Eigen::Vector3d(get_input(INPUT_KEY_N), get_input(INPUT_KEY_E), get_input(INPUT_KEY_D)).cast<
float>();
78 const Eigen::Vector3d target = px4_ros2::addVectorToGlobalPosition(global_position, vector_ned);
79 Eigen::MatrixXd mat(1, 3);
80 mat << target.x(), target.y(), target.z();
81 setOutput(OUTPUT_KEY_LAT, target.x());
82 setOutput(OUTPUT_KEY_LON, target.y());
83 setOutput(OUTPUT_KEY_ALT, target.z());
84 setOutput(OUTPUT_KEY_VEC, mat);
85 return BT::NodeStatus::SUCCESS;