VSCode中調試ROS

  • 在vscode中調試ros程序
  • 1. 相关插件安装
  • 2. 导入或者新建工作空间
  • 2.1 导入工作空间
  • 2.2 新建工作空间
  • 通过命令行新建
  • 通过vscode新建
  • 3. 环境配置
  • 3.1 代码智能提示
  • 4. vscode中编译ros
  • 5. 运行节点
  • 5.1 方法一:利用vscode运行
  • 5.2 方法二:利用命令行
  • 6. 调试
  • 6.1 单程序调试
  • ROS: Attach模式
  • 6.2 多程序/多node调试,launch文件调试
  • 7 配置 include 文件
  • 8. issue


在vscode中調試ros程序

原文鏈接 https://zhuanlan.zhihu.com/p/364972107

1. 相关插件安装

1.ROS插件。
2. C++ 配置:安装c/c++C++ Intellisense 这两个插件。
配置 CMakeLists.txt 文件语法高亮。在 Extenxions 里面,输入 txt ,安装 Txt Syntax
配置 msg, srv, action语法高亮。在Extenxions里面,输入msg,安装Msg Language Support

2. 导入或者新建工作空间

2.1 导入工作空间

直接在vscode中打开之前已建好的workspace文件夹。

2.2 新建工作空间

通过命令行新建
  • 新建文件夹 mkdir p /src
  • 然后编译catkin_make,系统会自动在test文件夹下创建 “build” , “devel” 文件夹和其他配置文件。
通过vscode新建
  • 新建文件夹 mkdir p /src ,(或通过vscode新建文件夹)
    快捷键ctrl+shif+p,然后输入catkin_make,选择ROS Create Catkin Package
  • 在新建工作空间时,会在工作空间根目录下自动生成一 个 .vscode 文件夹,其内自动有2个 .json 文件。c_cpp_properties.jsonsetting.json 。如果没有生成,重启vscode试试。或者通过按Ctrl + Shift + P,输入c/c++: edit configurations(JSON), 手动生成。

3. 环境配置

3.1 代码智能提示

编译输出信息文件,执行: catkin_make -DCMAKE_EXPORT_COMPILE_COMMANDS=Yes 这个命令会输出一个compile_commands.json 文件在ROS 工作空间的build 文件夹下面
添加以下信息文件到c_cpp_properties.json 文件中的相应位置:

"name": "ROS",
 "intelliSenseMode": "gcc-x64",
 "compilerPath": "/usr/bin/g++",
 "cStandard": "c11",
 "cppStandard": "c++11",
 "compileCommands": "${workspaceFolder}/build/compile_commands.json"

其中部分内容也可以按照个人习惯替换,如:

"compilerPath": "/usr/bin/gcc",
  "cStandard": "c11",
  "cppStandard": "c++17",
  "intelliSenseMode": "clang-x64",

注意:若无代码提示显示,使用Ctrl+space。 就基本可以找到全部头文件了,然后就可以使用代码提示来码代码了。

4. vscode中编译ros

重要提示:一定要确保 CMakeList.txt#set(CMAKE_BUILD_TYPE Release) 这句有的话被注释掉,否则即使在编译的时候即使设置了 -DCMAKE_BUILD_TYPE=Debug ,调试时一样会无法进入断点。

