Publishing messages and subscribing to messages are the basic operations of ROS communication. For detailed tutorials, please refer to the official tutorials . The tests and notes I made are posted below.
Publish node
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>
int main(int argc, char **argv)
{
ros::init(argc, argv, "node_1");//初始化ROS,并指定节点名称“node_1”,
ros::NodeHandle n;//实例化节点
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);//消息队列为1000,也就是缓冲区,超过1000后,删除旧的
ros::Rate loop_rate(10);//发布消息的频率10hz,每秒10次,与sleep来协作控制时间
int count = 0;
while (ros::ok())//按下ctrl-c后,ros::ok会返回false
{
std_msgs::String msg;
std::stringstream ss;
ss << "hello world " << count;
msg.data = ss.str();
ROS_INFO("%s", msg.data.c_str());
chatter_pub.publish(msg);//开始发布
ros::spinOnce();//如有订阅,则必须加,不然回调函数不起作用,spinOnce()会往下执行
loop_rate.sleep();//控制时间
++count;
}
return 0;
}
Subscribe node
#include "ros/ros.h"
#include "std_msgs/String.h"
void chatterCallback(const std_msgs::String::ConstPtr& msg)//回调函数,boost shared_ptr指针形式传输
{
ROS_INFO("I heard: [%s]", msg->data.c_str());
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "node_2");
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
ros::spin();//ros::ok()返回false才会停止,停止之后往下执行,不然一直循环监听消息
return 0;
}
Add in the same CmakeList.txt:
add_executable(node_1 src/main_test_1.cpp)
target_link_libraries(node_1 ${
catkin_LIBRARIES})
add_dependencies(node_1 ${
${
PROJECT_NAME}_EXPORTED_TARGETS} ${
catkin_EXPORTED_TARGETS})
add_executable(node_2 src/main_test_2.cpp)
target_link_libraries(node_2 ${
catkin_LIBRARIES})
add_dependencies(node_2 ${
${
PROJECT_NAME}_EXPORTED_TARGETS} ${
catkin_EXPORTED_TARGETS})