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

news2024/12/23 5:42:49

目录

  • 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. 在 1 中已经生成了 compile_commands.json,使用 clion 将其作为项目打开(这个文件有点像 toplevel CMakeLists.txt)。
  2. 修改项目 root 目录。

此时 clion 还不能 build | run | debug dev_ws 工程的代码。


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,配置如下:
在这里插入图片描述

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

大致步骤:

  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中创建的文件)。
    在这里插入图片描述

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/881003.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java知识-JVM线程四大引用

一、JVM (1) 基本概念: JVM 是可运行 Java 代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、 一个垃圾回收,堆 和 一个存储方法域。JVM 是运行在操作系统之上的,它与硬件没有直接 的交互。 (2) 运行过程&#x…

【数仓建设系列之一】什么是数据仓库?

一、什么是数据仓库? 数据仓库(Data Warehouse,简称DW)简单来讲,它是一个存储和管理大量结构化和非结构化数据的存储集合,它以主题为向导,通过整合来自不同数据源下的数据(比如各业务数据,日志文件数据等)…

redis数据类型详解+实例

redis中的数据类型: string,list, set, zset, hash,bitmaps, hyperloglog, gepspatial 目录 一、 String 二、List 三、Set 四、Zset 五、Hash 六、Bitmaps 七、Hyperloglog 八、Gepspatial 一、 String redis最基本的数据类型,一个…

CSS3:图片边框

简介 图片也可以作为边框&#xff0c;以下是实例演示 注意 实现该效果必须添加border样式&#xff0c;且必须位于border-image-socure之前否则不会生效 实例 <html lang"en"><head><style>p {width: 600px;margin: 200px auto;border: 30px soli…

为什么爬虫要用高匿代理IP?高匿代理IP有什么优点

只要搜代理IP&#xff0c;度娘就能给我们跳出很多品牌的推广&#xff0c;比如我们青果网路的。 正如你所看到的&#xff0c;我们厂商很多宣传用词都会用到高匿这2字。 这是为什么呢&#xff1f;高匿IP有那么重要吗&#xff1f; 这就需要我们从HTTP代理应用最多最广的&#xf…

企业数据库遭到360后缀勒索病毒攻击,360勒索病毒解密

在当今数字化时代&#xff0c;企业的数据安全变得尤为重要。随着数字化办公的推进&#xff0c;企业的生产运行效率得到了很大提升&#xff0c;然而针对网络安全威胁&#xff0c;企业也开始慢慢引起重视。近期&#xff0c;我们收到很多企业的求助&#xff0c;企业的服务器遭到了…

从零开始学极狐GitLab|03 Runner 裸机部署

目录 极狐GitLab SaaS 版&#xff08;无需部署&#xff09; 安装自己的极狐GitLab- Runner 1. macOS ➤ 安装 ➤ 注册 2. Linux ➤ 安装 ➤ 注册 3. Windows ➤ 安装 ➤ 注册 【从零开始学极狐GitLab】专栏由极狐GitLab 社区开发者“雪碧能喝多”投稿&#xff0c;面…

Elasticsearch - 闲聊ElasticSearch中的分页

文章目录 概述分页方案from-size内部执行过程【Query】阶段【fetch】阶段潜在问题注意事项 深度分页Scroll &#xff08;Scroll遍历数据&#xff09;Scroll ScanSliced ScrollSearch After基于pit机制的search after 小结 概述 ElasticSearch是一款强大的搜索引擎&#xff0c;…

轻拍牛头(约数)

题意&#xff1a;求ai在n个数中&#xff0c;ai可以整除的数有多少个&#xff0c;不包括ai自己。 分析&#xff1a;暴力写需要n^2的时间复杂度&#xff0c;此时想一下预处理每个数的倍数&#xff0c;约数和倍数是有关系的&#xff0c;把每个数的倍数都加上1. #include<bits…

优思学院|在六西格玛项目中如何知道过程是否受控?

