ros中的线程问题
问题描述:
在ros中,主函数一般是以某一个频率循环一个过程,亦或者是放一个ros::spin()在主函数中来等待信息来触发回调函数,如果此时需要另外有一个独立于主函数的固定频率的循环(例如:定时做卡尔曼滤波),所以需要在程序中另外开辟一个线程做循环。
具体代码
bool startFlag = true;
void trackThread(){
ros::Rate rate(100); // 预测频率
while (ros::ok() && startFlag)
{
track();
// std::cout << "跟踪线程" << std::endl;
rate.sleep();
}
}
int main (int argc, char** argv){
// Initialize ROS
ros::init (argc, argv, "cluster_reflect"); // "cluster"--节点名
ros::NodeHandle nh;
std::thread trackthread(&trackThread);
ros::spin();
trackthread.join();
startFlag = false;
}
这样看代码很简洁,但是需要注意问题。
踩坑的地方
- 需要注意的是rate.sleep()这个函数不同于boost::thread里面的sleep函数(boost::thread是是不依赖ros的),rate.sleep()这个睡眠的时间是取决于ros的时间的。所以如果你的这个节点用的是仿真时间(数据集时间):
<param name="use_sim_time" value="true" />
那么你播放数据集的时候一定是:
rosbag play *.bag --clock
需要将数据集的clock播放出来,否则rate.sleep()就会一直卡死,因为没有ros时间了。如果不用仿真时间,那么就不需要加后缀“–clock”。
总结
主要是当时用了仿真时间,又忘了加后缀,导致踩坑,以此记录。