仅记录自己的学习过程

1.创建ROS工作空间demo01

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

2.启动VScode

cd demo01

code .

3.VScode中编译ROS

ctrl+shift+B 选择catkin_make:build

点击小齿轮符号设置,生成.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"
         }
     ]
 }


4.创建ROS功能包

选定 src 右击 ---> create catkin package

自定义包名,如test01_hello,添加依赖,如roscpp,rospy,std_msgs,turtlesim...

5.C++实现基本通信--编写发布订阅实现

编写发布订阅实现,要求发布方以10HZ(每秒10次)的频率发布文本消息,订阅方订阅消息并将消息内容打印输出。

5.1在功能包的src下新建.cpp文件

5.2发布方

/*

    消息发布方:
        循环发布信息:HelloWorld 后缀数字编号

    实现流程:
        1.包含头文件 
        2.初始化 ROS 节点:命名(唯一)
        3.实例化 ROS 句柄
        4.实例化 发布者 对象
        5.组织被发布的数据,并编写逻辑发布数据

*/
// 1.包含头文件 
#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,"talker");
    //3.实例化 ROS 句柄
    ros::NodeHandle nh;//该类封装了 ROS 中的一些常用功能

    //4.实例化 发布者 对象
    //泛型: 发布的消息类型
    //参数1: 要发布到的话题
    //参数2: 队列中最大保存的消息数,超出此阀值时,先进的先销毁(时间早的先销毁)
    ros::Publisher pub = nh.advertise<std_msgs::String>("chatter",10);

    //5.组织被发布的数据,并编写逻辑发布数据
    std_msgs::String msg;
    // msg.data = "你好啊!!!";
    std::string msg_front = "Hello 你好!"; //消息前缀
    int count = 0; //消息计数器

    //逻辑(一秒10次)
    ros::Rate r(1);

    //节点不死
    while (ros::ok())
    {
        //使用 stringstream 拼接字符串与编号
        std::stringstream ss;
        ss << msg_front << count;
        msg.data = ss.str();
        //发布消息
        pub.publish(msg);
        //加入调试,打印发送的消息
        ROS_INFO("发送的消息:%s",msg.data.c_str());

        //根据前面制定的发送贫频率自动休眠 休眠时间 = 1/频率;
        r.sleep();
        count++;//循环结束前,让 count 自增
        //暂无应用
        ros::spinOnce();
    }


    return 0;
}

5.3订阅方

/*

    消息订阅方:
        订阅话题并打印接收到的消息

    实现流程:
        1.包含头文件 
        2.初始化 ROS 节点:命名(唯一)
        3.实例化 ROS 句柄
        4.实例化 订阅者 对象
        5.处理订阅的消息(回调函数)
        6.设置循环调用回调函数

*/
// 1.包含头文件 
#include "ros/ros.h"
#include "std_msgs/String.h"

void doMsg(const std_msgs::String::ConstPtr& msg_p){
    ROS_INFO("我听见:%s",msg_p->data.c_str());
    // ROS_INFO("我听见:%s",(*msg_p).data.c_str());
}

int main(int argc, char  *argv[])
{
    setlocale(LC_ALL,"");
    //2.初始化 ROS 节点:命名(唯一)
    ros::init(argc,argv,"listener");
    //3.实例化 ROS 句柄
    ros::NodeHandle nh;

    //4.实例化 订阅者 对象
    ros::Subscriber sub = nh.subscribe<std_msgs::String>("chatter",10,doMsg);
    //5.处理订阅的消息(回调函数)

    //6.设置循环调用回调函数
    ros::spin();//循环读取接收的数据,并调用回调函数处理

    return 0;
}

5.4配置CMakelist.txt

(137行) add_excuteable(节点名称一般与cpp文件名相同 src/xxx.cpp)

(148行) add_dependence(节点名 xxxx......)

(151行) target_link_libraries( 节点名  ...)去掉注释

6.执行c++文件 ctrl+shift+B

7.打开terminator右键垂直分屏

先启动roscore, 下一块终端启动 rosrun 包名如turtlesim 节点名

第三块终端:

cd 工作空间demo01

source ./devel/setup.bash

rosrun 包名test01_hello 节点名