0


解决Ubuntu20.24中Vscode无法自动补全ROS相关代码

需要先构建工作空间,后面才是解决办法(可以直接跳到第六部分)。

一、新建ROS工作空间

在桌面ctrl+alt+T打开终端。

输入下面代码:

mkdir -p demo06_ws/src(必须得有 src)
cd demo06_ws
catkin_make

创建成功如下图:

二、进入Vscode

因为已经进入demo06_ws工作目录了,直接code .就行。注意code和.中间有个空格。

三、添加ROS配置

目前这里并没有.vscode文件夹,我们需要添加才能进行ROS编译。

可以看到已经出现了.vscode文件

接着快捷键ctrl + shift + B调用编译,选择红框

随后生成下图文件

修改task.json文件,直接复制下面代码过去替换即可,记得ctrl + s保存。

{
    // 有关 tasks.json 格式的文档,请参见
        // https://go.microsoft.com/fwlink/?LinkId=733558
        "version": "2.0.0",
        "tasks": [
            {
                "label": "catkin_make:debug", //代表提示的描述性信息
                "type": "shell",  //可以选择shell或者process,如果是shell代码是在shell里面运行一个命令,如果是process代表作为一个进程来运行
                "command": "catkin_make",//这个是我们需要运行的命令
                "args": [],//如果需要在命令后面加一些后缀,可以写在这里,比如-DCATKIN_WHITELIST_PACKAGES=“pac1;pac2”
                "group": {"kind":"build","isDefault":true},
                "presentation": {
                    "reveal": "always"//可选always或者silence,代表是否输出信息
                },
                "problemMatcher": "$msCompile"
            }
        ]
    }

四、创建ROS功能包

右键src

然后在功能包的src下新建一个.cpp文件

随后写入代码作为测试,待会会指出问题

代码如下:

#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>

int main(int argc, char *argv[])
{   
    setlocale(LC_ALL,"");
    //2.初始化 ROS 节点
    ros::init(argc,argv,"zhy");
    //3.创建节点句柄
    ros::NodeHandle nh;
    // 4.创建发布者对象
    ros::Publisher pub = nh.advertise<std_msgs::String>("cabbage",10);
    // 5.编写发布逻辑并发布数据
    //先创建被发布的消息
    std_msgs::String msg;
    //发布频率
    ros::Rate rate(0.5);
    //设置编号
    int count = 0;
    //编写循环,循环中发布数据
    while (ros::ok())
    {
        count++;
        // msg.data = "hello";
        // 实现字符串拼接数字
        std::stringstream ss;
        ss << "hello ---> " << count;
        msg.data = ss.str();

        pub.publish(msg);
        //添加日志
        ROS_INFO("发布的数据是:%s",ss.str().c_str());
        rate.sleep();
        ros::spinOnce();//官方建议的
    }
    return 0;
}

五、发现无法补全问题

不难看出红框部分并没有青色,这种情况下vscode并不能帮我们自动补全ROS部分代码,也就是我们需要一个一个敲上去,这太麻烦了。

六、问题解决

首先我们需要回到终端(ctrl + shift + T),进入到自己的工作路径下,我的是demo06_ws

随后输入下面代码:

catkin_make -DCMAKE_EXPORT_COMPILE_COMMANDS=Yes

回车

然后回到 vscode中,我们会发现build目录下多了一个.json文件

内容如下(后期需要可以对比)

