2021SC@SDUSC
1. 本周工作目标
上周没能阅读完节点“接受topic message”部分的代码,本周继续阅读。于是,本周的工作目标如下:
-
根据talker and listener样例,调试阅读ros core topic的message接收部分的代码。
2. ros里topic message的接收
我们先看ros_catkin_ws/install_isolated/share/rospy_tutorials/001_talker_listener/listener.py
文件的内容:
由于“接收topic message”不是一个主动调用的过程,所以本次阅读的思路放在“回调函数”上,在回调函数上打个断点,然后查看调用堆栈,看rospy是怎么接收消息,然后调用我们制定的回调函数的。
启动起ros core和talker程序,然后再启动起rospy listener,程序命中断点:
可以看到并不是主线程的执行流命中这个断点,而是一个名为"/chatter"的线程。也就是说,话题订阅节点构建了一个线程用于接受message、调用回调函数。
从调用栈最底端开始阅读,即robust_connect_subscriber
函数:
发现他会重复尝试建立连接,直至成功或者节点关闭。建立连接后,就进入接收消息的无限循环:
这里需要注意的是,上方的reveice_once()
函数,一次不止接收一个msg,而是接受socket里缓存的所有msg,如下:
那么,最开始是在哪里创立了这个线程?寻找栈底函数的符号,可以看见在同一个文件(install_isolated/lib/python3/dist-packages/rospy/impl/tcpros_pubsub.py
)的257行,在这里创建了订阅线程:
于是,消息订阅部分的源码就大致阅读完毕了。
3. 总结
本周进行了ros topic接收的代码的阅读。多线程的代码理解起来会相对复杂一些,需要多打断点进行变量和调用栈的查看。