使用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一下。
查看工作空间情况

1
$ 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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        {
            "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名和可执行文件名例如:

1
"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:
1
2
3
4
cmake_minimum_required(VERSION 2.8.3)
project(ros_test)

SET(CMAKE_BUILD_TYPE Debug)

或者是catkin_make在编译功能包时,添加catkin_make的参数

1
$ catkin_make -DCMAKE_BUILD_TYPE=Debug

如果工作空间下由多个功能包,可以在编译时添加-DCATKIN_WHITELIST_PACKAGES编译指定功能包

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

另外,如果开始断点调试时,出现报错:

poll failed with error Interrupted system call

解决方法是:
打开~/.gdbinit(如果没有这个文件则自己新建一个同名文档),然后添加一下三行即可。

1
2
3
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