IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> ROS+VScode 话题通信 发布方&订阅方 -> 正文阅读

[开发工具]ROS+VScode 话题通信 发布方&订阅方

目录

1、建立工作目录

1.1建立文件

1.2VScode内

1.3运行:

1.4查看接受的信息

?2、发送方

2.1文件结构

2.2代码及注释说明

3、订阅方

3.1文件结构

3.2代码及注释说明

4、运行结果


1、建立工作目录

1.1建立文件

mkdir -p ZTest/src
cd ZTest
catkin_make
code.

1.2VScode内

打开VScode利用SSH连接主机到ZTest,对src目录执行:


建立工作包(自己命名),我这里命名的是plumbing_pub_sub


再弹出一个框输入:rospy roscpp std_msgs(依赖包)

1.3运行:

1.3、1.4是第二三部分撰写完毕后再执行的,第二部分建立的文件是demo01_pub.cpp(发送方文件),第三部分建立的是demo02_sub.cpp(接收方文件)

在文件撰写完毕后这样做

修改CMakeLists.txt(135行左右):
add_execytable(文件名(映射名称1) ?文件地址)


target_link_libraries(同文件名(映射名称1)
?{ ?}
)

?

修改完毕后:

先编译:shift+ctrl+b
再添加终端(bash):roscore(运行ros核心,运行一次即可)

再次添加终端(bash):source ?./devel/setup.bash
?? ?rosrun ?包名 文件名(映射名1) ? (eg rosrun plumbing_pub_sub demo02_sub)

1.4查看接受的信息

接受数据打印:
rostopic echo fang//打印键名为fang的信息

?2、发送方

2.1文件结构

2.2代码及注释说明

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

/*
    发布方:
    1、包含头文件
        ROS中文本类型-》std_msgs/String.h
    2、初始化ROS
    3、创建节点句柄
    4、创建发布者对象
    5、编写发布逻辑并发布数据
*/
int main(int argc,char *argv[])
{
    setlocale(LC_ALL,"");//解决中文乱码问题

    //2、初始化ROS节点
    ros::init(argc,argv,"out");//发出
    //3、创建节点句柄
    ros::NodeHandle nh;
    /*
    4、创建发布者对象 
    nh.advertise<M>(string &topic,int32 queue_size);
        M:发布类型
        string:字符串类型,主题,自己定义
        queue_size:消息长度(int32),用于缓冲,是queue类型,多了将前面的挤出
    */
    ros::Publisher pub=nh.advertise<std_msgs::String>("fang",10);
    /*
    5、编写发布逻辑并发布数据
    //要求以10HZ频率发布,文本后添加编号
    //循环发布
    */
    //先创建被发布的消息
    std_msgs::String msg;
    ros::Rate rate(1);//1HZ
    //编写循环,循环中发布数据 

    //设置编号
    int count=0;
    //休眠三秒钟防止前几条数据不能发出,句柄还在注册
    //ros::Duration(3).sleep();
    while(ros::ok()){
        count++;
        msg.data="hello";

        std::stringstream ss;
        ss<<"hello"<<count;

        msg.data=ss.str();

        pub.publish(msg);//发布对象内容是msg

        //添加日志:
        ROS_INFO("发布的数据是:%s",ss.str().c_str());
        
        rate.sleep();//睡0.1秒
        ros::spinOnce();//处理回调函数
    }      
    return 0;
}

3、订阅方

3.1文件结构

同2.1

3.2代码及注释说明

/*
    实现流程:
        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){
    //msg_p表示传入的消息,通过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>("fang",10,doMsg);
    //5.处理订阅的消息(回调函数)

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

    return 0;
}

4、运行结果

发送方:

订阅方:

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2021-12-15 18:30:19  更:2021-12-15 18:30:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 14:45:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码