在 ROS(Robot Operating System)中,使用功能包(package)來組織 C++ 節點是一種常見且有效的方式,它能讓代碼結構更清晰、便于管理和復用。
1. 環境準備
確保已經安裝了 ROS,這里以 ROS 2 Humble 為例,并且已經正確配置好了開發環境。
2. 創建工作空間
工作空間是 ROS 項目的根目錄,用于存放多個功能包。首先創建一個工作空間目錄,并在其中創建?src
?子目錄用于存放功能包。
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src
3. 創建功能包
使用?ros2 pkg create
?命令創建一個新的功能包。假設功能包名為?demo_cpp_pkg
,依賴項為?rclcpp
(ROS 2 C++ 客戶端庫)。
ros2 pkg create --build-type ament_cmake demo_cpp_pkg --dependencies rclcpp
該命令會在?src
?目錄下創建一個名為?demo_cpp_pkg
?的功能包,包含基本的目錄結構和配置文件。
4. 功能包目錄結構
創建完成后,demo_cpp_pkg
?功能包的基本目錄結構如下:
demo_cpp_pkg/
├── CMakeLists.txt
├── include/
│ └── demo_cpp_pkg/
├── package.xml
└── src/
CMakeLists.txt
:CMake 構建腳本,用于配置項目的編譯和安裝規則。include/
:存放頭文件的目錄。package.xml
:功能包的元數據文件,包含功能包的名稱、版本、依賴項等信息。src/
:存放源文件的目錄。
5. 編寫 C++ 節點代碼
在?src
?目錄下創建一個新的 C++ 源文件,例如?cpp_node.cpp
,并編寫一個簡單的 ROS 2 節點代碼。
#include <rclcpp/rclcpp.hpp>int main(int argc, char * argv[])
{rclcpp::init(argc, argv);auto node = rclcpp::Node::make_shared("cpp_node");RCLCPP_INFO(node->get_logger(), "Hello, ROS 2!");rclcpp::spin(node);rclcpp::shutdown();return 0;
}
這段代碼創建了一個簡單的 ROS 2 節點,節點名稱為?cpp_node
,并在啟動時輸出一條日志信息。
6. 配置?CMakeLists.txt
打開?CMakeLists.txt
?文件,添加以下內容來編譯和安裝?cpp_node
?節點。
# 添加可執行文件
add_executable(cpp_node src/cpp_node.cpp)
# 鏈接ROS 2庫
ament_target_dependencies(cpp_node rclcpp)# 安裝可執行文件
install(TARGETScpp_nodeDESTINATION lib/${PROJECT_NAME}
)
上述代碼中,add_executable
?用于定義可執行文件,ament_target_dependencies
?用于鏈接 ROS 2 庫,install
?用于將可執行文件安裝到指定目錄。
7. 編譯功能包
回到工作空間根目錄,使用?colcon build
?命令編譯功能包。????????
cd ~/ros2_ws
colcon build --packages-select demo_cpp_pkg
--packages-select
?選項用于指定只編譯?demo_cpp_pkg
?功能包。
8. 運行 C++ 節點
編譯完成后,需要 source 工作空間的環境變量,然后運行?cpp_node
?節點。
source install/setup.bash
ros2 run demo_cpp_pkg cpp_node
source install/setup.bash
?用于加載工作空間的環境變量,ros2 run
?用于運行指定功能包中的節點。
9. 總結
通過以上步驟,成功使用功能包組織了一個 C++ 節點。可以按照類似的方法在功能包中添加更多的節點和功能,同時可以根據需要在?package.xml
?中添加更多的依賴項,在?CMakeLists.txt
?中配置更復雜的編譯和安裝規則。