3131#include < Eigen/Eigen> // NOLINT
3232
3333#include " mavconn/interface.hpp"
34+ #include " mavconn/io_context_runner.hpp"
3435#include " mavconn/mavlink_dialect.hpp"
3536#include " mavros/utils.hpp"
3637#include " rclcpp/macros.hpp"
@@ -145,6 +146,7 @@ class Router : public rclcpp::Node
145146 const std::string & node_name = " mavros_router" )
146147 : rclcpp::Node(node_name,
147148 options /* rclcpp::NodeOptions(options).use_intra_process_comms(true) */ ),
149+ router_io_runner(),
148150 endpoints{}, stat_msg_routed(0 ), stat_msg_sent(0 ), stat_msg_dropped(0 ),
149151 diagnostic_updater (this , 1.0 )
150152 {
@@ -192,6 +194,8 @@ class Router : public rclcpp::Node
192194 RCLCPP_INFO (get_logger (), " Known MAVLink dialects:%s" , ss.str ().c_str ());
193195 RCLCPP_INFO (get_logger (), " MAVROS Router started" );
194196
197+ router_io_runner.start ([this ]() {this ->router_io_runner .io ().run ();});
198+
195199 // Delay parameter callback initialization because
196200 // add/del endpoints calls have to use shared_from_this(),
197201 // which cannot be used before we leave the constructor.
@@ -202,13 +206,24 @@ class Router : public rclcpp::Node
202206 });
203207 }
204208
209+ ~Router () override
210+ {
211+ router_io_runner.shutdown_owned ();
212+ }
213+
205214 void route_message (Endpoint::SharedPtr src, const mavlink_message_t * msg, const Framing framing);
206215
216+ [[nodiscard]] asio::io_service * get_shared_io ()
217+ {
218+ return &router_io_runner.io ();
219+ }
220+
207221private:
208222 friend class Endpoint ;
209223 friend class TestRouter ;
210224
211225 static std::atomic<id_t > id_counter;
226+ mavconn::IoContextRunner router_io_runner;
212227
213228 std::shared_mutex mu;
214229
0 commit comments