小鱼 ROS 2 新书上线!点击链接查看, 新书配套视频点击链接查看。
提问前必看的发帖注意事项—— 提问前必看!不符合要求的问题拒绝回答!!
社区使用指南—如何添加标签修改密码
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这一小节?