如何配置VSCode來調試ROS節點

0. 寫在最前面

本文持續更新地址:https://haoqchen.site/2019/08/15/debug-ros-with-vscode/

本文檔介紹瞭如何用VSCode的Debug功能來調試ROS的CPP節點。ROS節點的調試一直非常麻煩,在此之前嘗試過gdb、CLion、Qt插件,用起來都不太順手,直到發現了VSCode的調試功能

調試的好處有:

  1. bug導致的core dumpedsegmentation fault等會停到相應的位置,方便查找
  2. 想到什麼,斷點停那裏就可以看到變量狀態,不用增加輸出代碼再編譯這麼麻煩
  3. 條件中斷,這個也不用再增加if判斷再重新編譯

如果覺得寫得還不錯,可以找我其他文章來看看哦~~~可以的話幫我github點個讚唄。
你的Star是作者堅持下去的最大動力哦~~~

1. 推薦幾個VSCode插件

  • C/C++插件:這個是微軟官方的CPP插件,裝了後就可以愉快地編寫、編譯C++代碼了。

  • C++ Intellisense:這個插件能夠很好地輔助C++開發者進行開發,提供包括代碼跳轉,自動完成,智能提示等功能。

  • ROS (deprecated):這個插件作者已經停止更新了,現在主要用來啓動roscore~~~

2. debug原理及配置

2.1 debug原理

VSCode中是以workspace的概念處理文件關聯的,每個workspace文件夾下會有一個.vscode文件夾,該文件夾下放置的是關於該workspace的路徑配置、任務配置、運行配置等文件,我們正是通過編輯這些配置文件實現對工程的管理。

微軟提供的C/C++插件集成了gdb調試功能,並提供變量界面顯示以及斷點、監視以及調用堆棧等功能。你只需要在.vscode文件夾中配置好launch.json,就可以按下F5快捷鍵啓動相應調試。

由於目前並沒有集成的ROS調試器,所以只能將每一個node當成一個CPP程序來進行調試。

2.2 編譯配置

在VSCode中需要在.vscode文件夾中配置好tasks.json文件(沒有的話可自己新建一個)後,就可以按Ctrl + Shift + B快捷鍵(這個快捷鍵需要將task歸到build的group裏才行,普通的task要Ctrl + Shift + PRun Task),並選擇相關的任務進行編譯等操作。

在這裏插入圖片描述

下面展示的配置文件主要配置了preruncatkin buildcatkin clean以及ccb四個任務。下面簡介一些用到的變量,詳情請看VSCode的tasks頁面。將鼠標停留在相關變量上也可以看到。

  • label
    就是一個名字,你按下快捷鍵的時候用以區分不同task

  • type
    任務的類型,可設置成shellprocess。前者將任務當成命令,啓動終端運行,後者直接運行。

  • command
    實際運行的命令

  • args
    運行的參數,這裏需要注意的是,如果需要進行調試,需要設置爲Debug模式,並且要檢查相應package中的CMakeLists.txt中有沒有設置成Release模式,CMake中txt的設置優先級是最高的。比如我們的驅動就設置Release,所以即使你在這裏怎麼設置都沒用的。

  • group
    這個是分組的,貌似可以從命令行來運行分組的任務,暫時沒用到

  • presentation
    關於輸出顯示的設置,這裏設置爲總是輸出到集成的終端,可通過"panel": "new"設置每次都啓動新的終端

  • problemMatcher
    錯誤分析器,可以分析到輸出的信息中有哪些錯誤並顯示

  • dependsOn
    運行依賴,運行該task前會運行這些依賴的task,如果想要他們按順序運行,需要顯式聲明dependsOrder

  • 其他選型
    看到還有可以重定義當前路徑等很多詳細的功能。

tasks.json文件配置:

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "prerun",
            "type": "shell",
            "command": "source ./devel/setup.zsh && export ROS_MASTER_URI=http://localhost:11311/ "
        },
        {
            "label": "catkin build",
            "type": "shell",
            "command": "catkin",
            "args": [
                "build",
                "-DCMAKE_BUILD_TYPE=Debug"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "presentation": {
                "reveal": "always"
            },
            "problemMatcher": "$msCompile"
        },
        {
            "label": "catkin clean",
            "type": "shell",
            "command": "catkin",
            "args": [
                "clean",
                "-y"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "presentation": {
                "reveal": "always"
            },
            "problemMatcher": "$msCompile"
        },
        {
            "label": "ccb",
            "dependsOrder": "sequence",
            "dependsOn": [
                "catkin clean",
                "catkin build"
            ],
            "problemMatcher": [
                "$msCompile"
            ]
        }
    ]
}

2.3 debug配置

主要是配置launch.json,這裏只介紹幾個常用參數,詳細請參考VSCode中關於Debugging的介紹

  • name
    任務的名字,該名字會在VSCode的Debug中顯示,用戶可選擇需要調試的任務。
    在這裏插入圖片描述

  • tpye
    調試器名稱。

  • request
    launchattach兩種方式,前者直接運行,後者將程序綁定到之前啓動的程序

  • program
    這裏需要寫生成的二進制路徑

  • args
    傳進去的參數,這裏分爲ROS參數服務器形式傳進去的參數以及以main函數參數傳進去的參數,這裏介紹的是前者。有興趣可以Google一下。

  • stopAtEntry
    是否在運行前暫停

  • cwd
    設置當前路徑,如果程序中用的是相對路徑,則需要設置該參數爲當前路徑。

  • environment
    環境變量設置

  • externalConsole
    是否啓動外部終端(默認是用集成終端)

  • preLaunchTask
    在啓動前啓動一個task,這個prerun在前面一節有說,主要是設置source當前ROS路徑等

  • postDebugTask
    運行完了之後啓動的task,節點運行完了進行清理工作

  • MIMode
    調試器名稱

  • setupCommands
    是給gdb的參數

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "cloud_node",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/devel/.private/rslidar_pointcloud/lib/rslidar_pointcloud/cloud_node",
            "args": [
                "_model:=RS16",
                "_resolution_type:=1.0cm"
            ],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "preLaunchTask": "prerun",
            "MIMode": "gdb",
            "avoidWindowsConsoleRedirection": true,
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

2.4 多任務調試

根據VSCode中關於Debugging的介紹,可以啓動完一個任務後再啓動另外一個即可同時debug多個。

寫完多個節點後,可以通過compounds來進行配置,但compounds不能確保順序執行,嘗試通過preLaunchTask延時2秒啓動來實現順序執行,但preLaunchTask任務啓動的終端跟節點啓動的終端不是同一個。

"compounds": [
  {
      "name": "rslidar",
      "configurations": [
          "rslidar_node",
          "cloud_node",
          "rviz_node"
      ]
  }
]

另外還有一個問題是,不知道怎麼確保同一個程序下次運行還用同一個終端,現在是會新建一個終端,每次重啓就新建一個,多次之後就一堆要自己刪。

todo feature

參考


喜歡我的文章的話Star一下唄Star

版權聲明:本文爲白夜行的狼原創文章,未經允許不得以任何形式轉載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章