ROS基础知识学习笔记(8)—发布订阅和客户端服务

(一)发布器与订阅器

发布节点

#include "ros/ros.h"
#include "std_msgs/String.h"

#include <sstream>

int main(int argc, char **argv)
{
  ros::init(argc, argv, "talker");

  ros::NodeHandle n;

  ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);

  ros::Rate loop_rate(10);

  int count = 0;
  while (ros::ok())
  {
    std_msgs::String msg;

    std::stringstream ss;
    ss << "hello world " << count;
    
    //String数据类型可以看做一个类
    //msg.data为类的成员变量
    msg.data = ss.str();
    ROS_INFO("%s", msg.data.c_str());

	//参数必须与定义时的chatter_pub参数列表一样
    chatter_pub.publish(msg);

    ros::spinOnce();

    loop_rate.sleep();
    ++count;
  }
  return 0;
}

订阅节点

#include "ros/ros.h"
#include "std_msgs/String.h"

void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
  //返回类型是个指针,所以可以有两种调用方式,下一行注释亲测可用
  //ROS_INFO("I heard: [%s]", (*msg).data.c_str());
  ROS_INFO("I heard: [%s]", msg->data.c_str());
}

int main(int argc, char **argv)
{
  //初始化节点并为节点起个名
  ros::init(argc, argv, "listener");

  //句柄,与ros系统交流
  ros::NodeHandle n;

  //订阅消息,在接受到消息之后调用chatterCallback函数
  ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);

  //循环
  ros::spin();
  
  return 0;
}

结果

在这里插入图片描述

(二)客户端和服务器

在这里插入图片描述

客户端

add_two_ints_client

#include "ros/ros.h"
#include "beginner_tutorials/AddTwoInts.h"
#include <cstdlib>

int main(int argc, char **argv)
{
  ros::init(argc, argv, "add_two_ints_client");
  if (argc != 3)
  {
    ROS_INFO("usage: add_two_ints_client X Y");
    return 1;
  }

  ros::NodeHandle n;
  ros::ServiceClient client = n.serviceClient<beginner_tutorials::AddTwoInts>("add_two_ints");
  beginner_tutorials::AddTwoInts srv;
  srv.request.a = atoll(argv[1]);
  srv.request.b = atoll(argv[2]);
  if (client.call(srv))
  {
    ROS_INFO("Sum: %ld", (long int)srv.response.sum);
  }
  else
  {
    ROS_ERROR("Failed to call service add_two_ints");
    return 1;
  }

  return 0;
}

服务器

add_two_ints_server

#include "ros/ros.h"
#include "beginner_tutorials/AddTwoInts.h"

bool add(beginner_tutorials::AddTwoInts::Request  &req,
         beginner_tutorials::AddTwoInts::Response &res)
{
  res.sum = req.a + req.b;
  ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b);
  ROS_INFO("sending back response: [%ld]", (long int)res.sum);
  return true;
}

int main(int argc, char **argv)
{
  ros::init(argc, argv, "add_two_ints_server");
  ros::NodeHandle n;

  ros::ServiceServer service = n.advertiseService("add_two_ints", add);
  ROS_INFO("Ready to add two ints.");
  ros::spin();

  return 0;
}

结果

lv@lv-HP:~/catkin_ws$ roscore
lv@lv-HP:~/catkin_ws$ rosrun beginner_tutorials add_two_ints_client 
[ INFO] [1581842363.085734434]: usage: add_two_ints_client X Y
lv@lv-HP:~/catkin_ws$ rosrun beginner_tutorials add_two_ints_client 50  60
[ INFO] [1581842420.012682340]: Sum: 110
lv@lv-HP:~/catkin_ws$ rosrun beginner_tutorials add_two_ints_server 20  50
[ INFO] [1581842345.054387632]: Ready to add two ints.
[ INFO] [1581842420.012588996]: request: x=50, y=60
[ INFO] [1581842420.012608778]: sending back response: [110]
发布了35 篇原创文章 · 获赞 4 · 访问量 4025

猜你喜欢

转载自blog.csdn.net/qq_42589654/article/details/104344074
今日推荐