以發(fā)布和訂閱topic為例理解ROS的套路

套路總結(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容