[
{
  "directory": "/home/zhy/demo06_ws/build/gtest/googlemock",
  "command": "/usr/bin/c++  -DGTEST_CREATE_SHARED_LIBRARY=1 -Dgmock_main_EXPORTS -isystem /usr/src/googletest/googlemock/include -isystem /usr/src/googletest/googlemock -isystem /usr/src/googletest/googletest/include -isystem /usr/src/googletest/googletest  -O2 -g -DNDEBUG -fPIC   -Wall -Wshadow -Wno-error=dangling-else -DGTEST_HAS_PTHREAD=1 -fexceptions -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -DGTEST_HAS_PTHREAD=1 -std=c++11 -o CMakeFiles/gmock_main.dir/src/gmock_main.cc.o -c /usr/src/googletest/googlemock/src/gmock_main.cc",
  "file": "/usr/src/googletest/googlemock/src/gmock_main.cc"
},
{
  "directory": "/home/zhy/demo06_ws/build/gtest/googlemock",
  "command": "/usr/bin/c++  -DGTEST_CREATE_SHARED_LIBRARY=1 -Dgmock_EXPORTS -I/usr/src/googletest/googlemock/include -I/usr/src/googletest/googlemock -isystem /usr/src/googletest/googletest/include -isystem /usr/src/googletest/googletest  -O2 -g -DNDEBUG -fPIC   -Wall -Wshadow -Wno-error=dangling-else -DGTEST_HAS_PTHREAD=1 -fexceptions -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -DGTEST_HAS_PTHREAD=1 -std=c++11 -o CMakeFiles/gmock.dir/src/gmock-all.cc.o -c /usr/src/googletest/googlemock/src/gmock-all.cc",
  "file": "/usr/src/googletest/googlemock/src/gmock-all.cc"
},
{
  "directory": "/home/zhy/demo06_ws/build/gtest/googletest",
  "command": "/usr/bin/c++  -DGTEST_CREATE_SHARED_LIBRARY=1 -Dgtest_main_EXPORTS -isystem /usr/src/googletest/googletest/include -isystem /usr/src/googletest/googletest  -O2 -g -DNDEBUG -fPIC   -Wall -Wshadow -Wno-error=dangling-else -DGTEST_HAS_PTHREAD=1 -fexceptions -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -DGTEST_HAS_PTHREAD=1 -std=c++11 -o CMakeFiles/gtest_main.dir/src/gtest_main.cc.o -c /usr/src/googletest/googletest/src/gtest_main.cc",
  "file": "/usr/src/googletest/googletest/src/gtest_main.cc"
},
{
  "directory": "/home/zhy/demo06_ws/build/gtest/googletest",
  "command": "/usr/bin/c++  -DGTEST_CREATE_SHARED_LIBRARY=1 -Dgtest_EXPORTS -I/usr/src/googletest/googletest/include -I/usr/src/googletest/googletest  -O2 -g -DNDEBUG -fPIC   -Wall -Wshadow -Wno-error=dangling-else -DGTEST_HAS_PTHREAD=1 -fexceptions -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -std=c++11 -o CMakeFiles/gtest.dir/src/gtest-all.cc.o -c /usr/src/googletest/googletest/src/gtest-all.cc",
  "file": "/usr/src/googletest/googletest/src/gtest-all.cc"
}
]

随后我们需要修改一个.json文件如下图

修改蓝框内容即可

大蓝框内容如下:

"compileCommands": "${workspaceFolder}/build/compile_commands.json"

然后ctrl + s保存,ctrl + shift + B进行编译

随后进入下图文件,进行修改

先将136行的注释去掉,然后修改蓝框内容

去除149-151中的注释并修改蓝框内的内容

然后ctrl + s保存,ctrl + shift + B进行编译

出现上图表示成功配置了

现在回到红框中的.json文件我们发现对了一部分代码

详细内容如下

