ros入门之用catkin和rosmake创建和编译功能包
catkin_make:编译后build和devel的区别
部分较早的发布基于ROS的SLAM系统,需要rosmake进行编译,例如lsd_slam.
1 ROS 功能包中CMakeLists.txt的写法
CMakeLists.txt示例,与不使用catkin_make编译的文件相比,主要区别在于add_message_files(),add_service_files()generate_message_files()generate_dynamic_reconfigure_options()catkin_package()
其中,catkin_package()这一语句缺失,使用catkin_make编译依然能够通过但不会将库文件生成到指定文件。从输出的信息也可以看出链接的执行文件目录不一致。
以下是ros中自己定义的包,CMakeLists.txt的正确写法。
# decalare a minimum version of cmakecmake_minimum_required(VERSION 2.8.3)# decalare a projectproject(my_first_ros_pkg)# find components package required for buildingfind_package(catkin REQUIRED COMPONENTS roscpp std_msgs)# use the same method to find other packages# find_packages(Boost REQUIRED COMPONENTS system)# add message files, FILES 将引用当前功能包目录的msg目录中的*.msg文件,自动生成一个头文件(*.h)add_message_files(FILESmessage1.msgmessage2.msg)# add service files, 同messageadd_service_files(FILESService1.srvService2.srv)# generate messages, 用于设置依赖的消息的选项generate_messages(DEPENDENCIESstd_msgs)#generate dynammic reconfigure_optionsgenerate_dynamic_reconfigure_options(cfg/DynRenconf1.cfgcfg/DynRenconf2.cfg)# catkin 构建选项 (如果不使用这语句,会按照cmake编译,生成的二进制文件会在build下)catkin_package(INCLUDE_DIRS_ includeLIBRARIES my_first_ros_pkgCATKIN_DEPENDS roscpp std_msgsDEPENDS system_lib)# 指定包含目录的选项include_directories(${catkin_INCLUDE_DIRS})# 声明构建之后需要的库add_library(my_first_ros_pkgsrc/${PROJECT_NAME}/my_first_ros_pkg.cpp)# 添加依赖库,在构建该库和可执行文件之前,如果有需要预先生成的有依赖性的消息或dynamic_reconfigureadd_dependencies(my_first_ros_pkg ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})# 添加可执行文件add_executable(my_first_ros_pkg_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})# 添加可执行文件的依赖文件add_dependcies(my_first_ros_pkg_node ${${PROJECT_NAME}_EXPORTED_TARGETS}${catkin_EXPORTED_TARGETS})# 在创建特定的可执行文件之前将库和可执行文件进行链接的选项,# 注意库与库之间要用空格分隔,否则在链接目标时会出现错误target_link_libraries(my_first_ros_pkg_node ${catkin_LIBRARIES} ${LIBS})
2 遇到的问题
2.1 rosmake
类似catkin_make找不到包的情况。
运行source PATH_TO_ROSBUILD_WS/setup.bash终端使用zsh,则修改为setup.zsh
