ros::NodeHandle

ros::NodeHandle Class Reference
roscpp’s interface for creating subscribers, publishers,


ros::Subscriber Class Reference
Manages an subscription callback on a specific topic.


ROS是一种通信机制的框架,围绕着三种通信机制有很多其他的功能,核心还是三种通信机制

publishers/subscribers
services/clients
action-servers/action-clients

为了确保这种通信机制能够顺利运行,引入了nodes、topic和messages等等的概念,使得这种通信机制更具逻辑性以及便于理解。

在ROS框架下,可以把一个大项目分成若干个小部分,让不同的人去完成,最后通过ROS这个框架,将每个人负责完成的那部分作为一个node,通过在topic上发布和订阅messages,这就实现了各个nodes之间的通信,将各个node连接起来,组合完成这个项目。

publishers/subscribers
一个node既可以是publishers也可以是subscribers,可以同时发布topic的信息,也可以订阅topic上的信息,这里面有一个很重要的特性,一个subscriber只需要知道它要订阅的那个topic的名称,并不需要准确知道是哪一个publisher发布的这个topic,同样的,一个publisher也只管发布topic的消息就行了,不用管谁会来订阅这个topic上的信息,一个subscriber可以订阅很多个topic上的信息。


指针参数传递本质上是值传递,它所传递的是一个地址值。值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,会在栈中开辟内存空间以存放由主调函数传递进来的实参值,从而形成了实参的一个副本(替身)。值传递的特点是,被调函数对形式参数的任何操作都是作为局部变量进行的,不会影响主调函数的实参变量的值(形参指针变了,实参指针不会变)。

引用参数传递过程中,被调函数的形式参数也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参(本体)的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量(根据别名找到主调函数中的本体)。因此,被调函数对形参的任何操作都会影响主调函数中的实参变量。


Subscribe的第四个参数用法
https://www.bbsmax.com/A/gGdX7KrQ54/


ros::spin() 和 ros::spinOnce() 区别及详解
叫ROS消息回调处理函数。通常会出现在ROS的主循环中,程序需要不断调用ros::spin() 或 ros::spinOnce(),两者区别在于前者调用后不会再返回,也就是你的主程序到这儿就不往下执行了,而后者在调用后还可以继续执行之后的程序。

ROS存在消息发布订阅机制,如果你的程序写了相关的消息订阅函数,那么程序在执行过程中,除了主程序以外,ROS还会自动在后台按照你规定的格式,接受订阅的消息,但是所接到的消息并不是立刻就被处理,而是必须要等到ros::spin()或ros::spinOnce()执行的时候才被调用,这就是消息回到函数的原理。

就像上面说的,ros::spin() 在调用后不会再返回,也就是你的主程序到这儿就不往下执行了,而 ros::spinOnce() 后者在调用后还可以继续执行之后的程序。

其实看函数名也能理解个差不多,一个是一直调用;另一个是只调用一次,如果还想再调用,就需要加上循环了。

ros::spin()函数一般不会出现在循环中,因为程序执行到spin()后就不调用其他语句了,也就是说该循环没有任何意义,还有就是spin()函数后面一定不能有其他语句(return 0 除外),有也是白搭,不会执行的。ros::spinOnce()的用法相对来说很灵活,但往往需要考虑调用消息的时机,调用频率,以及消息池的大小,这些都要根据现实情况协调好,不然会造成数据丢包或者延迟的错误。


你可能感兴趣的:(ROS)