1. 程式人生 > 程式設計 >ros專案除錯:vscode下配置開發ROS專案的詳細教程

ros專案除錯:vscode下配置開發ROS專案的詳細教程

引言

在vscode下面配置用於ROS專案開發的環境

包括標頭檔案目錄的配置,catkin_make命令的配置,GDB debug的配置,以及ROS外掛。

vscode標頭檔案目錄配置安裝“c/c++”外掛

到vscode左邊欄的EXTENSIONS中,搜尋“C/C++”並安裝

生成c_cpp_properties.json

vscode自身配置檔案全部在./.vscode/目錄下

但是,在最開始對自己新建的目錄和檔案進行編輯後,資料夾裡面是沒有.vscode目錄的

同時,我們的cpp檔案程式碼中的 #include <> 這句話是有下劃線警示的,提示找不到檔案

這時使用滑鼠懸浮功能,點選“紅色燈泡”,點選edit c_cpp_properties.json選項,vscode會自動在配置資料夾中新建.vscode/資料夾,同時在裡面初始化了c_cpp_properties.json檔案

輸出編譯命令檔案

這時,可能還有一些標頭檔案找不到,比如ros/ros.h,我們還需要配置一些東西。

用命令列編譯我們寫的c++程式碼,同時輸出編譯資訊檔案,這裡以ROS為例

catkin_make -DCMAKE_EXPORT_COMPILE_COMMANDS=Yes

這個命令會輸出一個compile_commands.json檔案在ROS工作空間的build資料夾下面

然後在c_cpp_properties.json檔案新增下面一段話

"compileCommands": "${workspaceFolder}/build/compile_commands.json"

修改後的c_cpp_properties.json檔案如下所示:

{
  "configurations": [
    {
      "name": "Linux","includePath": [
        "${workspaceFolder}/**"
      ],"defines": [],"compilerPath": "/usr/bin/gcc","cStandard": "c11","cppStandard": "c++17","intelliSenseMode": "clang-x64","compileCommands": "${workspaceFolder}/build/compile_commands.json"
    }
  ],"version": 4
}

這樣,就基本可以找到全部標頭檔案了,然後就可以使用程式碼提示來碼程式碼了。

catkin_make設定

vscode沒有內建make功能,需要藉助Task功能進行配置

Ctrl+shift+P進入命令模式,鍵入tasks: Configure Task

此時會在.vscode資料夾下面自動生成task.json檔案,如下所示:

{
  "version": "2.0.0","tasks": [
    {
      "label": "catkin_make",//代表提示的描述性資訊
      "type": "shell",//可以選擇shell或者process,如果是shell程式碼是在shell裡面執行一個命令,如果是process代表作為一個程序來執行
      "command": "catkin_make",//這個是我們需要執行的命令
      "args": [],//如果需要在命令後面加一些字尾,可以寫在這裡,比如-DCATKIN_WHITELIST_PACKAGES=“pac1;pac2”
      "group": {"kind":"build","isDefault":true},"presentation": {
        "reveal": "always"//可選always或者silence,代表是否輸出資訊
      },"problemMatcher": "$msCompile"
    },]
}

其中,這行設定

"group": {"kind":"build",

代表將我們定義的這個task新增到build組裡面,這樣就可以中Ctrl+Shift+B快捷鍵來找到編譯命令,命令名稱就是在label裡面定義的,如果"isDefault":true那麼就代表直接執行command,如果為false還需要在build下拉里面選一下,我們這裡就是label名字:catkin_make

還需要提一下,我們開啟vscode一定要在我們的ROS工作空間目錄開啟:

code .

因為這樣你的vscode的Base path就是你開啟vscode的位置,在我們執行catkin_make的時候,需要用的這個Base path,必須是我們的ROS工作空間來可以正常catkin_make

這樣配置好了之後,我們之後再進行編譯ROS工作空間的時候,就可以方便的使用快捷方式

Ctrl+Shift+B

GDB debug的配置

GDB偵錯程式是除錯C++程式碼的神器,ROS專案本質上也是一個ROS專案,因此也可以用GDB進行除錯

在vscode裡面已經繼承了GDB偵錯程式,我們需要做的就是配置launch.json檔案

點選左側工具欄”Debug“,點選”齒輪“按鈕,此時.vscode資料夾下面就會自動生成launch.json檔案,如下所示

{
  "version": "0.2.0","configurations": [
    {
      "name": "(gdb) Launch",// 配置名稱,將會在除錯配置下拉列表中顯示
      "type": "cppdbg",// 偵錯程式型別 該值自動生成
      "request": "launch",// 除錯方式,還可以選擇attach
      "program": "${workspaceRoot}/devel/lib/waypoint_follower/pure_persuit",//要除錯的程式(完整路徑,支援相對路徑)
      "args": [],// 傳遞給上面程式的引數,沒有引數留空即可
      "stopAtEntry": false,// 是否停在程式入口點(停在main函式開始)
      "cwd": "${workspaceRoot}",// 除錯程式時的工作目錄
      "environment": [],//針對除錯的程式,要新增到環境中的環境變數. 例如: [ { "name": "squid","value": "clam" } ]
      "externalConsole": false,//如果設定為true,則為應用程式啟動外部控制檯。 如果為false,則不會啟動控制檯,並使用VS Code的內建除錯控制檯。
      "MIMode": "gdb",// VSCode要使用的除錯工具
      "setupCommands": [
        {
          "description": "Enable pretty-printing for gdb","text": "-enable-pretty-printing","ignoreFailures": true
        }
      ]
    }
  ]
}

需要注意的是,這裡面的“program”引數是需要自己給定的,比如我要除錯一個ROS節點,那麼就需要找到這個節點生成的可執行目標,就是可執行的二進位制檔案,然後新增到“program”引數後面,如果要除錯其他節點,那麼還需要手動修改這裡

除此之外,因為我們不是roslaunch啟動的節點,還需要一個終端執行roscore,否則會找不到ROS MASTER

"request"引數裡面,gdb在vscode裡面提供了launch和attach兩個配置任務。兩者的區別是launch實際上是啟動一個node執行指定程式碼,同時可以在vscode裡面打斷點除錯。 attach是執行監聽的任務。

使用vscode進行除錯的手段主要包括單步執行,觀察跟蹤變數值等等

更多的GDB除錯命令可以在vscode下方的DEBUG_CONSOLE視窗直接輸入GDB命令 但是要注意需要在原來的GDB命令前面家加上一個字首“-exec”,如下所示:

-exec b main

有關於常用的GDB命令總結:GDB的使用

還需要注意的是在Watch視窗新增需要Watch的變數時候,變數名稱要寫全域性名稱,包括前面的命令空間都要寫上

基於上面的描述,我們就可以開心的debug了

新增ROS外掛安裝

開啟vscode的快捷輸入視窗(Ctrl+P)

輸入以下命令,即可安裝ROS外掛

ext install ajshort.ros

用法

可以在右鍵點選一個資料夾,然後選擇creat catkin package,建立一個ROS package

還可以按下(Ctrl+Shift+P),輸入

ros::showMasterStatus

這個命令可以顯示出當前ROS通訊系統的詳細資訊,包括當前的所有話題,已經話題的所有釋出者和訂閱者

基本上這個vscode的ROS外掛就這兩個有用

到此這篇關於ros專案除錯:vscode下配置開發ROS專案的詳細教程的文章就介紹到這了,更多相關vscode配置開發ROS專案內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!