ros::init(argc, argv, "listener");
我认为init的作用时给你的节点起一个名字,仅仅是去一个名字,剩下的什么功能也没有,相当于一个空壳。
ros::NodeHandle n;
只有说了这句,n成为了一个nodehandle型的对象,在上面说的壳中,创造出了一个有节点功能的东西(节点句柄),但是这个节点句柄到目前为止还没有发布消息的能力
nodehandle 类下面有很多成员函数,这些成员函数使得n能实现很多功能
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
等号后面可以看出,nodehandle包含两个很重要的函数advertise和subscribe
两个函数的共同目的是,通知master我想在话题chatter上发布或订阅消息
master是一个主管谁在发布,谁在订阅的记录。通知master之后,master会给你相应,相当于告诉你你可以在这个话题上发布消息或者从这个话题上订阅消息了
这就是advertise和subscribe的返回值,分别返回一个publisher和subscriber类型的对象,到此为止这个节点才真正有了发布者或订阅者的功能。功能的实现依赖于publisher和subscriber类中包含的成员函数
ros::Publisher 对象有一个 publish() 成员函数可以让你在topic上发布消息
subscriber采用一种类似于中断的模式,初始化完成之后先是ros::spin() 进入自循环,等待消息的到来。到来后就去执行相应的操作,一般是写在另一个子程序之中。例如上面的chattercallback就是一个“中断”子程序。
有关于ros::spin(),参见https://www.cnblogs.com/liu-fa/p/5925381.html