【CLion + ROS2】在 clion 中编译调试 ros2 package

这篇具有很好参考价值的文章主要介绍了【CLion + ROS2】在 clion 中编译调试 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. 在 1 中已经生成了 compile_commands.json,使用 clion 将其作为项目打开(这个文件有点像 toplevel CMakeLists.txt)。
  2. 修改项目 root 目录。

此时 clion 还不能 build | run | debug dev_ws 工程的代码。
【CLion + ROS2】在 clion 中编译调试 ros2 package,intellij-idea


3. 使用 clion 编译整个 ros2 工程

大致步骤:

  1. 使用 clion 的 external tool 配置 colcon build
  2. 编译 dev_ws 工程

3.1 使用 clion 的 external tool 配置 colcon build

选择 Settings | Tools | External Tools (或者 shift x 2) 使用 + 添加一个新的 external tool,配置如下:
【CLion + ROS2】在 clion 中编译调试 ros2 package,intellij-idea

3.2 开始编译 dev_ws 工程

使用 tool bar 或者 shift x 2 (external tool),开始编译 dev_ws 工程。
【CLion + ROS2】在 clion 中编译调试 ros2 package,intellij-idea
【CLion + ROS2】在 clion 中编译调试 ros2 package,intellij-idea

3.3 编译结果:

可以使用 红框中的图标进行 rebuild。
【CLion + ROS2】在 clion 中编译调试 ros2 package,intellij-idea

需要 reload compilation database

【CLion + ROS2】在 clion 中编译调试 ros2 package,intellij-idea

其实这一步也是为了生成 compile_commands.json,做完这一步之后可以跳至 2。

编译完整个 ros2 dev_ws 工程之后,是无法调试单独的 ros2 package 的,需要对每一个 ros2 package 进行配置,从而进行调试。


4. 调试单独的 ros2 package

