1 vscode安装
- 下载ubuntu对应的vscode(deb版本)
- 双击deb包,输入系统密码即可完成安装
2 vscode相关插件安装
安装下图中的插件,有助于ROS程序的开发
3 ros工程的创建
1.打开工作空间
在ROS工作空间根目录下打开终端,输入code .
打开vscode,打开vscode后会发现一个空的工程
2 创建src文件夹
在ROS-TEST-TEST下创建src文件夹
3 编译工作空间
在terminal下打开一个新的终端,输入catkin-make
,然后就会自动生成devel和build文件夹
打开系统终端输入如下指令,配置当前ROS工程的环境变量
echo "source xxx/ros-test-test/devel/setup.bash">>~/.bashrc #此处xxx代表你的保存文件夹的路径
source ~/.bashrc
检测配置是否成功,输入下面的指令,按回车,成功会显示我们创建的这个ROS工作路径, 如果不成功,请仔细检查输入的指令。
echo $ROS_PACKAGE_PATH
4 生成json配置文件
按ctrl+shift+p
输入c/c++: edit configurations(JSON)
即可创建出c_cpp_properties.json文件。
5 创建功能包
右键点击src文件夹,右键弹出选项中,点击"Create Catkin Package",输入包的名称test,按Enter确认,输入包的依赖“std_msgs roscpp”,空格隔开,按Enter确认。
6 创建发布者程序
点击test目录下的src文件夹,“右键”–>“新建文件”,输入talker.cpp,双击打开,粘贴以下代码。
#include <iostream>
#include "ros/ros.h"
#include "std_msgs/String.h"
int main(int argc, char **argv)
{
//ros节点初始化 "talker"节点名称,在ROS里同一时间不允许出现两个
ros::init(argc,argv,"talker");
//创建节点句柄
ros::NodeHandle h;
//创建一个publisher, topic:chatter,消息类型std_msgs::String
ros::Publisher chatter_pub = h.advertise<std_msgs::String>("chatter",1000); // "chatter"话题名称,消息缓存
//设置单循环的频率
ros::Rate looprate(10);
while (ros::ok())
{
std_msgs::String msg;
std::stringstream ss;
ss<<"hello world";
msg.data = ss.str();
//发布消息
ROS_INFO("%s",msg.data.c_str());
chatter_pub.publish(msg);
//等待回调函数
ros::spinOnce();
//按照之前设定的进行循环
looprate.sleep();
}
}
7 创建订阅者程序
点击test目录下的src文件夹,“右键”–>“新建文件”,输入listener.cpp,双击打开,粘贴以下代码。
#include <iostream>
#include "ros/ros.h"
#include "std_msgs/String.h"
void chatterCallBack(const std_msgs::String::ConstPtr &msg)
{
ROS_INFO("I get: [%s}",msg->data.c_str());
}
int main(int argc, char **argv)
{
//ros节点初始化 "listener"节点名称,在ROS里同一时间不允许出现两个
ros::init(argc,argv,"listener");
//创建节点句柄
ros::NodeHandle h;
//创建一个subscriber, topic:chatter,消息类型std_msgs::String, 接收到消息,响应chatterCallBack
ros::Subscriber listener_sub = h.subscribe<std_msgs::String>("chatter",1000,chatterCallBack);
//循环等待回调函数
ros::spin();
return 0;
}
注意:创建这两个程序后,会发现在include处有波浪线,不要慌,下面我们就来解决这个问题
8 配置cmakelists文件
在test目录下,双击"CMakeLists.txt",在文件末尾添加:
add_executable(talker src/talker.cpp) #可执行文件
target_link_libraries(talker ${catkin_LIBRARIES})#链接库
add_dependencies(talker ${PROJECT_NAME}_generate_messages_cpp) #设置依赖
add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
add_dependencies(listener ${PROJECT_NAME}_generate_messages_cpp)
9 编译工作空间
在terminal中打开一个新的终端输入``,然后会得到如下图片
这时候不要慌,然后打开之前生成的c_cpp_properties.json文件,在configurations中添加"compileCommands": "${workspaceFolder}/build/compile_commands.json"
,注意在这句话上面需要添加一个逗号
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "gnu11",
"cppStandard": "c++17",
"intelliSenseMode": "clang-x64",
"compileCommands": "${workspaceFolder}/build/compile_commands.json"
}
],
"version": 4
}
再次编译工作空间就会成功了
10 运行节点看一下结果
-
打开系统终端,输入
roscore
,打开ROS总节点 -
再打开一个系统终端,输入如下指令:
cd ros-test-test rosrun test talker
-
再打开一个系统终端,输入如下指令:
cd ros-test-test rosrun test listener
结果如下:
4 添加头文件的方法
4.1 非工作区头文件的添加
Ctrl+Shift+P 。选择c_cpp_properties.json,includePath和browse中都需要添加需要的头文件路径;这个没试过好不好使在哪个博客上看到的忘记了
4.2 工作区自己写的头文件的添加
在c_cpp_properties.json中的includePath加入自己的头文件的路径即可。并在cpp文件中#include该文件,注意include的是相对当前cpp文件的相对路径。#include "../head/test.h"
,根据当前工程文件结构决定。"/home/zero/ros-test-test/src/test/src/**",
这个是自己工程下自己创建的功能包的路径
{
"configurations": [
{
"browse": {
"databaseFilename": "",
"limitSymbolsToIncludedHeaders": true
},
"includePath": [
"/home/zero/catkin_ws/devel/include/**",
"/opt/ros/kinetic/include/**",
"/home/zero/ros-test-test/src/test/src/**",
"/usr/include/**",
"/opt/ros/kinetic/include"
],
"name": "ROS",
"intelliSenseMode": "gcc-x64",
"compilerPath": "/usr/bin/gcc",
"cStandard": "gnu11",
"cppStandard": "c++17",
"compileCommands": "${workspaceFolder}/build/compile_commands.json"
}
],
"version": 4
}
5 BUG
在使用vscode开发ROS的过程中,遇到了程序只是改一个数据,就不能编译通过了,这时候重启一下vscode可能就会好了。或者重启一下电脑。
我是先使用了一下catkin_make clean 然后没好使,然后重启了一下vscode就好了,不知道使用那个clean起没起作用。
6 杂项
在配置c_cpp_properties.json文件时,发现我的json文件中cstandard是gnu11而我在别人博客看到的是c11,所以查了一下两者的区别。
gnu11:带gnu c扩展的c11标准,如果你的代码包含了typeof,__attribute__等等gnu的扩展,就必须用这个。