ROS (Robot Operating System) 採用發布/訂閱模式實現節點間通信。本文以經典的 beginner_tutorials 功能包為例,詳細講解如何使用 C++ 編寫發布者與訂閱者節點,並通過編譯運行驗證通信流程。
beginner_tutorials 功能包的 src 目錄下創建 talker.cpp。listener.cpp。ros::spin() 循環。# 添加 talker 可執行文件
add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
add_dependencies(talker beginner_tutorials_generate_messages_cpp)
# 添加 listener 可執行文件
add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
add_dependencies(listener beginner_tutorials_generate_messages_cpp)
關鍵點:add_dependencies 確保消息頭文件在編譯前已生成,避免找不到自定義消息類型的編譯錯誤。
cd ~/catkin_ws catkin_make
編譯成功後,可執行文件默認生成在 ~/catkin_ws/devel/lib/beginner_tutorials/ 目錄下。
打開三個終端,分別執行以下命令(確保已 source devel/setup.bash):
roscore
rosrun beginner_tutorials talker
rosrun beginner_tutorials listener
talker 終端循環打印發布的消息內容(如 hello world [計數])。listener 終端同步打印接收到的消息,證明發布/訂閱通信鏈路暢通。| 現象 | 可能原因 | 解決方案 |
|---|---|---|
| 編譯報錯找不到消息頭文件 | 缺少 add_dependencies 或未運行 catkin_make 生成消息 | 補全依賴並重新編譯 |
| 運行時提示 "Unable to register with master node" | roscore 未啟動或網絡配置問題 | 先啟動 roscore,檢查 ROS_MASTER_URI 和 ROS_IP |
| 訂閱者無輸出 | 話題名稱不一致或隊列大小設置過小 | 核對話題名,增大隊列 |
rostopic list、rostopic echo /chatter 查看話題與消息內容。rqt_graph 可視化節點拓撲關係。catkin_tools 替代 catkin_make 實現隔離構建。掌握發布/訂閱模式是 ROS 開發的基石,後續可進一步學習服務通信、動作庫、節點佈管理等進階主題。