ROS官方教程Creating custom msg and srv file讲述如何创建自定义message和service接口。在第7.1节Testing Num.msg with pub/sub中,它会要求你使用之前做过的一个项目Writing a simple publisher and subscriber(C++)进行验证。需要修改Publisher, Subscriber和CMakeList文件,CMakeList文件需要修改的地方如下:
#...
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(tutorial_interfaces REQUIRED) # CHANGE
add_executable(talker src/publisher_member_function.cpp)
ament_target_dependencies(talker rclcpp tutorial_interfaces) # CHANGE
add_executable(listener src/subscriber_member_function.cpp)
ament_target_dependencies(listener rclcpp tutorial_interfaces) # CHANGE
install(TARGETS
talker
listener
DESTINATION lib/${PROJECT_NAME})
ament_package()
如果你完全按照文章中的教程操作,那么一定会卡在colcon build --packages-select cpp_pubsub指令上,也就是编译错误。错误代码如下:
CMake Error at CMakeLists.txt:17 (add_executable):
Cannot find source file:
src/publisher_member_function.cpp
Tried extensions .c .C .c++ .cc .cpp .cxx .cu .mpp .m .M .mm .ixx .cppm
.ccm .cxxm .c++m .h .hh .h++ .hm .hpp .hxx .in .txx .f .F .for .f77 .f90
.f95 .f03 .hip .ispc
CMake Error at CMakeLists.txt:20 (add_executable):
Cannot find source file:
src/subscriber_member_function.cpp
也就是找不到src/publisher_member_function.cpp和src/subscriber_member_function.cpp文件。但是我们在之前的练习中没有报错,怎么到了这里就报错了呢。那是因为我们在cpp_pubsup/src中的文件名是publisher_lambda_function.cpp和subscriber_lambda_function.cpp。与教程中默认的文件名publisher_member_function.cpp和subscriber_member_function.cpp不一样。你需要将CMakeList改成如下才能正常运行:
#...
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(tutorial_interfaces REQUIRED) # CHANGE
add_executable(talker src/publisher_lambda_function.cpp) # CHANGE
ament_target_dependencies(talker rclcpp tutorial_interfaces) # CHANGE
add_executable(listener src/subscriber_lambda_function.cpp) # CHANGE
ament_target_dependencies(listener rclcpp tutorial_interfaces) # CHANGE
install(TARGETS
talker
listener
DESTINATION lib/${PROJECT_NAME})
ament_package()
这应该是官方教程中的一个Bug吧。