这个就是最常用的advertise函数的最后一个参数,原型: advertise (const std::string &topic, uint32_t queue_size, bool latch=false)
是否锁存。某些话题并不是会以某个频率发布,比如/map
这个topic,只有在初次订阅或者地图更新这两种情况下,才会向/map
发布消息,这里就用到了锁存。
锁存的作用就是,将发布者最后一次发布的消息保存下来,然后把它自动发送给后来的订阅者。这种方式非常适合变动较慢、相对固定的数据(例如地图),然后只发布一次,相比于同样的消息不定的发布,锁存的方式既可以减少通信中对带宽的占用,也可以减少消息资源维护的开销。
查看gmapping中的函数SlamGMapping::startLiveSlam()
,发现三个话题都是 latched:1
2
3entropy_publisher_ = private_nh_.advertise<std_msgs::Float64>("entropy", 1, true);
sst_ = node_.advertise<nav_msgs::OccupancyGrid>("map", 1, true);
sstm_ = node_.advertise<nav_msgs::MapMetaData>("map_metadata", 1, true);
latch=true
,发布消息一次或几次,然后设法阻塞程序(常常用spin(),这里只是阻塞,跟订阅无关),订阅者仍然能收到阻塞之前发布的消息。
1 | ros::init(argc,argv, "Pub"); |
运行程序后等一会,运行rostopic echo topic_latch_false
,什么也没有。运行rostopic echo topic_latch_true
,会收到data=2
的消息。 即使先运行两个echo,再运行发布者,结果也是如此
bool Publisher::isLatched () const
用于判断是否latch