大家好,我是吃饱了还能吃的小胖鱼。

今天下午小鱼在写ROS2教程源码的时候,发现了一个很有意思的现象。

如果在ROS2的回调函数中进行服务请求,那么整个节点都会卡死,为什么呢?

其实是因为ROS2的节点是单进程的(Python),而对回调的处理是在主进程里,当我们在回调函数里调用服务的时候 ,当前回调函数没有退出,请求服务的返回结果的回调函数一直进不来,这样就造成了死锁问题。

那在ROS1中可以进的来吗?当然可以,这是为什么呢?

小鱼第一个怀疑的就是,ROS2和ROS1线程数量是不一样的。

小鱼科普:进程是由一个到多个线程组成,线程是操作系统调度的基本单位,进程是操作系统资源分配的基本单位

线程数量测试

于是小鱼带着疑问,做了一个测试,什么测试呢?那就是打印当前进程中线程的数量。

因为小鱼使用的是Python代码,可以使用Python线程库threadingenumerate()函数获取到当前正在运行中的线程对象列表。所以这里小鱼使用了一个

len(threading.enumerate())

来获取当前进程的线程个数。

ROS结果

下面来给各位鱼粉看一下,测试结果,首先是ROS的。你猜有几个线程启动了。
答案是5个,这也是Python版本的ROS不需要调用spin()函数也可以进入回调函数的原因
花心(多线程)ROS1和钟情的ROS2(单线程)_公众号

ROS2结果

那ROS2的战果呢?
是一个,没看错就是一个。
花心(多线程)ROS1和钟情的ROS2(单线程)_其他_02

写在最后

为什么说ROS2比ROS1更强大,光这一手5个进程变一个,是不是已经惊艳到你了!

我是小鱼,一名在职机器人算法工程师,目前在做公众号,想和小鱼一起交流机器人技术吗?快点关注小鱼的公众号《鱼香ROS》加入鱼群吧~
花心(多线程)ROS1和钟情的ROS2(单线程)_ROS2_03