当我们说过程处于统计受控状态时&#xff0c;我们是指过程不存在特有原因。 以下面的图表来说明&#xff0c;过程处于“不受控”状态和“受控”状态时的情况。 当过程在统计意义上是受控的&#xff0c;它并不意味着过程产出的产品就不会超过规定的规范&#xff0c;符合质量要…

CondaValueError: Malformed version string ‘~‘: invalid character(s).

目录 问题描述&#xff1a; 问题解决&#xff1a; 问题描述&#xff1a; 在Conda环境中安装PyTorch、torchvision、torchaudio等软件包时&#xff0c;明明命令输入的没问题&#xff0c;却一直报错&#xff0c;说多了一个符号&#xff0c;报错界面如下&#xff1a; 问题解决&a…

美国过境签可否在美国境内续签?

美国过境签&#xff0c;也称为美国旅游签证或B类签证&#xff0c;通常用于短期访问美国的目的&#xff0c;比如旅游、商务会议、探亲等。过境签证持有者可以在签证规定的有效期内进入美国境内&#xff0c;并在允许的停留期内停留。然而&#xff0c;一般情况下&#xff0c;美国过…

海归事迹|记斯坦福大学博士后王成坤

王成坤&#xff0c;国内博士毕业后即赴美国斯坦福大学从事5年博士后研究&#xff0c;期间累计发表SCI论文23篇&#xff0c;总影响因子300&#xff0c;授权专利6项。现为南京医科大学高层次引进人才、教授、博士研究生导师、独立学术带头人。本期知识人网小编特做介绍。 百度百科…

日常BUG——git提交代码报错

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;日常BUG、BUG、问题分析☀️每日 一言 &#xff1a;存在错误说明你在进步&#xff01; 一、问题描述 git 在提交代码时报错&#xff1a; Committing is not possible because you have unmerge…

Java创建多线程的最全方法

Java创建多线程的最全方法 一、继承Thread&#xff0c;重写run方法二、实现Runnable接口&#xff0c;重写run方法三、使用匿名内部类创建 Thread 子类对象四、使用匿名内部类&#xff0c;实现Runnable接口五、实现Callable接口六、使用线程池创建线程 一、继承Thread&#xff0…

Jmeter性能测试 —— jmeter之使用ServerAgent监控服务器

ServerAgent 性能测试时我们关注的重要指标是&#xff1a;并发用户数&#xff0c;TPS&#xff0c;请求成功率&#xff0c;响应时间&#xff0c;服务器的CPU&#xff0c;memory&#xff0c; I/O disk等。Jmeter的聚合报告可以查看并发数、吞吐量、请求成功率、响应时间等&#…

看康师傅金桔柠檬X国漫IP跨界出圈,打开IP合作新思路

Z世代年轻群体已经成为消费主力&#xff0c;其喜好和消费观念也呈现出全新态势。抓住年轻人的心&#xff0c;就是抓住了品牌未来的战场。 那么到底什么样的营销动作才能真正撬动年轻人&#xff1f; 对于互联网时代成长起来的Z世代年轻人来说&#xff0c;人气二次元IP无疑是能最…

python实现樱花

python实现樱花 代码如下&#xff1a; from turtle import * from random import * from math import * def tree(n, l):pd () # 下笔# 阴影效果t cos ( radians ( heading () 45 ) ) / 8 0.25pencolor ( t, t, t )pensize ( n / 3 )forward ( l ) # 画树枝if n > 0:…

vue3+vite配置vantUI主题

❓在项目中统一配置UI主题色&#xff0c;各个组件配色统一修改 vantUI按需安装 参考vantUI文档 创建vantVar.less文件夹进行样式编写 vantVar.less :root:root{//导航--van-nav-bar-height: 44px;//按钮--van-button-primary-color: #ffffff;--van-button-primary-backgr…

Android免打包多渠道统计如何实现

摘要&#xff1a; 实际上只要完成1-2步即可实现多渠道打包&#xff0c;这也意味着&#xff0c;只要每次更新App时给出一个原始包&#xff0c;运营人员就能在后台自己进行操作管理&#xff0c;简单快捷到全程无需开发人员参与。 我们都知道&#xff0c;Android 市场被分割成几十…