发布消息和订阅消息属于ROS通信的基础操作,详细教程可以参考官方教程,下面贴出我自己做的测试和注释。
发布节点
#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;
}
订阅节点
#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;
}
在同一个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})