多传感器数据融合的时候,由于各个传感器采集数据的频率的不同,例如odom 50Hz、Imu 100Hz、camera 25Hz,需要将传感器数据进行时间同步后才能进行融合。
分别订阅不同的需要融合的传感器的主题,通过TimeSynchronizer
统一接收多个主题,只有在所有的topic都有相同的时间戳时,才会产生一个同步结果的回调函数,在回调函数里处理同步时间后的数据。
注意: 只有多个主题都有数据的时候才可以触发回调函数。如果其中一个主题的发布节点崩溃了,则整个回调函数永远无法触发回调。 频率一般趋于和最低的频率一样。 当多个主题频率一致的时候,回调函数的频率(融合后的频率)可能会小于订阅主题的频率。
message_filters::Synchronizer
省去了不同线程(回调函数)之间的同步问题,两线程的数据直接放到一个回调里处理。 但是它对传感器数据进行时间同步后,回调函数里的两个话题的时间戳会完全一样,纳秒级的相同。这是经过了ROS的调整,但有时候可能不是我们想要的。
对齐传感信息时间戳有两种方式, 一种是时间戳完全对齐 ExactTime Policy, 另一种是时间戳相近 ApproximateTime Policy, 前者更为严格, 但有时会没有结果而无法进行回调函数。所以一般还是用后者
message_filters
message_filters::Synchronizer的使用
传感器数据之间的时间同步问题