使用VScode調試ROS

前言

之前用RoboWare Studio,但是它已經很久沒有更新了,官網也沒有了。Kinect版本也快不用了,趁這個機會,正好開始用VScode.

基本介紹

官方教程:
https://code.visualstudio.com/docs
其他:
https://www.jianshu.com/p/11554732b323
https://www.cnblogs.com/shujuan841019/p/5501083.html

插件及小技巧

插件
https://blog.csdn.net/weixin_45601379/article/details/100550421
https://blog.csdn.net/qq_41139830/article/details/85221330
https://www.jianshu.com/p/3eebde5748a6

小技巧
https://www.cnblogs.com/shujuan841019/p/5501083.html
https://www.jianshu.com/p/0cf2130d1b27

vscode安裝與ROS插件相關

從官網下載並安裝。
https://code.visualstudio.com/

  1. 中文模式。在vs code左側選擇Extenxions,輸入chinese,安裝簡體中文包。
  2. ros插件上。我選擇了MS的預覽版。
    網上人很多選了ajshort的版本,但是這個版本已經deprecated. 並且被MS版兼併,雖然MS版還不是很完善。
  3. c++配置。在Extenxions裏面,輸入c++,安裝c/c++ 及 C++ Intellisense 這兩個。
  4. 配置CMakeLists.txt文件語法高亮。在Extenxions裏面,輸入txt,安裝Txt Syntax。
  5. 配置msg, srv, action語法高亮。在Extenxions裏面,輸入msg,安裝Msg Language Support。

參考鏈接:https://blog.csdn.net/MSNH2012/article/details/100512253

創建工作空間及功能包

工作空間

  1. 如果已經有工作空間,可以通過打開文件夾選項進行打開。
  2. 如果要新建工作空間,可以先創建文件夾輸入文件夾名稱,例如:test,點擊確定。
  3. 然後再創建文件夾src.
  4. 點擊"終端"–>“新建終端”,在終端中輸入"catkin_make",系統會自動在test文件夾下創建 “build”, "devel"文件夾和其他配置文件。

新建工作空間時,會在test目錄下自動生成一個.vscode文件夾,其內自動有2個.json文件。c_cpp_properties.jsonsetting.json
如果沒有生成,重啓vscode試試。
或者通過按Ctrl + Shift + P,輸入c/c++: edit configurations(JSON), 手動生成.

另外,記得把新建的工作空間source一下。
查看工作空間情況

$ echo $ROS_PACKAGE_PATH

功能包

右鍵點擊"src"文件夾,右鍵彈出選項中,點擊"Create Catkin Package",輸入包的名稱ros_test,按Enter確認,輸入包的依賴“std_msgs roscpp”,空格隔開,按Enter確認。系統自動創建CMakeLists.txt及package.xml文件。
也可通過按Ctrl + Shift + P,輸入ros:Create Catkin Package配置功能包。

注:沒有在創建工作空間時的兩個.json文件,是無法生成功能包的。可能會沒反應或報錯如下:

