1.创建工作空间
mkdir -p test_ws/src //创建文件夹 (必须得有 src) ,也可以鼠标点击来创建
cd test_ws //移动到目录下
catkin_make //进行编译
2.启动VSCode
进入 test_ws 启动 vscode
cd test_ws
code .
安装好VSCode的前提下 终端输入code .自动在该目录下运行VSCode
3. 配置vscode 编译 ros
快捷键 **ctrl + shift + B** 调用编译,选择:`catkin_make:build`
可以点击配置(小齿轮),修改.vscode/tasks.json 文件
工程下自动生成.vscode文件夹 其下有如下tasks.json文件
用下面代码进行替换:
{
// 有关 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"
}
]
}
src右键没有Create Catkin Package的小伙伴自觉去安装ros拓展,如下:
弹出小窗里输入package名字 enter
4. 功能包下 C++ 的实现
在cpp文件中加入内容:
/*
发布方实现
1.包含头文件;
2.初始化 ROS 节点
3.创建节点句柄
4.创roscore建发布者对象
5.编写发布逻辑并发布数据
*/
//ros里的文本类型——————>std_msgs/String.h
//1.包含头文件;
#include"ros/ros.h" //包含了标准ROS类的声明
#include"std_msgs/String.h" //文本被封装成单独的数据类型了std_msgs功能包里的string.h
#include<sstream> //支持字符串的流输入输出
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");//防止乱码
//2.初始化 ROS 节点
ros::init(argc,argv,"talker");//定义了解
// 3.创建节点句柄
ros::NodeHandle nh;//相当于一个重命名 NodeHandle = nh
//4.创建发布者对象
ros::Publisher pub = nh.advertise<std_msgs::String>("chatter",10);
//5.编写发布逻辑并发布数据
//要求以10hz的频率发布,文本后添加编号
//先创建被发布的消息
std_msgs::String msg;//创建一个名为msg,在std_msgs/String里
//发布频率
ros::Rate rate(10);
//设置编号
int count = 0;//定义一个int数据类型的count
//编写循环,循环中发布数据
while (ros::ok())
{
count++;
//msg.data = "hello";消息内容为hello
//实现字符串拼接数字,https://blog.csdn.net/shs1992shs/article/details/83051298
std::stringstream ss;//因为是字符串与数字的组合,所以需要字符串流stringstream
ss << "hello ---> " <<count;//C++中"<<“叫做插入运算符,第一个相当于把右边赋值给左边,第二紧接其后也一样。
msg.data = ss.str(); //把流里面的变成字符串给msg.data,我们之前定义的消息是字符串string,所以要用到stringstream里的str
pub.publish(msg);//用这个发布者对象发布消息,看定义,也和我们之前的创建发布者那边有关,他只能发布string的
//添加日志
ROS_INFO("发布的数据是:%s",ss.str().c_str());//%s表示字符串
rate.sleep();
}
return 0;
}
为了使编译器能够成功使用ros里的函数补齐提示,需要以下操作:
可能是ubuntu和ros的版本不同,没有cppstandard的可以自己加上这一行:并改成c++17
5. 配置 CMakeLists.txt文件(C++)
在src路径下自动生成了一个CMakeLists.txt文件,但是我不需要这个,于是就删掉了,在工程路径下建立一个CMakeLists.txt 内容如下
cmake_minimum_required(VERSION 3.0.2)
project(helloros)
find_package(catkin REQUIRED COMPONENTS message_generation roscpp sensor_msgs std_msgs geometry_msgs)
# catkin_package(
# CATKIN_DEPENDS
# )
find_package(catkin REQUIRED COMPONENTS
roscpp
)
include_directories(include ${catkin_INCLUDE_DIRS} )
add_executable(helloros
src/helloros.cpp
)
add_dependencies(helloros ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(helloros
${catkin_LIBRARIES}
)
6. 编译执行
$ cd build
$ cmake ..
$ make //我自己生成的可执行文件直接在build下面
$ ./helloros
运行:
//在一个终端运行
roscore
//在一个新的终端运行
source ./devel/setup.bash //添加环境变量
rosrun hello_ros_package helloros //运行,格式 rosrun 功能包的名字 可执行的节点
版权声明:本文为qq_35297051原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。