目录
- 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.cpp
10 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_srvcli
13 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.cpp
3 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