最近有一个需求是cpp中快速构建ros的工作空间的目录,使用绝对路径肯定是可取的.发现有一个ros:📦:getPath可以使用.
了解到他是roscpp的一个函数,所以是打算直接添加头文件:
#include <ros/package.h>
然后就直接去使用:
// 获取 lio_sam 功能包的路径并构建 map 文件夹路径
string packagePath = ros::package::getPath("lio_sam");
if (packagePath.empty()) {
cout << "Error: Could not find package 'lio_sam'" << endl;
res.success = false;
return false;
}
saveMapDirectory = packagePath + "/map";
但是在编译时始终出现问题:
编译出错:
/usr/bin/ld: CMakeFiles/lio_sam_mapOptmization.dir/src/mapOptmization.cpp.o: in function `mapOptimization::saveMapService(lio_sam::save_mapRequest_<std::allocator<void> >&, lio_sam::save_mapResponse_<std::allocator<void> >&)':
/home/cyun/Documents/formular_ws/src/Chapter_4/slam/lio_sam/src/mapOptmization.cpp:353: undefined reference to `ros::package::getPath(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
collect2: error: ld returned 1 exit status
make[2]: *** [Chapter_4/slam/lio_sam/CMakeFiles/lio_sam_mapOptmization.dir/build.make:436:/home/cyun/Documents/formular_ws/devel/lib/lio_sam/lio_sam_mapOptmization] 错误 1
make[1]: *** [CMakeFiles/Makefile2:5800:Chapter_4/slam/lio_sam/CMakeFiles/lio_sam_mapOptmization.dir/all] 错误 2
make: *** [Makefile:146:all] 错误 2
Invoking "make -j32 -l32" failed
这里我以为是roscpp
没有链接到,但是查询资料发现,roscpp应该是在
${catkin_LIBRARIES}中的,而我的cmakelists.txt也是包含这一项的.
add_executable(${PROJECT_NAME}_mapOptmization src/mapOptmization.cpp)
add_dependencies(${PROJECT_NAME}_mapOptmization ${catkin_EXPORTED_TARGETS} ${PROJECT_NAME}_generate_messages_cpp)
target_compile_options(${PROJECT_NAME}_mapOptmization PRIVATE ${OpenMP_CXX_FLAGS})
target_link_libraries(${PROJECT_NAME}_mapOptmization Boost::timer ${catkin_LIBRARIES} ${PCL_LIBRARIES} ${OpenCV_LIBRARIES} ${OpenMP_CXX_FLAGS} gtsam)
后面查了getPath函数的用法后发现,不仅在roscpp中有,还需要一个roslib:
find_package(catkin REQUIRED COMPONENTS
tf
roscpp
rospy
roslib # 添加一下
cv_bridge
# pcl library
pcl_conversions
# msgs
std_msgs
sensor_msgs
geometry_msgs
nav_msgs
message_generation
visualization_msgs
)
然后对应的package.xml添加即可:
<build_depend>roscpp</build_depend>
<build_depend>roslib</build_depend>
<run_depend>roscpp</run_depend>
<run_depend>roslib</run_depend>
正常编译: