ros中的线程问题

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;
}

这样看代码很简洁,但是需要注意问题。

踩坑的地方

  1. 需要注意的是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”。

总结

主要是当时用了仿真时间,又忘了加后缀,导致踩坑,以此记录。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值