Ctrl+Shift+P,然后键入tasks: Configure Task,
选择catkin_make:build,会在 .vscode 文件夹下自动生成文件 task.json
然后Ctrl+Shift+B就可以编译(其实默认使用的是catkin_make

自动生成的内容如下:

{
  "version": "2.0.0",
  "tasks": [
    {
      "type": "catkin_make",
      "args": [
        "--directory",
        "/home/lyh/MyFiles/Codes/catkin_ws"
      ],
      "problemMatcher": [
        "$catkin-gcc"
      ],
      "group": "build", //代表将我们定义的这个task添加到build组里面,这样就可以中Ctrl+Shift+B快捷键来找到编译命令
      "label": "catkin_make: build" //代表提示的描述性信息(该组命令的名称)
    }
  ]
}

另外还可以添加其他一些使用的参数,例如:“group”: {“kind”:“build”,“isDefault”:true},“isDefault”:true 代表直接执行command ,如果为false 还需要在build 下拉里面选一下;及其他catkin_make命令后加的变量参数。简单例子:

{
  "version": "2.0.0",
  "tasks": [
    {
      "type": "catkin_make",
      "args": [
        "--directory",
        "/home/lyh/MyFiles/Codes/catkin_ws",
        "-j4", //使用4个线程编译
        "-DCMAKE_BUILD_TYPE=Debug",
        "-DCATKIN_WHITELIST_PACKAGES=<package_name>"
      ],
      "problemMatcher": [
        "$catkin-gcc"
      ],
      "group": {
        "kind":"build",
        "isDefault":true
        },
      "label": "catkin_make: build"
    }
  ]
}

注意:利用ctrl + shif + b快捷键编译,或者点击Terminal-> Run Build Task 编译前,需要将所需编译包所在的 workspace 的文件夹放到 vscode workspace 的第一位,否则无法选择到需要编译的包。

5. 运行节点

5.1 方法一:利用vscode运行

  • 启动 roscore : 通过按Ctrl + Shift + P,输入ros:start core启动roscore
  • 运行节点: 通过按Ctrl + Shift + P,输入ros:run a rose executable,依次输入对应的 package 及节点,参数。

5.2 方法二:利用命令行

利用 vscode 步骤太多了,推荐使用命令行。直接在 终端rosrun <package> <node>

6. 调试

6.1 单程序调试

ROS: Attach模式

单程序常用的是 attach 模式,设置如下:

新建配置:依次点击图中图标,然后选择 ROS , ROS: Attach ,便会在 .vscode 文件夹下自动生成 launch.json 文件(或通过Ctrl + Shift + D,下拉添加配置,自动生成该文件)。

ubuntu2004 ros VScode设置默认python环境 vscode配置ros_工作空间


其默认配置如下:

{
    // 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": "ROS: Attach", //调试配置的名称,此处为ROS: Attach
            "request": "attach",
            "type": "ros"
        }
    ]
 }

也可以通过点击右下方的 Add configuration 按钮添加:

编译程序(确保生成类型为 RelWithDebInfo 或者 Debug ):在 Cmakelists.txt 中添加 SET(CMAKE_BUILD_TYPE “RelWithDebInfo”) 或者在 task.jsonargs 中添加"-DCMAKE_BUILD_TYPE=RelWithDebInfo"。(有些博文说必须是 RelWithDebInfo ,但是 ROS插件 的官网说用 debug 模式也可以 Use tasks to automatically build before starting debug session,亲测两个都可以)。

调试C++:先设置断点,然后运行节点,然后运行 ROS: Attach 配置

GDB调试

设置编译模式为 debug ,配置 launch 文件如下:

{
    "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
                }
            ]
        }
    ]
}

值得一提的是,如果节点运行参数,可以在 rosrun 运行节点时在几点后加上并运行;需要输入大量的参数,可编写 yaml 文件,然后 rosparam load <your_yaml_file> <namespace>,如 rosparam load test_name.yaml /workspace

6.2 多程序/多node调试,launch文件调试

创建 launch 文件:新建 launch 文件夹,在其中添加 launch 文件。

<launch>
    <node name="talker" pkg="beginner_tutorials" type="talker" output="screen" />
    <node name="listener" pkg="beginner_tutorials" type="listener" output="screen" />
  </launch>

.vscode 文件夹中的 launch.josn 添加 ROS: Launch 配置,其中 “target” 设置为 launch 文件的绝对路径,新的配置如下(包含 ROS: Attach ):

{
    // 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": "ROS: Launch",
            "type": "ros",
            "request": "launch",
            "target": "/home/lyh/MyFiles/Codes/catkin_ws/src/beginner_tutorials/launch/launch_debug_test.launch"
        },        
        {
            "name": "ROS: Attach",
            "request": "attach",
            "type": "ros"
        }
    ]
}

其他运行及调试方法与 ROS: Attach 类似

整个过程中涉及到了4个 json 文件:

  • c_cpp_properties.json,主要是 includePath 参数,当有自定义头文件时,需要在其内添加。
  • setting.json,主要是 ROS 使用 python 编程, python 相关配置,以及其它配置。如果是使用 C++ 无需改动。
  • launch.json,是在配置调试模式时需要的,C++ 启动模式下,需要更改 program 参数;ros_launch 模式下,需要更改 target 参-
  • task.json,编译相关,如果采用命令行编译可以忽略。

7 配置 include 文件



使用vscode进行c++代码编写时,配置代码includePath能够提供函数跳转,自动补全以及报错等帮助。由于有些库的路径不太好找且逐条添加到vscode中过于繁琐,本处介绍使用cmake导出json的方式介绍配置vscode环境(适用于CMakeLists.txt编译方式)。

catkin_make -DCMAKE_EXPORT_COMPILE_COMMANDS=YES

8. issue

若无代码提示显示,使用 Ctrl+space (如不行,执行下面括号内容) (编辑 workspace.vscode 文件夹中的 c_cpp_properties.json 文件,在 "name": "ROS",下添加 intelliSenseMode": "gcc-x64"