需要先构建工作空间,后面才是解决办法(可以直接跳到第六部分)。
一、新建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部分代码进行补全了。
版权归原作者 Kingzhy666 所有, 如有侵权,请联系我们删除。