当将依赖项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。