ROS Node/Topic/Message/Service的一些问题
1.Node
http://blog.exbot.net/archives/1412 (摘自老王说ros)
node干的什么活?callback queue里的活。这个callback queue里的callback是哪里来的呢?常见的是subscriber的callback,当然还有其他的,包括publisher的,service的。那这些callback是什么时候被调用的呢。那就是spin()或者spinonce()。spin调用在queue 里所有的availiable的callback,如果没有availible的,它就阻塞。spinonce,显然只调用一次,看看有没有准备好的callback,有就调用,没有就返回。那什么是availible的、准备好的呢?对于subscribe,准备好的就是那些有新消息的subscriber的callback。现在如果你明白了上述node的运行机理。你在感到舒服之余,请准备接收心烦的问题。
1)第一个问题就是,如果subscriber没有收到新消息,那么它的callback就不会被执行。如果你想每次都运行callback呢?对不起,没办法,不是virgin我不娶。
2)第二个问题,callback执行有个timeout值,如果设置不合理,要么费时,要么callback被中止。被中止呀,兄弟们,多可怕,万一是一个重要逻辑的一环呢?今天就聊到这里,最后送点福利,如果你想实现事件触发的node就用spin;如果你要固定周期的node,那就用spinonce+sleep,但一定要牢记,在每个周期里不是所有callback被执行.
2. Topic 与 Service
http://blog.exbot.net/archives/1605 (摘自西工大一小学生 ROS 通讯层模型)
Topic:ros中广为使用的是异步的 publish-subscribe 通讯模式。这种方式将信息的产生和使用双方解耦。一般来说,节点没有通讯对方那边的信息。Node从需要的topic那取得消息,topic 可以有多个 subscriber 与publisher。Topic 一般用于单向,消息流通讯。Node 需要同步通讯交换信息时一般使用service。Topic 一般拥有很强的类型定义:一种类型的topic只能接受/发送特定数据类型(message type)的message。Publisher 没有被要求类型一致性,但是接受时subscriber会检查类型的md5,进而报错。
Service: service 用于处理ros通讯中的同步通讯,采用server/client 语义。每个service type拥有 request 与 response两部分,对于service中的 server,ros不会检查重名(name conflict),只有最后注册的server会生效,与client建立连接。
3.Nodelet
This package provides both the nodelet base class needed for implementing a nodelet, as well as the NodeletLoader class used for instantiating nodelets
提供了turtlebot的一个控制led灯的例子
以及简单的教程