在Raspberry PI 3上使用ROS包cv_bridge和image_transport时/usr/lib/arm-linux-gnueabihf/libQtGui.so.4中的分段错误

时间:2017-06-27 14:58:34

标签: c++ raspberry-pi raspbian ros

将依赖项cv_bridge和image_transport 添加到我自己的程序包时,我在Raspberry PI 3上运行示例ROS代码时遇到问题。我从示例发布者和订阅者教程中获取了代码,该代码可以在Writing a Simple Publisher and Subscriber (C++)

中找到

由于我想抓取图像并将它们发送到另一个节点,我使用cv_bridge和image_transport。我只修改了package.xml和CMakeLists.txt。 C ++代码保持不变

在Raspberry PI 3上启动image_talker时,程序会因分段错误而停止。 当我在台式电脑上运行相同的代码时,它可以完美运行。台式机运行Ubuntu 16 LTS,并在官方ROS存储库中安装ROS Kinetic。

gdb的回溯如下所示。

(gdb) r Starting program: /home/pi/my_workspace
/devel/lib/image_beginner_tutorials/image_talker
[Thread debugging using libthread_db enabled] 
Using host libthread_db library "/lib/arm-linux-
gnueabihf/libthread_db.so.1". 
Cannot access memory at address 0x0
Program received signal SIGILL, Illegal instruction. 
0x6b57ede8 in ?? () from /usr/lib/arm-linux-
gnueabihf/libcrypto.so.1.0.0 
(gdb) c Continuing. 
Cannot access memory at address 0x0
Program received signal SIGSEGV, Segmentation fault.
0x6c966678 in ?? () from /usr/lib/arm-linux-
gnueabihf/libQtGui.so.4 
(gdb) bt
#0 0x6c966678 in ?? () from /usr/lib/arm-linux-
gnueabihf/libQtGui.so.4
#1 0x76fdeffc in call_init (l=<optimized out="">, 
argc=1, argv=0x7efff044, env=0x7efff04c) at dl-init.c:78
#2 0x0000021c in ?? () Backtrace stopped: previous 
frame identical to this frame (corrupt stack?)

根据一些谷歌搜索,似乎libopenssl故意触发SIGILL。继续执行程序后,它会因分段错误而停止。

我使用的系统是Raspbian Jessi,带有定制的ROS Kinetic。根据{{​​3}}建立ROS。

更新

在深入研究问题之后,似乎可执行文件因某种原因与两个不同版本的Qt链接。根据{{​​3}},似乎ROS Kinetic使用了Qt5和Qt4库的混合物。这会导致像Raspberry PI 3和Rasbpian Jessi这样的某些系统出现问题。

ldd输出如下所示。

ldd image_talker  | grep Qt
    libQt5Widgets.so.5 => /usr/lib/arm-linux-gnueabihf/libQt5Widgets.so.5 (0x7402f000)
    libQt5Test.so.5 => /usr/lib/arm-linux-gnueabihf/libQt5Test.so.5 (0x73ff9000)
    libQt5Concurrent.so.5 => /usr/lib/arm-linux-gnueabihf/libQt5Concurrent.so.5 (0x73fe4000)
    libQt5Gui.so.5 => /usr/lib/arm-linux-gnueabihf/libQt5Gui.so.5 (0x73c14000)
    libQt5Core.so.5 => /usr/lib/arm-linux-gnueabihf/libQt5Core.so.5 (0x7378f000)
    libQtGui.so.4 => /usr/lib/arm-linux-gnueabihf/libQtGui.so.4 (0x6c533000)
    libQtCore.so.4 => /usr/lib/arm-linux-gnueabihf/libQtCore.so.4 (0x6c292000)

我尝试了Installing ROS Kinetic on the Raspberry Pi中提供的一些提示,但他们没有解决问题。我试图在core中仅使用部分OpenCV,即CMakeLists.txt。设置一个没有GUI依赖关系的ROS Kinetic变种也是不可能的,因为当时没有发送cv_bridge和image_transport。

0 个答案:

没有答案