天天看点

Ros_Topic通信方式C++:python :

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

           

继续阅读