Ros_Topic通信方式
C++:
Publisher
publisher.cpp
#include <iostream>
#include <ros/ros.h>
#include <std_msgs/String.h>
using namespace std;
int main(int argc,char *argv[]){
//节点名
string nodeName = "cpp_publisher";
//初始化节点 定义匿名节点加参数 ,ros::init_options::AnonymousName
ros::init(argc,argv,nodeName,ros::init_options::AnonymousName);
//创建节点
ros::NodeHandle node;
//节点名
string topicName = "cpp_topic";
//创建topic发送者
//参数1:节点名
//参数2:消息队列容量
const ros::Publisher &publisher = node.advertise<std_msgs::String>(topicName, 5);
//每隔一秒钟发送一条消息
ros::Rate rate(1);
int i = 0;
while (ros::ok()){
std_msgs::String data;
data.data = "hello "+to_string(i);
//发送一条消息
publisher.publish(data);
//增加i
i+=1;
//睡眠
rate.sleep();
}
return 0;
}
Subscriber
subscriber.cpp
#include <iostream>
#include <std_msgs/String.h>
#include <ros/ros.h>
using namespace std;
void callBack(std_msgs::String::ConstPtr data){
cout<<"收到消息:"<<data->data<<endl;
}
int main(int argc, char *argv[]) {
//节点名
// string nodeName = "cpp_subscriber";
string nodeName = "cpp_publisher";
//初始化节点
//ros::init(argc, argv, nodeName);
//初始化节点 定义匿名节点加参数 ,ros::init_options::AnonymousName
ros::init(argc,argv,nodeName,ros::init_options::AnonymousName);
//创建节点
ros::NodeHandle node;
//topic名字
string topicName = "cpp_topic";
//订阅者
//参数1:topic名字
//参数2:队列长度
//参数3:回调函数
//注意:返回的Subscriber必须要接收,如果不接受 可能收不到消息
const ros::Subscriber &subscriber = node.subscribe<std_msgs::String>(topicName, 5, callBack);
//ros::spin 处理事件
ros::spin();
return 0;
}
python :
Publisher
publisher.py
#!/usr/bin/env python
# coding:utf-8
import rospy
# 导入数据
from std_msgs.msg import String
if __name__ == '__main__':
# 节点名
nodeName = 'py_publisher'
# 初始化节点 定义匿名节点加参数 anonymous=True
rospy.init_node(nodeName,anonymous=True)
# 话题名
topicName = 'py_topic'
# 创建发布者
publisher = rospy.Publisher(topicName, String, queue_size=5)
# 每一秒钟发送一条消息
rate = rospy.Rate(1)
i = 0
# 循环
while not rospy.is_shutdown():
# 消息内容
data = String()
data.data = 'hello {}'.format(i)
# 发送消息
publisher.publish(data)
# 增加数据
i += 1
rate.sleep()
Subscriber
subscriber.py
#!/usr/bin/env python
# coding:utf-8
import rospy
# from std_msgs.msg import String
from geometry_msgs.msg import Twist
import threading
# python订阅者回调在子线程中
def callBack(data):
print '接收的线程id:{}'.format(threading.current_thread().name)
print '收到数据:{}'.format(data.linear.x)
if __name__ == '__main__':
print '主线程线程id:{}'.format(threading.current_thread().name)
# 节点名
nodeName = 'py_subscriber'
# 初始化节点 定义匿名节点加参数 anonymous=True
rospy.init_node(nodeName,anonymous=True)
# topic名字
topicName = 'py_topic'
# 创建订阅者
# 参数1:topic名字
# 参数2:topic数据类型
# 参数3:回调函数
subscriber = rospy.Subscriber(topicName, Twist, callBack)
# 事件处理
rospy.spin()