【CLion + ROS2】在 clion 中編譯調試 ros2 package

目錄

  • 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. 在 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.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

  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.pswp.cn/news/37825.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/37825.shtml
英文地址,請注明出處:http://en.pswp.cn/news/37825.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Git】版本控制器詳解之git的概念和基本使用

版本控制器git 初始Gitgit的安裝git的基本使用初始化本地倉庫配置本地倉庫三區協作添加---add修改文件--status|diff版本回退--reset撤銷修改刪除文件 初始Git 為了能夠更?便我們管理不同版本的?件,便有了版本控制器。所謂的版本控制器,就是?個可以記…

yolo源碼注釋2——數據集配置文件

代碼基于yolov5 v6.0 目錄: yolo源碼注釋1——文件結構yolo源碼注釋2——數據集配置文件yolo源碼注釋3——模型配置文件yolo源碼注釋4——yolo-py 數據集配置文件一般放在 data 文件夾下的 XXX.yaml 文件中,格式如下: path: # 數據集存放路…

基于ssm+vue的新能源汽車在線租賃管理系統源碼和論文PPT

基于ssmvue的新能源汽車在線租賃管理系統源碼和論文PPT010 開發環境: 開發工具:idea 數據庫mysql5.7(mysql5.7最佳) 數據庫鏈接工具:navcat,小海豚等 開發技術:java ssm tomcat8.5 摘 要 隨著科學技術的飛速發展&#xff0…

Ajax及前端工程化

Ajax:異步的js與xml。 作用: 1、通過ajax給服務器發送數據,并獲得其響應的數據。 2、可以在不更新整個網頁的情況下,與服務器交換數據并更新部分網頁的技術。 一、同步與異步 二、原生Ajax 1、準備數據地址 2、創建XMLHttpReq…

SCSS的基本用法

1、聲明變量 $ 聲明變量的符號 $ 下面這張圖左半部分是scss的語法,右半部分是編譯后的css。(整篇文章皆是如此) 2、默認變量 !default sass 的默認變量僅需要在值后面加上 !default 即可。 如果分配給變量的值后面添加了 !default 標志…

Qt 雜項(Qwt、樣式等)

Qt隱藏窗口邊框 this->setWindowFlags(Qt::FramelessWindowHint);Qt模態框 this->setWindowModality(Qt::ApplicationModal);QLable隱藏border 代碼中設置 lable->setStyleSheet("border:0px");或者UI中直接設置樣式:“border:0px” Qwt開源…

JS實現樹形結構、一維數組以及map之間的轉換

const treeData[ {id:1, name:中國, children:[ {id:11,name:河南省,children:[{id:111,name:南陽市,children:[{id:1111,name:淅川縣,children:null}]},{id:112,name:鄭州市,children:[{id:1121,name:中牟縣,children:null}]}] }, {id:22,name:廣東省,children:[{id:221,name:…

c++中的多態

文章目錄 1.多態的概念1.1概念 2.多態的定義及實現2.1多態的構成條件2.2虛函數2.3虛函數的重寫2.4 C11 override 和 final2.5 重載、覆蓋(重寫)、隱藏(重定義)的對比 3. 抽象類3.1概念3.2接口繼承和實現繼承 4.多態的原理4.1虛函數表4.2多態原理分析4.3 動態綁定與靜態綁定 5.單…

學習筆記整理-面向對象-03-構造函數

一、構造函數 1. 用new調用函數的四步走 new 函數();JS規定,使用new操作符調用函數會進行"四步走": 函數體內會自動創建出一個空白對象函數的上下文(this)會指向這個對象函數體內的語句會執行函數會自動返回上下文對象,即使函數沒…

HDMI接口的PCB布局布線要求

高清多媒體接口(High Definition Multimedia Interface),簡稱:HDMI,是一種全數字化視頻和聲音發送接口,可以發送未壓縮的音頻及視頻信號。隨著技術的不斷提升,HDMI的傳輸速率也不斷的提升&#…

使用GEWE框架進行微信群組管理(三)

友情鏈接:GEWE框架官網 geweapi.com 點擊訪問即可。 邀請或添加聯系人進群 小提示: 不管是添加40人以內還是以上都用此接口cause填寫邀請進群的理由 請求URL: http://域名地址/api/group/invite 請求方式: POST 請求頭&…

brew+nginx配置靜態文件服務器

背景 一下子閑下來了,了解的我的人都知道我閑不下來。于是,我在思考COS之后,決定自己整一個本地的OSS,實現靜態文件的訪問。那么,首屈一指的就是我很熟的nginx。也算是個小復習吧,復習一下nginx代理靜態文…

解決生成式AI落地之困,亞馬遜云科技提供完整解決方案

生成式AI技術無疑是當前最大的時代想象力之一。 資本、創業者、普通人都在涌入生成式AI里去一探究竟:“百模大戰”連夜打響,融資規模連創新高,各種消費類產品概念不斷涌現……根據Bloomberg Intelligence 的報告,2022年生成式AI 市…

文件操作/IO

文件 文件是一種在硬盤上存儲數據的方式,操作系統幫我們把硬盤的一些細節都封裝起來了,程序員只需要了解文件相關的接口即可,相當于操作文件就是間接的操作硬盤了 硬盤用來存儲數據,和內存相比硬盤的存儲空間更大,訪問…

使用FTP文件傳輸協議的潛在風險

數據(事實,數字,價值)是當今業務運行的核心要素。但是,如果數據沒有得到有效的存儲和傳輸,它們就會成為阻礙業務發展的障礙。如果企業不能及時地把數據送到合適的地方,就會造成嚴重的經濟損失。…

【skynet】skynet 入門代碼

寫在前面 本文將從零開始,寫第一個 skynet 程序 HelloWorld 。通過 HelloWorld 可以熟悉 skynet 的運作方式,和了解其 api 。 文章目錄 寫在前面準備工作編寫代碼運行結果 準備工作 首先要有一個編譯好,而且工作正常的 skynet 。 編寫代碼…

【Linux】Shell腳本之流程控制語句 if判斷、for循環、while循環、case循環判斷 + 實戰詳解[?建議收藏!!?]

👨?🎓博主簡介 🏅云計算領域優質創作者 ??🏅華為云開發者社區專家博主 ??🏅阿里云開發者社區專家博主 💊交流社區:運維交流社區 歡迎大家的加入! 🐋 希望大家多多支…

.bit域名調研

.bit域名研究 問題: .bit域名和ENS域名的相同點?不同點?有什么關系? .bit的定義 .bit 是基于區塊鏈的,開源的,跨鏈去中心化賬戶系統.bit 提供了以 .bit 為后綴的全局唯一的命名體系,可用于加密…

安全第二次

一&#xff0c;iframe <iframe>標簽用于在網頁里面嵌入其他網頁。 1&#xff0c;sandbox屬性 如果嵌入的網頁是其他網站的頁面&#xff0c;因不了解對方會執行什么操作&#xff0c;因此就存在安全風險。為了限制<iframe>的風險&#xff0c;HTML 提供了sandb…

分布式應用:Zabbix監控MariaDB

目錄 一、理論 1.Zabbix監控MariaDB 二、實驗 1.Zabbix監控MariaDB 一、理論 1.Zabbix監控MariaDB &#xff08;1&#xff09;環境 zabbix服務端&#xff1a;192.168.204.214 zabbix客戶端&#xff1a;192.168.204.215 &#xff08;2&#xff09;MareaDB安裝 安裝 za…