[
{
  "directory": "/home/zhy/demo06_ws/build/gtest/googlemock",
  "command": "/usr/bin/c++  -DGTEST_CREATE_SHARED_LIBRARY=1 -Dgmock_main_EXPORTS -isystem /usr/src/googletest/googlemock/include -isystem /usr/src/googletest/googlemock -isystem /usr/src/googletest/googletest/include -isystem /usr/src/googletest/googletest  -O2 -g -DNDEBUG -fPIC   -Wall -Wshadow -Wno-error=dangling-else -DGTEST_HAS_PTHREAD=1 -fexceptions -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -DGTEST_HAS_PTHREAD=1 -std=c++11 -o CMakeFiles/gmock_main.dir/src/gmock_main.cc.o -c /usr/src/googletest/googlemock/src/gmock_main.cc",
  "file": "/usr/src/googletest/googlemock/src/gmock_main.cc"
},
{
  "directory": "/home/zhy/demo06_ws/build/gtest/googlemock",
  "command": "/usr/bin/c++  -DGTEST_CREATE_SHARED_LIBRARY=1 -Dgmock_EXPORTS -I/usr/src/googletest/googlemock/include -I/usr/src/googletest/googlemock -isystem /usr/src/googletest/googletest/include -isystem /usr/src/googletest/googletest  -O2 -g -DNDEBUG -fPIC   -Wall -Wshadow -Wno-error=dangling-else -DGTEST_HAS_PTHREAD=1 -fexceptions -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -DGTEST_HAS_PTHREAD=1 -std=c++11 -o CMakeFiles/gmock.dir/src/gmock-all.cc.o -c /usr/src/googletest/googlemock/src/gmock-all.cc",
  "file": "/usr/src/googletest/googlemock/src/gmock-all.cc"
},
{
  "directory": "/home/zhy/demo06_ws/build/gtest/googletest",
  "command": "/usr/bin/c++  -DGTEST_CREATE_SHARED_LIBRARY=1 -Dgtest_main_EXPORTS -isystem /usr/src/googletest/googletest/include -isystem /usr/src/googletest/googletest  -O2 -g -DNDEBUG -fPIC   -Wall -Wshadow -Wno-error=dangling-else -DGTEST_HAS_PTHREAD=1 -fexceptions -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -DGTEST_HAS_PTHREAD=1 -std=c++11 -o CMakeFiles/gtest_main.dir/src/gtest_main.cc.o -c /usr/src/googletest/googletest/src/gtest_main.cc",
  "file": "/usr/src/googletest/googletest/src/gtest_main.cc"
},
{
  "directory": "/home/zhy/demo06_ws/build/gtest/googletest",
  "command": "/usr/bin/c++  -DGTEST_CREATE_SHARED_LIBRARY=1 -Dgtest_EXPORTS -I/usr/src/googletest/googletest/include -I/usr/src/googletest/googletest  -O2 -g -DNDEBUG -fPIC   -Wall -Wshadow -Wno-error=dangling-else -DGTEST_HAS_PTHREAD=1 -fexceptions -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -std=c++11 -o CMakeFiles/gtest.dir/src/gtest-all.cc.o -c /usr/src/googletest/googletest/src/gtest-all.cc",
  "file": "/usr/src/googletest/googletest/src/gtest-all.cc"
},
{
  "directory": "/home/zhy/demo06_ws/build/Test_vscode",
  "command": "/usr/bin/c++  -DROSCONSOLE_BACKEND_LOG4CXX -DROS_BUILD_SHARED_LIBS=1 -DROS_PACKAGE_NAME=\\\"Test_vscode\\\" -I/opt/ros/noetic/include -I/opt/ros/noetic/share/xmlrpcpp/cmake/../../../include/xmlrpcpp  -O2 -g -DNDEBUG   -o CMakeFiles/Test_vscode.dir/src/Test_vscode.cpp.o -c /home/zhy/demo06_ws/src/Test_vscode/src/Test_vscode.cpp",
  "file": "/home/zhy/demo06_ws/src/Test_vscode/src/Test_vscode.cpp"
}
]

可以与刚刚对比看看看,不难发现刚刚是有四个中括号,现在五个了,多了最下面那个!

回到刚刚的测试文件,记得先ctrl + s一次不然vscode可能反应不过来(下图已经保存过一次了)

可以与一开始进行对比,现在红框中已经有青色了,表示能够对ROS部分代码进行补全了。

标签: vscode ide 编辑器

本文转载自: https://blog.csdn.net/Kingzhy666/article/details/142427112
版权归原作者 Kingzhy666 所有, 如有侵权,请联系我们删除。

“解决Ubuntu20.24中Vscode无法自动补全ROS相关代码”的评论:

还没有评论