大家好,我是吃饱了还能吃的小胖鱼。
今天下午小鱼在写ROS2教程源码的时候,发现了一个很有意思的现象。
如果在ROS2的回调函数中进行服务请求,那么整个节点都会卡死,为什么呢?
其实是因为ROS2的节点是单进程的(Python),而对回调的处理是在主进程里,当我们在回调函数里调用服务的时候 ,当前回调函数没有退出,请求服务的返回结果的回调函数一直进不来,这样就造成了死锁问题。
那在ROS1中可以进的来吗?当然可以,这是为什么呢?
小鱼第一个怀疑的就是,ROS2和ROS1线程数量是不一样的。
小鱼科普:进程是由一个到多个线程组成,线程是操作系统调度的基本单位,进程是操作系统资源分配的基本单位
线程数量测试
于是小鱼带着疑问,做了一个测试,什么测试呢?那就是打印当前进程中线程的数量。
因为小鱼使用的是Python代码,可以使用Python线程库threading
的enumerate()
函数获取到当前正在运行中的线程对象列表。所以这里小鱼使用了一个
len(threading.enumerate())
来获取当前进程的线程个数。
ROS结果
下面来给各位鱼粉看一下,测试结果,首先是ROS的。你猜有几个线程启动了。
答案是5个,这也是Python版本的ROS不需要调用spin()函数也可以进入回调函数的原因。
ROS2结果
那ROS2的战果呢?
是一个,没看错就是一个。
为什么说ROS2比ROS1更强大,光这一手5个进程变一个,是不是已经惊艳到你了!
我是小鱼,一名在职机器人算法工程师,目前在做公众号,想和小鱼一起交流机器人技术吗?快点关注小鱼的公众号《鱼香ROS》加入鱼群
吧~