本文旨在引导大家使用vscode快速建立一个调试环境,并真正学会用vscode调试ROS-c/c++程序。碰到任何问题,欢迎在下面留言,我会随时补充。
如果英文好的话,可以去这里看英文原版的调试入门介绍,作者写得很细。我这里就不重复造轮子了,为了让大家以最快的速度上手,只把关键几步的信息记录下来,供大家参考。
这里假设你已经安装好了ROS noetic和git。
ubuntu上如何安装vscode可以参考官网,
Running Visual Studio Code on Linux
需要安装的vscode扩展如下,
你可以单独安装,也可以在下载完下面的项目后,加载时会问你是否要添加这些依赖时安装;我主要安装了ROS,c/c++, CMake这3个。
创建文件夹,比如我的路径为
$cd ~/studyslam/ws/src
$git clone https://github.com/RoboGnome/VS_Code_ROS.git
这时候你可以用你的vscode打开程序文件夹了
~/studyslam/ws
注意这个是你的主工程目录文件,当然如果你想更直接点打开下面这个目录也是可以的,设置大同小异,
~/studyslam/ws/src/VS_Code_ROS/hello_vs_code
但我们这里都以打开“~/studyslam/ws”这个目录为准进行讲解,目录结构如下图所示,
接下来你要配置几个文件,你可以使用Ctrl+Shift+P输入task:config task等这种类型的方式,也可以直接手动添加,准备好下面这个几文件,
c_cpp_properties.json
快捷键ctrl+shift+p,找到C/C++ :Edit configurations (JSON),添加c_cppproperties.json文件,这个文件应该是指定一些路径和语言标准
{
"configurations": [
{
"browse": {
"databaseFilename": "${workspaceFolder}/.vscode/browse.vc.db",
"limitSymbolsToIncludedHeaders": false
},
"includePath": [
"/opt/ros/noetic/include/**",
"/home/matthew/studyslam/ws/src/beginner_tutorials/include/**",
"/home/matthew/projects/vinsmono/src/VINS-Mono/camera_model/include/**",
"/usr/include/**"
],
"name": "ROS",
"intelliSenseMode": "gcc-x64",
"compilerPath": "/usr/bin/gcc",
"cStandard": "gnu11",
"cppStandard": "c++14",
"compileCommands": "${workspaceFolder}/build/compile_commands.json"
}
],
"version": 4
}
tasks.json
快捷键ctrl+shift+p,找到Tasks:Configure Task,添加tasks.json文件,这个文件指定一些catkin_make的编译参数。
注意这里的定义"-DCMAKE_BUILD_TYPE=Debug",
{
"version": "2.0.0",
"tasks": [
{
"type": "catkin_make",
"args": [
"--directory",
"/home/matthew/studyslam/ws",
"-DCMAKE_BUILD_TYPE=Debug"
],
"problemMatcher": [
"$catkin-gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"label": "catkin_make: build"
}
]
}
launch.json
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Talker_Node",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/devel/lib/hello_vs_code/vs_talker",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
},
{
"name": "Listener_Node",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/devel/lib/hello_vs_code/vs_listener",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
},
{
"name": "Listener2_Node",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/devel/lib/hello_vs_code/vs_listener2",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
],
"compounds": [
{
"name": "Talker/Listener",
"configurations": ["Talker_Node", "Listener_Node"]
}
],
}
注意这里launch.json里启动了三个节点,同时还有一个compound,写完这个之后,你可以在你的vscode下拉框中看到这几个选项,如下图所示,
比如我要同时调试vs_talker和vs_listener,就选了talker/listener那个选项,对应的就是launch.json中的compounds那个。
然后,就可以在talker.cpp和listener.cpp中打断点进行单步调试了。
launch.json中的节点个数主要取决于你想调试哪些节点,比如当我只想调试talker的时候,我的launch.json是这个样子的,
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/devel/lib/hello_vs_code/vs_talker",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
],
}
这时候的vscode下拉菜单中的名称就只有一个“(gdb) Launch”了。
启动调试后,会有两个terminal窗口出现,对应这两个线程;此时会出现一个报错,原因是roscore没有启动。在vscode中打开第三个terminal,输入"roscore"启动之后,这两个线程就可以正常工作了。
vscode调试的结果相当于运动下面的程序
终端1:
$ source devel/setup.bash
$ roscore
终端2:
$ source devel/setup.bash
$ rosrun hello_vs_code vs_talker
终端3:
$ source devel/setup.bash
$ rosrun hello_vs_code vs_listener
当然,这些生成的程序本身都是可执行程序,你也可以直接这样运行
终端1:
source devel/setup.bash
~/studyslam/ws$ ./vs_talker
终端2:
source devel/setup.bash
cd devel/lib/hello_vs_code
~/studyslam/ws/devel/lib/hello_vs_code$ ./vs_talker
终端3:
source devel/setup.bash
cd devel/lib/hello_vs_code
~/studyslam/ws/devel/lib/hello_vs_code$ ./vs_listener
Ubuntu下没有找到好的gif录屏软件(如果哪位知道,请告诉我),所以只好录制了一小段视频,但因为这里没法直接发视频,所以又只能另行上传,下载地址参考:
Ubuntu20.04+vscode快速调试ROS通用程序-其它文档类资源-CSDN下载
本文结束
参考资料:
GitHub - RoboGnome/VS_Code_ROS: Step by Step Guide to Automate Your ROS Workflow in the VS Code IDE
https://github.com/ms-iot/vscode-ros/blob/master/doc/debug-support.md