国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

ros::spin() 和 ros::spinOnce()函數的區別及詳解

2024-05-06 15:09:02
字體:
來源:轉載
供稿:網友

1 函數意義

首先要知道,這倆兄弟學名叫ROS消息回調處理函數。它倆通常會出現在ROS的主循環中,程序需要不斷調用ros::spin() 或 ros::spinOnce(),兩者區別在于前者調用后不會再返回,也就是你的主程序到這兒就不往下執行了,而后者在調用后還可以繼續執行之后的程序。

其實消息回調處理函數的原理非常簡單。我們都知道,ROS存在消息發布訂閱機制,什么?不知道?不知道還不快去:http://wiki.ros.org/ROS/Tutorials (ROS官方基礎教程) 瞅瞅。

好,我們繼續,如果你的程序寫了相關的消息訂閱函數,那么程序在執行過程中,除了主程序以外,ROS還會自動在后臺按照你規定的格式,接受訂閱的消息,但是所接到的消息并不是立刻就被處理,而是必須要等到ros::spin()或ros::spinOnce()執行的時候才被調用,這就是消息回到函數的原理,怎么樣,簡單吧,至于為什么這么設計?咳咳,嗯,肯定有他的道理。。。

2 區別

就像上面說的,ros::spin() 在調用后不會再返回,也就是你的主程序到這兒就不往下執行了,而 ros::spinOnce() 后者在調用后還可以繼續執行之后的程序。

其實看函數名也能理解個差不多,一個是一直調用;另一個是只調用一次,如果還想再調用,就需要加上循環了。

這里一定要記住,ros::spin()函數一般不會出現在循環中,因為程序執行到spin()后就不調用其他語句了,也就是說該循環沒有任何意義,還有就是spin()函數后面一定不能有其他語句(return 0 除外),有也是白搭,不會執行的。ros::spinOnce()的用法相對來說很靈活,但往往需要考慮調用消息的時機,調用頻率,以及消息池的大小,這些都要根據現實情況協調好,不然會造成數據丟包或者延遲的錯誤。

3 常見使用方法

這里需要特別強調一下,如果大兄弟你的程序寫了相關的消息訂閱函數,那千萬千萬千萬不要忘了在相應位置加上ros::spin()或者ros::spinOnce()函數,不然你是永遠都得不到另一邊發出的數據或消息的,博主血的教訓,萬望緊記。。。

3.1 ros::spin()

ros::spin()函數用起來比較簡單,一般都在主程序的最后,加入該語句就可。例子如下:

發送端:

#include "ros/ros.h"#include "std_msgs/String.h"#include <sstream>int main(int argc, char **argv){  ros::init(argc, argv, "talker");  ros::NodeHandle n;  ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);  ros::Rate loop_rate(10);  int count = 0;  while (ros::ok())  {    std_msgs::String msg;    std::stringstream ss;    ss << "hello world " << count;    msg.data = ss.str();    ROS_INFO("%s", msg.data.c_str());    /**     * 向 Topic: chatter 發送消息, 發送頻率為10Hz(1秒發10次);消息池最大容量1000。     */    chatter_pub.publish(msg);    loop_rate.sleep();    ++count;  }  return 0;}            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 浮山县| 远安县| 双峰县| 邵东县| 繁昌县| 翁牛特旗| 平湖市| 凤山市| 静安区| 乐业县| 沙田区| 桓仁| 南阳市| 马山县| 克什克腾旗| 海晏县| 青神县| 信宜市| 平顶山市| 普格县| 封开县| 清原| 涟水县| 南木林县| 太仓市| 湄潭县| 昂仁县| 海林市| 莆田市| 阳谷县| 蒲江县| 文山县| 丰原市| 图片| 通化市| 介休市| 淮南市| 郁南县| 昌平区| 南汇区| 辉县市|