本文对ros message_filters 滤波器进行了基本介绍,包括message_filters包的功能,通用使用方法,以及Subscriber 滤波的使用方法。
1.Ros message_filters 总览:
message filters 即包含一系列滤波器,这些滤波器只有在输入数据满足一定条件才进行输出。如:当从不同传感器获取数据时,使用时间同步滤波器,可以获得不同传感器数据在同一时间戳下的数据。
2.Filter Pattern(滤波方法)
在message filters 中所有的滤波算法都采用同样的方式对输入、输出进行连接。滤波器输入可以通过滤波器构造函数或者通过构造函数connectInput() 方法,输出通过注册回调函数registerCallback()方法。
因为每个滤波器的输入,输出数据类型都是固定,所以在滤波器互相连接时要注意输入输出数据类型,是否可以直接连接。如给定两个滤波器FooFilter、BarFilter。FooFilter 的输出类型与BarFilter 输入类型相同,因此使用时可以对他们进行连接。
滤波器连接方式示例代码
示例1:
FooFilter foo;
BarFilter bar(foo);
示例2:
FooFilter foo;
BarFilter bar;
bar.connectInput(foo);
2.1 registerCallback()(注册回调函数)
使用registerCallback()方法我们可以注册多个回调函数,并且以注册时的顺序被调用。registerCallback() 返回message_filters::Connection 对象,可以调用该对象的disconnect() 方法断开连接。
3. Subscriber
订阅者滤波器提供其他滤波器的输入源,内部实现只是对ros 订阅者的一个封装,且subscriber 滤波器不能连接其他滤波器的输出。订阅者滤波器采用订阅主题的方式获取输入。
3.1 subscriber 连接方式
subscriber 没有输入连接,输出采用回调函数方式。
C++: void callback(const boost::shared_ptr<M const>&) Python: callback(msg)
示例代码如下:
示例1:
message_filters::Subscriber<std_msgs::UInt32> sub(nh, "my_topic", 1);//获取输入
sub.registerCallback(myCallback);//设置输出
示例2:
ros::Subscriber sub = nh.subscribe("my_topic", 1, myCallback);//同时设置输入输出
4.总结
message_filters 包中有丰富的滤波器,本文只列举了Subscriber的使用作为示例,其他的使用方法及功能可以参考ros wiki。后续如果有时间,本文也会继续完善文档。