命令"ROS: Create Catkin Package"導致錯誤 (command ‘ros.createCatkinPackage’……

運行節點

  1. 啓動roscore:通過按Ctrl + Shift + P,輸入ros:start core啓動roscore。
  2. 運行節點:通過按Ctrl + Shift + P,輸入ros:run a rose executable,依次輸入對應的package及節點,參數。或者直接下終端rosrun ………………

斷點調試配置

在未配置過調試前,沒有launch.json文件。通過Ctrl + Shift + D,下拉添加配置,自動生成該文件。斷點調試有如下幾種方式,這裏主要講c/c++ gdb啓動

c/c++ gdb啓動

先說一下,使用這種調試方法,不需要先運行節點。
該方式會生成launch.json:

        {
            "name": "(gdb) 啓動",
            "type": "cppdbg",
            "request": "launch",
            "program": "輸入程序名稱,例如 ${workspaceFolder}/a.out",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "爲 gdb 啓用整齊打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }

需要修改其中program爲需要調試的可執行程序。更改爲編譯後的可執行文件的路徑下的文件(需要二進制文件),對應ROS通過catkin_make生產可執行文件的路徑通常在 /devel/lib/ 下,後面跟上你設置好的package名和可執行文件名例如:

"program": "${workspaceFolder}/devel/lib/ros_test/talker"

需要注意,有些教程用了${workspaceRoot}/devel/lib/ros_test/talker, 自己看哪個可行。

另外,這裏的"request": "launch",系統也提示我可以用"request": "attach"模式,但是我變成attach後,系統又提示我無法識別了。。

然後:

  1. 啓動roscore:通過按Ctrl + Shift + P,輸入ros:start core啓動roscore。
  2. 設置斷點,運行調試
  3. 如果系統像沒有斷點一樣運行,需要配置一下。在CMakeLists.txt中,project後添加參數SET(CMAKE_BUILD_TYPE Debug),然後重新catkin_make:
cmake_minimum_required(VERSION 2.8.3)
project(ros_test)

SET(CMAKE_BUILD_TYPE Debug)

或者是catkin_make在編譯功能包時,添加catkin_make的參數

$ catkin_make -DCMAKE_BUILD_TYPE=Debug

如果工作空間下由多個功能包,可以在編譯時添加-DCATKIN_WHITELIST_PACKAGES編譯指定功能包

$ catkin_make -DCMAKE_BUILD_TYPE=Debug -DCATKIN_WHITELIST_PACKAGES="package1;package2"

另外,如果開始斷點調試時,出現報錯:

poll failed with error Interrupted system call

解決方法是:
打開~/.gdbinit(如果沒有這個文件則自己新建一個同名文檔),然後添加一下三行即可。

set target-async 1
set pagination off
set non-stop on

該報錯參考鏈接:
https://blog.csdn.net/ABC_ORANGE/article/details/102665792

ros_attach調試方法

attach調試方法的優勢
https://blog.csdn.net/hello_crayon/article/details/40350291

參考鏈接:
https://blog.csdn.net/Kalenee/article/details/103828448

  1. 新建configuration設置. 通過添加配置,在.vscode的launch.josn中添加ROS: Attach
  2. 編譯程序(生成類型必須爲RelWithDebInfo)。在CMakeLists.txt中,project後添加參數SET(CMAKE_BUILD_TYPE RelWithDebInfo)
  3. 通過按Ctrl + Shift + P,輸入>ros::run運行節點程序(也可以手動運行,需要加載環境)
  4. 運行ROS:Attach,選擇運行程序(選擇c++/python,及節點名稱)進入斷點調試模式。可能有個需要有個確認及授權。

我在這裏運行時,還是會出現’poll failed with error Interrupted system call’,但是不影響調試。
另外就是,我這裏變量顯示的不太正常。但上面那種方式就沒問題。

注意,使用這種方法,就不需要launch.json的配置了。

多文件調試ros_launch

參考鏈接:
https://blog.csdn.net/Kalenee/article/details/103828448

  1. 創建launch文件,調用調試的節點
  2. 在.vscode的launch.josn添加ROS: Launch,"target"設置爲launch文件的絕對路徑。可右鍵launch文件,獲得其文件路徑。
  3. 運行ROS:Launch,選擇運行程序進入斷點調試模式

另外,查到一個比較官方的方法介紹,有興趣的可以看一下:
http://www.lib4dev.in/info/MrGnomes/VS_Code_ROS/186882206#3-intellisense
其中還對c_cpp_properties.json裏的includePath做了介紹。

.json文件介紹

在我的使用中,一共用到了三個.json文件:
c_cpp_properties.json、setting.json、launch.json
其中,

  1. c_cpp_properties.json主要是includePath參數,當有自定義頭文件時,需要在其內添加。
  2. setting.json主要是ROS使用python編程,python相關配置,以及其它配置。我這裏沒有做出改動。
  3. launch.json是在配置調試模式時需要的,C++ 啓動模式下,需要更改program參數;ros_launch模式下,需要更改target參數。
  4. 另外,其他教程中由task.json,我這裏並未使用。可能是因爲我都是手動catkin_make

參考鏈接:
https://blog.csdn.net/weixin_35695879/article/details/85254422
https://blog.csdn.net/MSNH2012/article/details/100567640
https://blog.csdn.net/ABC_ORANGE/article/details/102665792
https://code.visualstudio.com/docs/cpp/config-linux

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