大致步骤:

  1. 创建 ros2 package 的独立的 colcon build bash 脚本。
  2. 创建 clion 中 ros2 package 的独立的 custom build target。
  3. 创建 clion 中 对独立的 custom build target 的 run | debug configuration。
  4. 构建(build) ros2 package。
  5. 调试(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

  1. 在clion 中打开 custom build targets 窗口(shift x 2 输入 custom build targets)。
  2. 按照截图流程进行配置(edit tool 中的 cmake_commands.bat 就是步骤1中创建的文件)。
    【CLion + ROS2】在 clion 中编译调试 ros2 package,intellij-idea

4.3 创建 clion 中 对独立的 custom build target 的 run | debug configuration

按照截图流程进行操作
其中 5 中的 target 就是 步骤 2 中创建的 custom build target for pubsub package
如果 6 中有 build 文件夹,可以手动清除。
【CLion + ROS2】在 clion 中编译调试 ros2 package,intellij-idea

4.4 构建(build) ros2 package

可以先删除 dev_ws/build/cpp_pubsub/ 目录中所有文件,在用 clion 进行编译之前。
按照截图进行 pubsub package 的编译。
【CLion + ROS2】在 clion 中编译调试 ros2 package,intellij-idea
编译结果:

4.5 调试(debug)ros2 package

由于代码的特殊信,当前 package 包含两个可执行程序 pub(talker),sub(listener)。要调试两者的功能时,需要按截图操作。
如 2 中所示,需要为 pub,sub 分别创建调试配置,在 5 中选择 dev_ws/build/cpp_pubsub 可执行程序(talker,listener)。
【CLion + ROS2】在 clion 中编译调试 ros2 package,intellij-idea
调试结果:pub:
【CLion + ROS2】在 clion 中编译调试 ros2 package,intellij-idea
调试结果:sub:
【CLion + ROS2】在 clion 中编译调试 ros2 package,intellij-idea


& 参考

链接1:clion ros2 代码 build run debug编译运行断点调试
链接2:搭建ROS2 & CLion开发环境
链接3:ROS2 setup tutorial文章来源地址https://www.toymoban.com/news/detail-649860.html

到了这里,关于【CLion + ROS2】在 clion 中编译调试 ros2 package的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Ubuntu22.04源码安装ROS-noetic(ROS1非ROS2),编译运行VINS-MONO

    由于22.04默认安装ROS2,但很多仓库都是基于ROS1的,不想重装系统,参考这两个博客安装了ROS-noetic: 博客1. https://blog.csdn.net/Drknown/article/details/128701624 博客2. https://zhuanlan.zhihu.com/p/418227536 我的库版本(实测可行): eigen:3.3.7 ceres:1.14.0(用2.系列版本的编译时需要把C++版本设

    2024年02月02日
    浏览(53)
  • 优化ROS2 Python编译环境,解决版本不匹配和C++配置错误

    在编译ROS2的Python环境时遇到的版本不匹配问题,并提供了解决方案。同时,还讨论了可能出现的C++配置错误,并给出了优化细节以确保同时支持C++11和C++14。通过遵循本文中的步骤,读者将能够优化ROS2编译环境,解决版本不匹配和C++配置错误,从而顺利进行开发工作。

    2024年02月07日
    浏览(148)
  • Ros2 自己修改的cartographer代码编译后不生效的解决办法

    原因是ros2在安装一些库的时候,在ros2的路径下生成了cartographer,默认找到了ros下,导致的,把这些库删掉即可 kobe@kobe-NUC11PAHi7:/opt/ros/humble/include$ sudo rm -R cartographer [sudo] kobe 的密码: kobe@kobe-NUC11PAHi7:/opt/ros/humble/include$ sudo rm -R cartographer_ros kobe@kobe-NUC11PAHi7:/opt/ros/humble/include

    2024年02月06日
    浏览(46)
  • 【ROS2】为什么要使用ROS2?《ROS2系统特性介绍》

    2010年,ROS1首次发布正式版本,其研发的初衷是为设计PR2(个人服务型机器人)共用的软件架构。但随着ROS1技术的普及,ROS1开始广泛融入各领域无人系统的研发,陆续暴露了系统的诸多问题。为了适应新时代机器人研发的需要,2022年5月,ROS开发者团队推出新版本ROS2。 2007年

    2024年02月09日
    浏览(39)
  • 【ROS2指南-4】理解ROS2话题

    目标: 使用 rqt_graph 和命令行工具来反思 ROS 2 主题。 教程级别: 初学者 时间: 20分钟 内容 背景 先决条件 任务 1 设置 2 rqt_graph 3 ros2主题列表 4 ros2主题回显 5 ros2 主题信息 6 ros2界面展示 7 ros2主题发布 8 ros2 主题赫兹 9 清理 概括 下一步 ROS 2 将复杂的系统分解为许多模块化节

    2023年04月19日
    浏览(46)
  • 【ros2】ros2环境安装与基础入门

    😏 ★,° :.☆( ̄▽ ̄)/$: .°★ 😏 这篇文章主要介绍ros2环境安装与基础入门。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路🥞 ROS 2 (Robot Operating System 2)是一个开源的机器人操作系统,它是ROS(Robot

    2024年02月09日
    浏览(43)
  • 【ROS2指南-11】创建ROS2功能包

    目标: 使用 CMake 或 Python 创建一个新包,并运行其可执行文件。 教程级别: 初学者 时间: 15分钟 内容 背景 1 什么是 ROS 2 包? 2 什么构成了 ROS 2 包? 3 工作区中的包 先决条件 任务 1 创建一个包 2 构建一个包 3 获取安装文件 4 使用包 5 检查包装内容 6 自定义 package.xml 概括

    2024年02月04日
    浏览(41)
  • 【ROS2指南-7】理解ROS2的Action

    目标: 理解并学习ROS 2 中的Action通信方式。 教程级别: 初学者 时间: 15分钟 内容 背景 先决条件 任务 1 设置 2 使用动作 3 ros2节点信息 4 ros2 动作列表 5 ros2 动作信息 6 ros2界面展示 7 ros2 动作 send_goal 概括 下一步 相关内容 动作是 ROS 2 中的一种通信类型,用于长时间运行的任

    2023年04月16日
    浏览(45)
  • 【ROS2机器人入门到实战】2.ROS与ROS2对比

    当前平台文章汇总地址:ROS2机器人从入门到实战 获取完整教程及配套资料代码,请关注公众号鱼香ROS获取 教程配套机器人开发平台:两驱版| 四驱版 为方便交流,搭建了机器人技术问答社区:地址 fishros.org.cn 经过上一节的学习,相信你已经对ROS和ROS2的发展有了一定的了解

    2024年02月04日
    浏览(44)
  • ROS2系列(03):ROS1和ROS2的区别【01/2】

    目录 1 提要 2 从架构上说  2.1 通信协议不同 2.2 架构不同 2.3 ROS2多了一个rcl

    2024年02月06日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包