· roscpp/Overview/Publishersand Subscribers
切换行号显示
1ros::Publisherpub = nh.advertise<std_msgs::String>("topic_name", 5);
2std_msgs::Stringstr;
3str.data = "helloworld";
4pub.publish(str);
切换行号显示
1if (!pub)
2{
3...
4}
1ros::Publisherpub = nh.advertise<std_msgs::String>("topic_name", 5);
2std_msgs::StringPtrstr(newstd_msgs::String);
3str->data = "helloworld";
4pub.publish(str);
advertise()的简单版本的签名是:
切换行号显示
1template<classM>
2ros::Publisheradvertise(conststd::string& topic, uint32_tqueue_size, boollatch = false);
topic [必填]
queue_size [必需]
latch [可选]
ros :: Publisher实现==,!=和<运算符,并且可以在std :: map,std :: set等中使用它们
切换行号显示
1voidcallback(conststd_msgs::StringConstPtr& str)
2{
3...
4}
5
6...
7ros::Subscribersub = nh.subscribe("my_topic", 1, callback);
切换行号显示
1template<classM>
2ros::Subscribersubscribe(conststd::string& topic, uint32_tqueue_size, <callback, whichmayinvolvemultiplearguments>, constros::TransportHints& transport_hints = ros::TransportHints());
M[通常不需要]----这是一个模板参数,指定要在主题上发布的消息类型。对于这个subscribe()的大多数版本,你不需要明确地定义它,因为编译器可以从你指定的回调中推断出它。
Topic---要订阅的主题
queue_size----这是roscpp将用于您的回调的传入消息队列大小。如果邮件到达太快而你无法跟上,roscpp将开始丢弃邮件。这里的值0意味着无限的队列,这可能是危险的。
transport_hints----传输提示允许您为roscpp的传输层指定提示。这使您可以指定喜欢使用UDP传输,使用tcp nodelay等方式,这在后面会有更详细的介绍。
切换行号显示
1void callback(const boost :: shared_ptr < Message const >&);
切换行号显示
1void callback(const std_msgs :: StringConstPtr&);
切换行号显示
1void callback(const std_msgs :: String :: ConstPtr&);
其他有效签名[ROS 1.1+]
从ROS 1.1开始,我们也支持上述回调的变体:
切换行号显示
1void callback(boost :: shared_ptr < std_msgs :: String const >);
2void callback(std_msgs :: StringConstPtr);
3void callback(std_msgs :: String :: ConstPtr);
4void callback(const std_msgs :: String&);
五void callback(std_msgs :: String);
6void callback(const ros :: MessageEvent < std_msgs :: String const >&);
切换行号显示
1void callback(const boost :: shared_ptr < std_msgs :: String >&);
2void callback(boost :: shared_ptr < std_msgs :: String >);
3void callback(const std_msgs :: StringPtr&);
4void callback(const std_msgs :: String :: Ptr&);
五void callback(std_msgs :: StringPtr);
6void callback(std_msgs :: String :: Ptr);
7void callback(const ros :: MessageEvent < std_msgs :: String >&);
函数是最容易使用的:
切换行号显示
1voidcallback(conststd_msgs::StringConstPtr& str)
2{
3...
4}
5
6...
7ros::Subscribersub = nh.subscribe("my_topic", 1, callback);
类方法也很容易,但它们需要额外的参数:
切换行号显示
1void Foo :: callback(const std_msgs :: StringConstPtr&message)
2{
3}
4
5...
6Foo foo_object ;
7ros :: Subscriber sub = nh。subscribe(“ my_topic ”,1,&Foo :: callback,&foo_object);
函子对象是声明operator()的类,例如:
切换行号显示
1classFoo
2{
3public:
4 voidoperator()(conststd_msgs::StringConstPtr& message)
5 {
6 }
7};
切换行号显示
1ros::Subscribersub = nh.subscribe<std_msgs::String>("my_topic", 1, Foo());
切换行号显示
1void callback(const ros :: MessageEvent < std_msgs :: String const >&event)
2{
3 const std :: string&publisher_name = event。getPublisherName();
4 const ros :: M_string&header = event。getConnectionHeader();
五 ros :: Time receipt_time = event。getReceiptTime();
6
7 const std_msgs :: StringConstPtr&msg = event。getMessage();
8}
当消息首次到达某个主题时,它将被放入一个队列,其大小由subscribe()中的queue_size参数指定。如果队列已满并且有新消息到达,则最旧的消息将被丢弃。此外,消息实际上并未反序列化,直到需要它的第一个回调即将被调用。
另请参阅:ros :: TransportHints API文档
切换行号显示
1ros :: Subscriber sub = nh.subscribe(“ my_topic ”,1,callback,ros :: TransportHints().unreliable());
请注意,ros ::TransportHints使用命名参数成语,这是一种方法链接形式。这意味着您可以执行以下操作:
切换行号显示
1ros::TransportHints()
2 .unreliable()
3 .reliable()
4 .maxDatagramSize(1000)
5 .tcpNoDelay();