参考地址:http://wiki.ros.org/message_filters
1.概述
message_filter是roscpp和rospy的一个应用库,他集中了一些滤波算法中常用的一些消息。当一个消息到来,在之后的一个时间点,该消息可能被返回或者不返回,将这样的一个过程或者容器理解为消息滤波器。
一个典型的例子就是时间同步器,他从多个数据源采集不同类型的数据,只有每个消息源的消息具体有相同的时间戳时候,他才将信息发布出去。
时间同步装置的一个例子:输入不同类型(type)的多个数据(source),但是仅当接收到的每个数据(source)有相同的时间戳(timestamp),才会有输出(output)。
2. 滤波模式
所有的消息滤波器服从相同的模式,用于连接输入和输出。输入通过滤波器的构造器或者connectInput()的方法连接。输出通过registerCallback()方法连接。
需要注意的是,每个滤波器各自定义输入输出的类型,所以并不是所有的滤波器可以直接互联。
例如:给了两个filters FooFilter 和 BarFilter,其中FooFilter的output和BarFilter的输入数据一致。连接foo和bar的C++例子如下
FooFilter foo;
BarFilter bar(foo);
或者:
FooFilter foo;
BarFilter bar;
bar.connectInput(foo);
2.1 registerCallback()
你可以采用registerCallback()方法,注册多个回调函数。他们将按照注册顺序进行函数的回调。
3 订阅器Subscriber
The Subscriber filter is simply a wrapper around a ROS subscription that provides a source for other filters. The Subscriber filter cannot connect to another filter's output, instead it uses a ROS topic as its input.
3.1 连接
输入:没有输入连接
输出:void callback(const boost::shared_ptr<M const>&)
例子:
message_filters::Subscriber<std_msgs::UInt32> sub(nh, "my_topic", 1);
sub.registerCallback(myCallback);
is the equivalent of:
ros::Subscriber sub = nh.subscribe("my_topic", 1, myCallback);
4. 时间一致器
The TimeSynchronizer filter synchronizes incoming channels by the timestamps contained in their headers, and outputs them in the form of a single callback that takes the same number of channels. The C++ implementation can synchronize up to 9 channels.
Connections
Input
-
C++: Up to 9 separate filters, each of which is of the form void callback(const boost::shared_ptr<M const>&). The number of filters supported is determined by the number of template arguments the class was created with.
Python: N separate filters, each of which has signature callback(msg).
Output
-
C++: For message types M0..M8,void callback(const boost::shared_ptr<M0 const>&, ..., const boost::shared_ptr<M8 const>&). The number of parameters is determined by the number of template arguments the class was created with.
Python: callback(msg0.. msgN). The number of parameters is determined by the number of template arguments the class was created with.
Example (C++)
Suppose you are writing a ROS node that needs to process data from two time synchronized topics. Your program will probably look something like this:
#include <message_filters/subscriber.h>
#include <message_filters/time_synchronizer.h>
#include <sensor_msgs/Image.h>
#include <sensor_msgs/CameraInfo.h>
using namespace sensor_msgs;
using namespace message_filters;
void callback(const ImageConstPtr& image, const CameraInfoConstPtr& cam_info)
{
// Solve all of perception here...
}
int main(int argc, char** argv)
{
ros::init(argc, argv, "vision_node");
ros::NodeHandle nh;
message_filters::Subscriber<Image> image_sub(nh, "image", 1);
message_filters::Subscriber<CameraInfo> info_sub(nh, "camera_info", 1);
TimeSynchronizer<Image, CameraInfo> sync(image_sub, info_sub, 10);
sync.registerCallback(boost::bind(&callback, _1, _2));
ros::spin();
return 0;
}
(Note: In this particular case you could use the CameraSubscriber class from image_transport, which essentially wraps the filtering code above.)
参考:http://blog.csdn.net/fana8010/article/details/23880067. 十分感谢