54 getLogger(),
"CpTfBroadcaster: CpVehicleLocalPosition not found - no TF will be published");
59 broadcaster_ = std::make_shared<tf2_ros::TransformBroadcaster>(node);
64 geometry_msgs::msg::TransformStamped t;
65 t.header.stamp = node->now();
73 t.transform.rotation.x = q.x();
74 t.transform.rotation.y = q.y();
75 t.transform.rotation.z = q.z();
76 t.transform.rotation.w = q.w();
79 getLogger(),
"CpTfBroadcaster: static %s -> %s at FLU (%.3f, %.3f, %.3f)",
86 trailPub_ = node->create_publisher<nav_msgs::msg::Path>(
90 getLogger(),
"CpTfBroadcaster: publishing the flown trail on %s (every %.2f m, <= %.0f Hz)",
94 attitudeSub_ = node->create_subscription<px4_msgs::msg::VehicleAttitude>(
95 "/fmu/out/vehicle_attitude", rclcpp::SensorDataQoS(),
100 "CpTfBroadcaster: broadcasting %s -> %s (and %s) from /fmu/out/vehicle_attitude at <= %.0f Hz",
107 const auto now = std::chrono::steady_clock::now();
110 const double elapsed = std::chrono::duration<double>(now -
lastSent_).count();
122 const tf2::Quaternion qNedFrd(msg->q[1], msg->q[2], msg->q[3], msg->q[0]);
123 tf2::Quaternion qEnuFlu = kNedEnuQ * qNedFrd * kFrdFluQ;
126 const auto stamp = this->
getNode()->now();
128 geometry_msgs::msg::TransformStamped base;
129 base.header.stamp = stamp;
135 base.transform.rotation.x = qEnuFlu.x();
136 base.transform.rotation.y = qEnuFlu.y();
137 base.transform.rotation.z = qEnuFlu.z();
138 base.transform.rotation.w = qEnuFlu.w();
140 geometry_msgs::msg::TransformStamped follow = base;
142 follow.transform.rotation.x = 0.0;
143 follow.transform.rotation.y = 0.0;
144 follow.transform.rotation.z = 0.0;
145 follow.transform.rotation.w = 1.0;
147 broadcaster_->sendTransform(std::vector<geometry_msgs::msg::TransformStamped>{base, follow});
152 const auto & t = base.transform.translation;
153 bool append =
trail_.poses.empty();
156 const auto & l =
trail_.poses.back().pose.position;
157 const double dx = t.x - l.x, dy = t.y - l.y, dz = t.z - l.z;
162 geometry_msgs::msg::PoseStamped ps;
163 ps.header = base.header;
164 ps.pose.position.x = t.x;
165 ps.pose.position.y = t.y;
166 ps.pose.position.z = t.z;
167 ps.pose.orientation = base.transform.rotation;
168 trail_.poses.push_back(ps);
173 const double sinceTrail = std::chrono::duration<double>(now -
lastTrailSent_).count();
176 trail_.header.stamp = stamp;
186 getLogger(),
"CpTfBroadcaster: first %s -> %s sent (ENU %.2f, %.2f, %.2f)",
188 base.transform.translation.y, base.transform.translation.z);