套路總結(jié):
1.初始化并命名節(jié)點;
2.創(chuàng)建句柄;
3.發(fā)布消息或訂閱消息,topic名稱要對應(yīng);
4.循環(huán)。
talker.cpp↓
#include <ros/ros.h>
#include <topic_demo/gps.h>
int main(int argc, char **argv)
{
ros::init(argc, argv, "talker");//初始化并命名節(jié)點
ros::NodeHandle nh; //創(chuàng)建句柄,實例化node
topic_demo::gps msg;// 創(chuàng)建GPS消息
msg.x = 1.0;
msg.y = 1.0;
msg.state = "working";
ros::Publisher pub = nh.advertise<topic_demo::gps>("gps_info", 1);//創(chuàng)建publisher,<...>里是要發(fā)布的消息的模板類型,"..."是topic的名稱,1是待處理隊列的長度
ros::Rate loop_rate(1.0);//定義循環(huán)發(fā)布的頻率1Hz
while(ros::ok()){
msg.x = 1.01 * msg.x;
msg.y = 1.02 * msg.y;
ROS_INFO("Talker: GPS: x = %f, y = %f", msg.x, msg.y);//ROS_INFO相當于cout和printf
pub.publish(msg);//發(fā)布消息
loop_rate.sleep();//根據(jù)定義的頻率休眠1s
};
return 0;
}
listener.cpp
#include <ros/ros.h>
#include <topic_demo/gps.h>
#include <std_msgs/Float32.h>
void gpsCallback(const topic_demo::gps::ConstPtr &msg)
{
std_msgs::Float32 distance;//distance是一個結(jié)構(gòu)體,包含了data
distance.data = sqrt(pow(msg->x, 2), pow(msg->y, 2));
ROS_INFO("Listener: Distance to origin = %f, state = %s", distance.data, msg->state.c_str());//c_str()輸出字符串的首地址,string s = "123"; printf("%s", s.c_str());輸出"123"
int main(int argc, char **argv)
{
ros::init(argc, argv, "listener");
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe("gps_info", 1, gpsCallback);//"gps_info"為訂閱的topic名稱,與talker.cpp中發(fā)布的topic名稱對應(yīng)
ros::spin();//反復(fù)調(diào)用當前可觸發(fā)的回調(diào)函數(shù),阻塞
return 0;
}
gps.msg↓
float32 x
float32 y
string state