ROS2中如何同时运行Timer回调函数和订阅消息的回调函数
-
想要实现一个节点功能:既有timer这样的例行任务,也有回调函数来订阅数据。
于是我写了:类的构造函数中:
subComm_ = this->create_subscription<std_msgs::msg::UInt8MultiArray>("comm_serial_in", 1, std::bind(&FmtComm::Callback, this, 1));
timer = this->create_wall_timer(30ms, std::bind(&FmtComm::TimerCallbackLoop, this));主函数:
int main(int argc, char * argv[])
{
rclcpp::init(argc, argv);
rclcpp::spin(std::make_shared<FmtComm>());
rclcpp::shutdown();
return 0;
}但是测试发现Timer回调函数正常运行,订阅消息的回调函数没有触发。当注释掉创建Timer后,订阅消息的回调函数正常触发。
我想请教,如何实现我开头说的,在ROS2中既执行例行任务,又可以订阅消息,通过类来实现。感谢。
-
@凌云 ROS2默认是单线程的,依次调用回调函数,所以在回调函数中不要堵塞,否则另外的就执行不下去了,你的timer周期也很短.
解决方案可以使用回调组,或者自己单独开线程. -
@小鱼 这点感觉不如ROS1的spinOnce好用,一般处理数据都是需要订阅数据的同时,定时对数据进行处理和结果发布的。
那你说的回调组是看官方教程的Demos这一章中Setting up efficient intra-process commnunication这一节吗?
还是Intermediate一章中的Composing multiple nodes in a single process这一小节?