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")
我创建了一个 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")