【ROS】手写消息发布器和订阅器

20 篇文章 0 订阅

本篇文章记录手写ROS消息发布器和订阅器的过程,(C++版本)
开发环境:VSCode Ubuntu18.04

开发前期准备
1 引入开发所需库文件

需要准备开发的ROS包库
在这里插入图片描述

2 打开已建立的ros开发文件夹,建立过程可以参见 工作空间创建功能包创建

在这里插入图片描述
在这里插入图片描述
然后就发现 VSCode 自动导入所建立的文件夹了,下面 src 目录下的 test_tutorials 为在工作空间创建的功能包,在/test_tutorials/src 下新建 talker.cpp

在这里插入图片描述

假设说环境已经准备完毕,接下来就是进行开发的过程了。

手写发布器
1 代码如下
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>
//以一定频率(10hz)向固定话题上发布消息(hello world + count)

int main(int argc,char **argv){
    //初始化ros节点名称 唯一
    ros::init(argc,argv,"talker");
    ros::NodeHandle n;
    //声明发布器 以std_msgs::String形式向chatter 话题名称 1000为话题缓存
    ros::Publisher chatter_pub=n.advertise<std_msgs::String>("chatter",1000);
    // 循环频率为10hz
    ros::Rate loop_rate(10);

    int count=0;
    // ros::ok() 如果节点一直开着为 true 否则 为 false
    while(ros::ok()){
        std_msgs::String msg;
        std::stringstream ss;
        ss<<"hello world "<<count;

        msg.data=ss.str(); // 获取消息数据
        ROS_INFO("%s",msg.data.c_str());// 打印消息数据
        chatter_pub.publish(msg);//发布话题消息
        ros::spinOnce();//ros 回调函数  一般加上
        loop_rate.sleep();//调用频率函数 休息10hz
        ++count; // 计数器递增
    }
    return 0 ;
}
2 编写 CmakeLists.txt 内容

注意打开的 CmakeLists.txt 的目录结构
在这里插入图片描述
然后添加下面的内容

#引入库文件
include_directories(include ${catkin_INCLUDE_DIRS})
# 生成执行文件
add_executable(talker src/talker.cpp)
# 将生成的talker 文件链接到catkin_LIBRARIES
target_link_libraries(talker ${catkin_LIBRARIES})
3 编译

打开终端切换至工作空间文件夹,输入

catkin_make

进行编译

在这里插入图片描述
编译成功
在这里插入图片描述

4 运行查看发布器是否成功

打开一个终端 启动 roscore

roscore

在这里插入图片描述
再打开一个终端,输入

rosrun test_tutorials talker // test_tutorials 为功能包名,talker为发布器

在这里插入图片描述
再打开一个终端 查看计算图
先查看是否存在 chatter 话题

rostopic list

只打开 roscore
在这里插入图片描述
打开 roscore 和 talker 节点
在这里插入图片描述
查看计算图

rosrun rqt_graph rqt_graph

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
则说明手写发布器成功。

手写订阅器
1 代码
#include "ros/ros.h"
#include "std_msgs/String.h"
//#include <sstream>

//回调函数参数与发布器信息类型一致
void chatterCallback(const std_msgs::String::ConstPtr& msg){
    //打印监听器听到的信息
    ROS_INFO("I hear [%s]",msg->data.c_str());
}
int main(int argc,char **argv){
   //初始化ros节点 名称唯一
    ros::init(argc,argv,"listener");
    //声明ros 句柄
    ros::NodeHandle n;
    //声明一个订阅器 1000订阅器缓存 并调用回调函数
    ros::Subscriber sub=n.subscribe("chatter",1000,chatterCallback);
    //阻塞式回调 类似于
    /*
    while(ros::ok()){ros::spinOnce();}
    */
    ros::spin(); 
    return 0;
}
2 编写CmakeLists.txt

在这里插入图片描述

#引入库文件
include_directories(include ${catkin_INCLUDE_DIRS})
# 生成执行文件
add_executable(talker src/talker.cpp)
# 将生成的talker 文件链接到catkin_LIBRARIES
target_link_libraries(talker ${catkin_LIBRARIES})

# 生成执行文件
add_executable(listener src/listener.cpp)
# 将生成的talker 文件链接到catkin_LIBRARIES
target_link_libraries(listener ${catkin_LIBRARIES})
3 编译 catkin_make

在这里插入图片描述
在这里插入图片描述

4 和调试talker 一样,打开 listener
rosrun test_tutorials listener

这个为 发布者 talker
在这里插入图片描述
listener
在这里插入图片描述
计算图
在这里插入图片描述
以上是手写简单的消息发布器和订阅器的经过,希望对您有所帮助。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值