ROS/catkin 已编译的 C++ 文件找不到图像源

ROS/catkin compiled C++ file won't find image sources

我创建了一个 C++ 游戏,它使用同一父目录中的文件夹中的图像。

/game_folder
----/Images
--------icon1.png
--------icon2.png
----game.cpp

程序使用 Allegro 5 库来包含图像:

ALLEGRO_BITMAP* icon1 = al_load_bitmap("Images/icon1.png");
ALLEGRO_BITMAP* icon2 = al_load_bitmap("Images/icon2.png");

这很好用。

但是现在我需要将这个程序放入 ROS/catkin 包 'beginner_tutorials' 中。如果我将 Images 文件夹和 game.cpp 都放在 ../catkin_ws/src/beginner_tutorials 中,它可以使用 catkin make 编译得很好,但我在运行时得到 Segmentation Fault

/catkin_ws/src/beginner_tutorials
----/Images
--------icon1.png
--------icon2.png
----game.cpp

我用的是gdb,估计是程序没有找到Images文件夹导致的。

我还尝试将 Images 文件夹放置到 ../catkin_ws/devel/include/beginner_tutorials(包含头文件的同一位置)

/catkin_ws
----/devel/include/beginner_tutorials
--------/Images
------------icon1.png
------------icon2.png
----/src/beginner_tutorials
--------game.cpp

并相应地更改了代码:

ALLEGRO_BITMAP* icon1 = al_load_bitmap("beginner_tutorials/Images/icon1.png");
ALLEGRO_BITMAP* icon2 = al_load_bitmap("beginner_tutorials/Images/icon2.png");

但这没有用。 我应该将 Image 文件夹放在哪里才能成功包含在代码中?我是否还需要在 CMakeLists.txt 中进行调整?

-编辑
用 CMakeLists.txt 尝试了一些但没有成功:

set(game_SOURCES
  src/game.cpp
  src/Images/
)

add_executable(game ${game_SOURCES})
target_link_libraries(game ${allegro_LIBS})

这不起作用的原因是您的代码得到 编译 然后放置在 catkin_ws/devel/lib/<package_name> 文件夹中 lib 而不是 include!)。然后,当您启动代码时,它只会在相对于可执行文件的路径中查找。这意味着您实际上必须将它放在 catkin_ws/devel/lib/<package_name> 文件夹中。这样做的问题是,一旦您清理工作区,所有这些目录都将被删除,并且您必须在每个 catkin clean.

之后将所有文件重新复制到其中

为此,ROS C++ API 具有允许您浏览 catkin_ws/src 文件夹内给定包的文件夹或显示的功能including the header file ros/package.h:

时的所有可用包
#include <ros/package.h>

// ...

std::string const package_path = ros::package::getPath("beginner_tutorials");
ALLEGRO_BITMAP* icon1 = al_load_bitmap(package_path + "/Images/icon1.png");
ALLEGRO_BITMAP* icon2 = al_load_bitmap(package_path + "/Images/icon2.png");

应该可以解决问题。这将使代码在 catkin_ws/src/beginner_tutorials 路径中查找。

Python 类似,语法为:

import os
import rospkg

# ...

rospack = rospkg.RosPack()
package_path = rospack.get_path('beginner_tutorials')
icon1_path = os.path.join(package_path, "Images", "icon1.png")
icon2_path = os.path.join(package_path, "Images", "icon2.png")