C++版本
1.新建msg文件
在pub_sub_test功能包中创建msg文件夹,在msg文件夹其中新建一个名为test.msg消息类型文件
int32 A
int32 B
int32 C
2.msg类型的使用
定义一个消息发布节点pub_msg.cpp
#include "ros/ros.h"
#include "pub_sub_test/test.h" //虽然是test_msg.msg,这里却是.h
int main(int argc, char *argv[])
{
ros::init(argc, argv, "talker"); //初始化ros,talker 节点名字
//ros::NodeHandle n;
//ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
ros::NodeHandle nh;
ros::Publisher num_pub = nh.advertise<pub_sub_test::test>("chatter", 10); //话题名可以自己定义,
pub_sub_test::test num; //定义消息
ros::Rate rate_loop(10);
while (ros::ok())
{
static int i;
i++;
num.A = i;
num.B = i;
num.C = i;
num_pub.publish(num);
ros::spinOnce();
rate_loop.sleep();
}
return 0;
}
定义一个消息订阅节点sub_msg.cpp
#include "ros/ros.h"
#include "pub_sub_test/test.h" //虽然是test_msg.msg,这里却是.h
#include <sstream>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
void messageCallback(const pub_sub_test::test::ConstPtr& msg)
{
//ROS_INFO(“I heard: A=%d,B=%d,C=%d sum=[%d]”,msg->A,msg->B,msg->C,msg->A+msg->B+msg->C);
//这里只做求和,表示简单的处理
std::cout<<msg->A<<std::endl;
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "listener");//初始化ros 节点名listener
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe("chatter", 10, messageCallback);
ros::spin(); //一直授权订阅
return 0;
}
- 修改CMakeLists.txt
cmake_minimum_required(VERSION 2.8.3)
project(pub_sub_test)
find_package(catkin REQUIRED COMPONENTS
message_generation
roscpp
rospy
std_msgs
geometry_msgs
)
add_message_files(FILES
test.msg
)
generate_messages(DEPENDENCIES
std_msgs
)
catkin_package(
CATKIN_DEPENDS
message_runtime
# INCLUDE_DIRS include
# LIBRARIES pub_sub_test
# CATKIN_DEPENDS roscpp rospy std_msgs
# DEPENDS system_lib
)
include_directories(
include ${
catkin_INCLUDE_DIRS}
# include
${
catkin_INCLUDE_DIRS}
)
add_executable(pub_string src/pub_string.cpp)
target_link_libraries(pub_string ${
catkin_LIBRARIES})
add_executable(sub_string src/sub_string.cpp)
target_link_libraries(sub_string ${
catkin_LIBRARIES})
set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")
python 版本
1.新建msg文件
在tsst功能包中创建msg文件夹,在msg文件夹其中新建一个名为test.msg消息类型文件
float32[] data
2.msg类型的使用
定义一个消息发布节点talker.py
#!/usr/bin/env python2
# -*- coding: UTF-8 -*-
import rospy
#from后边是自己的包.msg,也就是自己包的msg文件夹下,test是我的msg文件名test.msg
from tsst.msg import test
def talker():
pub = rospy.Publisher('chatter', test, queue_size=10)
rospy.init_node('talker', anonymous=True)
rate = rospy.Rate(10) # 10hz
while not rospy.is_shutdown():
#temp为到时候要用于传输的信息
temp = [1, 2]
#这里test就像构造函数般使用,若有多个msg,那么写成test(a,b,c,d...)
rospy.loginfo(test(temp))
pub.publish(test(temp))
rate.sleep()
if __name__ == '__main__':
try:
talker()
except rospy.ROSInterruptException:
pass
定义一个消息订阅节点listener.py
#!/usr/bin/env python2
# -*- coding: UTF-8 -*-
import rospy
from tsst.msg import test
def callback(data):
#传过来的所有msg为data,其中data.后边的变量看msg文件写,比如我的是float32[] data,那么我就是data.data
rospy.loginfo(data.data)
def listener():
rospy.init_node('listener', anonymous=True)
rospy.Subscriber('chatter', test, callback)
rospy.spin()
if __name__ == '__main__':
listener()