ros::spin()的理解
在程序到達ros::spin()之前按照一系列規則,設定一系列話題訂閱者。
這些訂閱者就開始嗷嗷待哺,等待話題進來,但這時候訂閱者的嘴還沒有打開。
然後就到ros::spin(),這可以理解爲一個動作,打開訂閱者的嘴。這樣訂閱者們可以開始接受話題,最重要的是進入回調函數!
當然,最開始的時候,沒有話題進來,spin()是堵塞在這裏的。
一旦有話題進來,
一系列訂閱、回調、發佈等等動作在spin()這裏不斷在進行,只要有合適的話題,相應的訂閱者就訂閱,然後直接進行回調。
int main(int argc,char** argv)
{
ros::init(argc, argv, "message_filter_node"); // 相當於給一個命名空間
ros::Time::init();
ros::NodeHandle n;
Scan2 scan; // 默認構造
Odom_calib.Set_data_len(12000);
Odom_calib.set_data_zero();
ros::spin(); // 主程序到這裏往下不再進行,等待話題進來回調就行
return 0;
}
Scan2 scan; 這一句默認構造構造出一系列的話題訂閱和發佈的規則,一系列訂閱者。但是嘴還沒張開。
程序會接着往下走,一直到:
ros::spin();的時候, 把訂閱者的嘴們張開,開始訂閱話題併產生回調。