ROS源码分析-week7

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接收的代码的阅读。多线程的代码理解起来会相对复杂一些,需要多打断点进行变量和调用栈的查看。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值