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()