1、talker节点
/**
* 该例程将发布chatter话题,消息类型String
* 发布float_message话题,消息类型Float32MultiArray
*/
#include <sstream>
#include "ros/ros.h"
#include "std_msgs/String.h"
#include "std_msgs/Float32MultiArray.h"
int main(int argc, char **argv)
{
// ROS节点初始化
ros::init(argc, argv, "talker");
// 创建节点句柄
ros::NodeHandle n1,n2,float_n;
// 创建一个Publisher,发布名为chatter的topic,消息类型为std_msgs::String 数据队列1000
ros::Publisher chatter_pub1 = n1.advertise<std_msgs::String>("chatter1", 1000);
ros::Publisher chatter_pub2 = n2.advertise<std_msgs::String>("chatter2", 1000);
ros::Publisher float_pub = float_n.advertise<std_msgs::Float32MultiArray>("float_message", 1000);
// 设置循环的频率 10Hz
ros::Rate loop_rate(10);
int count = 0;
while (ros::ok())
{
// 初始化std_msgs::String类型的消息
std_msgs::String msg1,msg2;
std::stringstream ss1,ss2;
std_msgs::Float32MultiArray float_message;
float_message.data.resize(3);
float_message.data[0] = 1;
float_message.data[1] = 2;
float_message.data[2] = 3;
ss1 << "hello world " << count;
ss2 << "HELLO WORLD " << count;
msg1.data = ss1.str();
msg2.data = ss2.str();
// 发布消息
ROS_INFO("%s", msg1.data.c_str());
ROS_INFO("%s", msg2.data.c_str());
chatter_pub1.publish(msg1);
chatter_pub2.publish(msg2);
float_pub.publish(float_message);
// 循环等待回调函数
ros::spinOnce();
// 按照循环频率延时
loop_rate.sleep();
++count;
}
return 0;
}
2、listener节点
/**
* 该例程将订阅chatter话题,消息类型String
* 订阅float_message话题,消息类型Float32MultiArray
*/
#include "ros/ros.h"
#include "std_msgs/String.h"
#include "std_msgs/Float32MultiArray.h"
// 接收到订阅的消息后,会进入消息回调函数
void chatterCallback1(const std_msgs::String::ConstPtr& msg)
{
// 将接收到的消息打印出来
ROS_INFO("I heard: [%s]", msg->data.c_str());
}
void chatterCallback2(const std_msgs::String::ConstPtr& msg)
{
// 将接收到的消息打印出来
ROS_INFO("I heard: [%s]", msg->data.c_str());
}
void messageCallback(const std_msgs::Float32MultiArray::ConstPtr& msg)
{
ROS_INFO("I heard float_message: [%f] [%f] [%f]", msg->data[0], msg->data[1], msg->data[2]);
}
int main(int argc, char **argv)
{
// 初始化ROS节点
ros::init(argc, argv, "listener");
// 创建节点句柄
ros::NodeHandle n1,n2,float_n;
// 创建一个Subscriber,订阅名为chatter的topic,注册回调函数chatterCallback
ros::Subscriber sub1 = n1.subscribe("chatter1", 1000, chatterCallback1);
ros::Subscriber sub2 = n2.subscribe("chatter2", 1000, chatterCallback2);
ros::Subscriber sub3 = float_n.subscribe("float_message", 1000, messageCallback);
// 循环等待回调函数
ros::spin();
return 0;
}
3、float_message.msg文件
通过.msg文件定义float_message消息类型,在功能包目录下创建msg文件夹,在msg文件夹下创建float_message.msg文件
float64 A
float64 B
float64 C
4、CMakeList.txt文件
cmake_minimum_required(VERSION 2.8.3)
project(learn) #learn是功能功能包名,根据实际进行修改
## Compile as C++11, supported in ROS Kinetic and newer
# add_compile_options(-std=c++11)
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
## Generate messages in the 'msg' folder
add_message_files(
FILES
float_message.msg
)
## Generate added messages and services with any dependencies listed here
generate_messages(
DEPENDENCIES
std_msgs
)
## DEPENDS: system dependencies of this project that dependent projects also need
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES learn_communication
CATKIN_DEPENDS roscpp rospy std_msgs
message_runtime
)
## Specify additional locations of header files
## Your package locations should be listed before other locations
include_directories(
include
${catkin_INCLUDE_DIRS}
)
add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
5、package.xml文件
cmake_minimum_required(VERSION 2.8.3)
project(learn) #learn是功能包名
## Compile as C++11, supported in ROS Kinetic and newer
# add_compile_options(-std=c++11)
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
## Generate messages in the 'msg' folder
add_message_files(
FILES
float_message.msg
)
## Generate added messages and services with any dependencies listed here
generate_messages(
DEPENDENCIES
std_msgs
)
## DEPENDS: system dependencies of this project that dependent projects also need
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES learn_communication
CATKIN_DEPENDS roscpp rospy std_msgs
message_runtime
)
## Specify additional locations of header files
## Your package locations should be listed before other locations
include_directories(
include
${catkin_INCLUDE_DIRS}
)
add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})