话题通信基本操作

阅读: 评论:0

话题通信基本操作

话题通信基本操作

在模型实现中ROS Master不需要实现,而连接建立也已经被封装了,需要关注的关键点有三个:

  1. 发布方
  2. 接收方
  3. 数据(此处为普通文本)

流程:

  1. 编写发布方实现
  2. 编写订阅方实现
  3. 编写配置文件
  4. 编译并执行

1、发布方

/*需求: 实现基本的话题通信,一方发布数据,一方接收数据,实现的关键点:1.发送方2.接收方3.数据(此处为普通文本)PS: 二者需要设置相同的话题消息发布方:循环发布信息:HelloWorld 后缀数字编号实现流程:1、包含头文件2、初始化ROS节点:命名唯一3、实例化ROS句柄4、实例化发布者对象5、组织被发布的数据,并编写逻辑发布数据//1、包含头文件按
#include &#s.h"
#include "std_msgs/String.h"
#include <sstream>int main(int argc,char *argv[])
{//设置编码setlocale(LC_ALL,"");//初始化ROS节点ros::init(argc,argv,"ergouzi");//实例化ROS句柄ros::NodeHandle nh;//实例化发布者对象ros::Publisher pub = nh.advertise<std_msgs::String>("chatter",10);//组织被发布的数据,并编写逻辑发布数据std_msgs:String msg;std_msgs msg_front = "Hello 你好!";int count =0;ros::Rate r(1);
while(ros::ok()){std::stringstream ss;ss<<mag_front<<count;msg.data=ss.str();pub.publish(msg);ROS_INFO("发送的消息是:%s",msg.data.c_str());r.sleep();count++;ros::spinOnce();}}    

2、订阅方

/*需求: 实现基本的话题通信,一方发布数据,一方接收数据,实现的关键点:1.发送方2.接收方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;
}

 3、配置文件

add_executable(Hello_pub
  src/Hello_pub.cpp
)
add_executable(Hello_sub
  src/Hello_sub.cpp
)

target_link_libraries(Hello_pub
  ${catkin_LIBRARIES}
)
target_link_libraries(Hello_sub
  ${catkin_LIBRARIES}
)

4、执行

1、启动roscore

2、启动发布节点

3、启动订阅节点

下面介绍下Python的实现过程

流程:

1、编写发布方实现

2、编写订阅方实现

3、为python文件添加可执行权限

4、编辑配置文件

5、编译并执行

1、发布方

#! /usr/bin/env python

#PS:二者之间的话题要一致

“”“

实现流程:

1、导包

2、初始化ROS节点:命名唯一

3、实例化发布者对象

4、组织被发布的数据,并编写逻辑发布数据

”“”

import rospy

from std_msgs.msg import String

if __name__ == "__main__":

rospy.init_node("talker_p")

pub = rospy.Publisher("chatter",String,queue_size=10)

msg = String()

msg_front="hello 你好"

count = 0  #计数器 # 设置循环频率rate = rospy.Rate(1)while not rospy.is_shutdown():#拼接字符串msg.data = msg_front + str(count)pub.publish(msg)rate.sleep()rospy.loginfo("写出的数据:%s",msg.data)count += 1

2、订阅方

#! /usr/bin/env python
"""
    需求: 实现基本的话题通信,一方发布数据,一方接收数据,
         实现的关键点:
         1.发送方
         2.接收方
         3.数据(此处为普通文本)


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

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

"""
#1.导包 
import rospy
from std_msgs.msg import String

def doMsg(msg):
    rospy.loginfo("I heard:%s",msg.data)

if __name__ == "__main__":
    #2.初始化 ROS 节点:命名(唯一)
    rospy.init_node("listener_p")
    #3.实例化 订阅者 对象
    sub = rospy.Subscriber("chatter",String,doMsg,queue_size=10)
    #4.处理订阅的消息(回调函数)
    #5.设置循环调用回调函数
    rospy.spin()

3、添加可执行权限

终端下进入scripts执行:chmod +x *.py

4、配置

catkin_install_python(PROGRAMS
  scripts/talker_p.py
  scripts/listener_p.py
  DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
5、执行

1.启动 roscore;

2.启动发布节点;

3.启动订阅节点。

PS:可以使用 rqt_graph 查看节点关系。

本文发布于:2024-02-08 20:05:15,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170739416368679.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:话题   操作   通信
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23