Problem:
两个节点通信的过程中,出现如下这个错误:
terminate called after throwing an instance of 'std::out_of_range'
what(): vector::_M_range_check: __n (which is 0) >= this->size() (which is 0)
Aborted (core dumped)
应该是内存读取溢出了,两个节点,一个是python一个是C++,python的发布topic,C++的节点负责接收,然后接收的过程中就会报错,很奇怪,一开始还以为是两种语言写的ROS 节点有问题,导致通信过程中断开,但是后来请教了其他人,发现不少人的项目也是同时存在python和C++的节点,他们通信就没有问题,继续探究发现,其实是python 节点会发送一些空的数据给C++的节点,这就导致这个节点直接core dumped掉。
Solution:
解决办法也很简单
注意两点:
- 让python的节点不要发布空的topic信息,如下就是空的消息
will@will-OptiPlex-9010:~$ rostopic echo /yd_s
layout:
dim: []
data_offset: 0
data: []
---
layout:
dim: []
data_offset: 0
data: []
---
layout:
dim: []
data_offset: 0
data: []
---
正常应该持续发布这样的:
---
layout:
dim: []
data_offset: 0
data: [-0.519131960177, 2.91509369261, 1.22955885924, 0.164872010129, 0.113212113622, -0.000487447682121, 0.9614643809042873]
---
layout:
dim: []
data_offset: 0
data: [-0.519131960177, 2.91509369261, 1.22955885924, 0.164872010129, 0.113212113622, -0.000487447682121, 0.9614643809042873]
---
layout:
dim: []
data_offset: 0
data: [-0.519131960177, 2.91509369261, 1.22955885924, 0.164872010129, 0.113212113622, -0.000487447682121, 0.9614643809042873]
---
- 在publish信息,并且等待callback数据的时候,不要发布超过python里面的取值范围
比如,python里面存在10-20这10个数,c++节点发布一个1对应callback回来一个python里面10,发10得到一个回传的20,这时就不要发布11或2999这些超过它范围的值,会让python返回一个空的topic信息,这也会导致core dumped
一开始search这个问题的时候,也没有找到很对应的,毕竟造成这种报错的原因千奇百怪,只能自己慢慢分析,缩小问题的范围,才能找到解决办法。
加油!!!