目錄
- 0 背景
- 1. 命令行編譯 ros2 package
- 2. 使用 clion 打開 ros2 工程
- 3. 使用 clion 編譯整個 ros2 工程
- 3.1 使用 clion 的 external tool 配置 `colcon build`
- 3.2 開始編譯 dev_ws 工程
- 3.3 編譯結果:
- 4. 調試單獨的 ros2 package
- 4.1 創建 ros2 package 的獨立的 colcon build bash 腳本
- 4.2 創建 clion 中 ros2 package 的獨立的 custom build target
- 4.3 創建 clion 中 對獨立的 custom build target 的 **run | debug** configuration
- 4.4 構建(build) ros2 package
- 4.5 調試(debug)ros2 package
- & 參考
0 背景
最近學習 ros2 的 carla-ros-bridge 代碼,發現代碼中沒有頂層 CMakeLists.txt,這種情況下,clion 無法構建 ros2 工程,從而無法編譯調試 ros2 package 或者工程,在瀏覽了一些網頁尋找解決方法之后,發現 鏈接1,2,3 中給出了很好的指導步驟,這篇文章就是用來記錄自己操作時的一點心得。
文章結構很大程度上借鑒了鏈接 1 和 3(clion 官方教程)。如有侵權請告知。
1. 命令行編譯 ros2 package
命令行或clion命令和中編譯 dev_ws
:
colcon build --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -G Ninja# 選項:-DCMAKE_EXPORT_COMPILE_COMMANDS=ON,用于生成
# In order to be able to open a ROS2 workspace in CLion, we will generate a JSON compilation database using the CMAKE_EXPORT_COMPILE_COMMANDS CMake flag.# 如果沒有 Ninja,sudo 安裝
sudo apt install ninja-build
當前項目目錄結構:
dev_ws
└── src├── cpp_pubsub│ ├── cmake_commands.bat│ ├── CMakeLists.txt│ ├── include│ │ └── cpp_pubsub│ ├── package.xml│ └── src│ ├── publisher_member_function.cpp│ └── subscriber_member_function.cpp└── cpp_srvcli├── cmake_commands.bat├── CMakeLists.txt├── include│ └── cpp_srvcli├── package.xml└── src├── add_two_ints_client.cpp└── add_two_ints_server.cpp10 directories, 10 files
結果文件如下:
jacob@jacob-xx15:~/Work_ROS/ros2_study_ws/dev_ws$ tree . -L 2
.
├── build
│ ├── COLCON_IGNORE
│ ├── compile_commands.json # -DCMAKE_EXPORT_COMPILE_COMMANDS=ON 生成的代碼
│ ├── cpp_pubsub
│ └── cpp_srvcli
├── install
│ ├── ..
│ ├── cpp_pubsub
│ ├── cpp_srvcli
│ ├── ..
├── log
│ ├── build_2023-08-14_19-26-37
│ ├── COLCON_IGNORE
│ ├── latest -> latest_build
│ └── latest_build -> build_2023-08-14_19-26-37
└── src├── cpp_pubsub└── cpp_srvcli13 directories, 14 files
生成的 .json
文件如下:
[
{"directory": "/home/jacob/Work_ROS/ros2_study_ws/dev_ws/build/cpp_pubsub","command": "/usr/bin/c++ -DDEFAULT_RMW_IMPLEMENTATION=rmw_fastrtps_cpp -DRCUTILS_ENABLE_FAULT_INJECTION -DSPDLOG_COMPILED_LIB -isystem /opt/ros/foxy/include -Wall -Wextra -Wpedantic -std=gnu++14 -o CMakeFiles/listener.dir/src/subscriber_member_function.cpp.o -c /home/jacob/Work_ROS/ros2_study_ws/dev_ws/src/cpp_pubsub/src/subscriber_member_function.cpp","file": "/home/jacob/Work_ROS/ros2_study_ws/dev_ws/src/cpp_pubsub/src/subscriber_member_function.cpp"
},{"directory": "/home/jacob/Work_ROS/ros2_study_ws/dev_ws/build/cpp_pubsub","command": "/usr/bin/c++ -DDEFAULT_RMW_IMPLEMENTATION=rmw_fastrtps_cpp -DRCUTILS_ENABLE_FAULT_INJECTION -DSPDLOG_COMPILED_LIB -isystem /opt/ros/foxy/include -Wall -Wextra -Wpedantic -std=gnu++14 -o CMakeFiles/talker.dir/src/publisher_member_function.cpp.o -c /home/jacob/Work_ROS/ros2_study_ws/dev_ws/src/cpp_pubsub/src/publisher_member_function.cpp","file": "/home/jacob/Work_ROS/ros2_study_ws/dev_ws/src/cpp_pubsub/src/publisher_member_function.cpp"
},{"directory": "/home/jacob/Work_ROS/ros2_study_ws/dev_ws/build/cpp_srvcli","command": "/usr/bin/c++ -DDEFAULT_RMW_IMPLEMENTATION=rmw_fastrtps_cpp -DRCUTILS_ENABLE_FAULT_INJECTION -DSPDLOG_COMPILED_LIB -isystem /opt/ros/foxy/include -Wall -Wextra -Wpedantic -std=gnu++14 -o CMakeFiles/client.dir/src/add_two_ints_client.cpp.o -c /home/jacob/Work_ROS/ros2_study_ws/dev_ws/src/cpp_srvcli/src/add_two_ints_client.cpp","file": "/home/jacob/Work_ROS/ros2_study_ws/dev_ws/src/cpp_srvcli/src/add_two_ints_client.cpp"
},{"directory": "/home/jacob/Work_ROS/ros2_study_ws/dev_ws/build/cpp_srvcli","command": "/usr/bin/c++ -DDEFAULT_RMW_IMPLEMENTATION=rmw_fastrtps_cpp -DRCUTILS_ENABLE_FAULT_INJECTION -DSPDLOG_COMPILED_LIB -isystem /opt/ros/foxy/include -Wall -Wextra -Wpedantic -std=gnu++14 -o CMakeFiles/server.dir/src/add_two_ints_server.cpp.o -c /home/jacob/Work_ROS/ros2_study_ws/dev_ws/src/cpp_srvcli/src/add_two_ints_server.cpp","file": "/home/jacob/Work_ROS/ros2_study_ws/dev_ws/src/cpp_srvcli/src/add_two_ints_server.cpp"
}
]
2. 使用 clion 打開 ros2 工程
- 在 1 中已經生成了
compile_commands.json
,使用 clion 將其作為項目打開(這個文件有點像 toplevel CMakeLists.txt)。 - 修改項目 root 目錄。
此時 clion 還不能 build | run | debug dev_ws 工程的代碼。
3. 使用 clion 編譯整個 ros2 工程
大致步驟:
- 使用 clion 的 external tool 配置
colcon build
- 編譯 dev_ws 工程
3.1 使用 clion 的 external tool 配置 colcon build
選擇 Settings | Tools | External Tools (或者 shift x 2) 使用 + 添加一個新的 external tool,配置如下:
3.2 開始編譯 dev_ws 工程
使用 tool bar 或者 shift x 2 (external tool),開始編譯 dev_ws 工程。
3.3 編譯結果:
可以使用 紅框中的圖標進行 rebuild。
需要 reload compilation database
其實這一步也是為了生成 compile_commands.json
,做完這一步之后可以跳至 2。
編譯完整個 ros2 dev_ws
工程之后,是無法調試單獨的 ros2 package
的,需要對每一個 ros2 package
進行配置,從而進行調試。
4. 調試單獨的 ros2 package
大致步驟:
- 創建 ros2 package 的獨立的 colcon build bash 腳本。
- 創建 clion 中 ros2 package 的獨立的 custom build target。
- 創建 clion 中 對獨立的 custom build target 的 run | debug configuration。
- 構建(build) ros2 package。
- 調試(debug)ros2 package。
4.1 創建 ros2 package 的獨立的 colcon build bash 腳本
在 cpp_pubsub
目錄下,創建 cmake_commands.bat
。
jacob@jacob-xx15:~/Work_ROS/ros2_study_ws/dev_ws/src/cpp_pubsub$ tree
.
├── cmake_commands.bat # 這玩意
├── CMakeLists.txt
├── include
│ └── cpp_pubsub
├── package.xml
└── src├── publisher_member_function.cpp└── subscriber_member_function.cpp3 directories, 5 files
編寫 pubsub package 的 cmake_commands.bat,其他 package 可以參考這個來寫。
第一行:構建命令。
第二行:編譯命令。
第三行:安裝命令。
/usr/bin/cmake /home/jacob/Work_ROS/ros2_study_ws/dev_ws/src/cpp_pubsub -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -G Ninja -DCMAKE_INSTALL_PREFIX=/home/jacob/Work_ROS/ros2_study_ws/dev_ws/install/cpp_pubsub
/usr/bin/cmake --build /home/jacob/Work_ROS/ros2_study_ws/dev_ws/build/cpp_pubsub -- -j8 -l8
/usr/bin/cmake --install /home/jacob/Work_ROS/ros2_study_ws/dev_ws/build/cpp_pubsub
4.2 創建 clion 中 ros2 package 的獨立的 custom build target
- 在clion 中打開 custom build targets 窗口(shift x 2 輸入 custom build targets)。
- 按照截圖流程進行配置(edit tool 中的 cmake_commands.bat 就是步驟1中創建的文件)。
4.3 創建 clion 中 對獨立的 custom build target 的 run | debug configuration
按照截圖流程進行操作
其中 5 中的 target 就是 步驟 2 中創建的 custom build target for pubsub package。
如果 6 中有 build 文件夾,可以手動清除。
4.4 構建(build) ros2 package
可以先刪除 dev_ws/build/cpp_pubsub/
目錄中所有文件,在用 clion 進行編譯之前。
按照截圖進行 pubsub package 的編譯。
編譯結果:
4.5 調試(debug)ros2 package
由于代碼的特殊信,當前 package 包含兩個可執行程序 pub(talker),sub(listener)。要調試兩者的功能時,需要按截圖操作。
如 2 中所示,需要為 pub,sub 分別創建調試配置,在 5 中選擇 dev_ws/build/cpp_pubsub
可執行程序(talker,listener)。
調試結果:pub:
調試結果:sub:
& 參考
鏈接1:clion ros2 代碼 build run debug編譯運行斷點調試
鏈接2:搭建ROS2 & CLion開發環境
鏈接3:ROS2 setup tutorial