Ros_Topic通信方式

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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章