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编译依然能够通过但不会将库文件生成到指定文件。从输出的信息也可以看出链接的执行文件目录不一致。
2021-05-10 17-40-19 的屏幕截图.png以下是ros中自己定义的包,CMakeLists.txt的正确写法。

  1. # decalare a minimum version of cmake
  2. cmake_minimum_required(VERSION 2.8.3)
  3. # decalare a project
  4. project(my_first_ros_pkg)
  5. # find components package required for building
  6. find_package(catkin REQUIRED COMPONENTS roscpp std_msgs)
  7. # use the same method to find other packages
  8. # find_packages(Boost REQUIRED COMPONENTS system)
  9. # add message files, FILES 将引用当前功能包目录的msg目录中的*.msg文件,自动生成一个头文件(*.h)
  10. add_message_files(
  11. FILES
  12. message1.msg
  13. message2.msg
  14. )
  15. # add service files, 同message
  16. add_service_files(
  17. FILES
  18. Service1.srv
  19. Service2.srv
  20. )
  21. # generate messages, 用于设置依赖的消息的选项
  22. generate_messages(
  23. DEPENDENCIES
  24. std_msgs
  25. )
  26. #generate dynammic reconfigure_options
  27. generate_dynamic_reconfigure_options(
  28. cfg/DynRenconf1.cfg
  29. cfg/DynRenconf2.cfg
  30. )
  31. # catkin 构建选项 (如果不使用这语句,会按照cmake编译,生成的二进制文件会在build下)
  32. catkin_package(
  33. INCLUDE_DIRS_ include
  34. LIBRARIES my_first_ros_pkg
  35. CATKIN_DEPENDS roscpp std_msgs
  36. DEPENDS system_lib
  37. )
  38. # 指定包含目录的选项
  39. include_directories(${catkin_INCLUDE_DIRS})
  40. # 声明构建之后需要的库
  41. add_library(my_first_ros_pkg
  42. src/${PROJECT_NAME}/my_first_ros_pkg.cpp)
  43. # 添加依赖库,在构建该库和可执行文件之前,如果有需要预先生成的有依赖性的消息或dynamic_reconfigure
  44. add_dependencies(my_first_ros_pkg ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
  45. # 添加可执行文件
  46. add_executable(my_first_ros_pkg_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
  47. # 添加可执行文件的依赖文件
  48. add_dependcies(my_first_ros_pkg_node ${${PROJECT_NAME}_EXPORTED_TARGETS}
  49. ${catkin_EXPORTED_TARGETS})
  50. # 在创建特定的可执行文件之前将库和可执行文件进行链接的选项,
  51. # 注意库与库之间要用空格分隔,否则在链接目标时会出现错误
  52. target_link_libraries(my_first_ros_pkg_node ${catkin_LIBRARIES} ${LIBS})

2 遇到的问题

2.1 rosmake2021-05-07 09-59-27 的屏幕截图.png类似catkin_make找不到包的情况。

运行source PATH_TO_ROSBUILD_WS/setup.bash终端使用zsh,则修改为setup.zsh