ROS入门(四)

Course 4

ROS Service服务

  1. 请求和回复之间信息交流由服务Service实现
    • 服务的服务器server给service发送信息
    • 服务的客户client接收来自这个服务器的信息
  2. 服务的结构和信息messages很相似,在*.srv中定义
  3. 代码

    • 服务列表:

      > rosservice list
      
    • 显示服务类型:

      > rosservice type /servoce_name
      
    • 用请求内容调用一个服务:

      > rosservice call /service_name args
      
  4. 结构图:

这里写图片描述

  1. Service示例:add_two_ints_server.cpp

    #include <ros/ros.h>
    #include <roscpp_tutorials/TwoInts.h>
    bool add(roscpp_tutorials::TwoInts::Request &request,
    roscpp_tutorials::TwoInts::Response &response)
    {
        response.sum = request.a + request.b;
        ROS_INFO("request: x=%ld, y=%ld", (long int)request.a,
        (long int)request.b);
        ROS_INFO(" sending back response: [%ld]",
        (long int)response.sum);
        return true;
    }
    int main(int argc, char **argv)
    {
        ros::init(argc, argv, "add_two_ints_server");
        ros::NodeHandle nh;
        ros::ServiceServer service =
        nh.advertiseService("add_two_ints", add);
        ros::spin();
        return 0;
    }
    
  2. Client示例:add_two_ints_client.cpp

    #include <ros/ros.h>
    #include <roscpp_tutorials/TwoInts.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 nh;
        ros::ServiceClient client =
        nh.serviceClient<roscpp_tutorials::TwoInts>("add_two_ints");
        roscpp_tutorials::TwoInts service;
        // atoi(): 把字符串转换成整型数
        service.request.a = atoi(argv[1]);
        service.request.b = atoi(argv[2]);
        if (client.call(service)) {
            ROS_INFO("Sum: %ld", (long int)service.response.sum);
        } else {
            ROS_ERROR("Failed to call service add_two_ints");
            return 1;
        }
            return 0;
    } 
    

ROS Action行为

  1. 和服务调用很像,但是一般用于提供任务取消、过程反馈;
  2. 是实现时间扩展,目标导向行为的最佳方式;
  3. 结构上和services很像,用*.action文件来定义;
  4. 在内部,行为由一系列主题实现;
  5. 结构图:

这里写图片描述

ROS 参数,动态重配置,主题,服务和行为的比较

这里写图片描述

ROS Time时间

  1. 一般来说,ROS使用PC的系统时钟作为时间源
  2. 对于记录数据的模拟或者回放,使用模拟时间(暂停,减速等)是很方便的。
  3. 使用模拟时钟:

    • 设定 /use_sim_time参数:

      > rosparam set use_sim_time true
      
  4. ROS Time API:

    • ros::Time

      ros::Time begin = ros::Time::now();
      double secs = begin.toSec();
      
    • ros::Duration

      ros::Duration duration(0.5); //0.5s
      
    • ros::Rate

      ros::Rate rate(10); //10Hz
      

ROS Bags 数据记录包

  1. 包是一种存储message数据的格式
  2. 用扩展格式*.bag来存储二进制格式
  3. 适用于记录和记录数据集来用于后期可视化分析
  4. 代码:

    • 记录包中所有的话题:

      > rosbag record --all
      
    • 记录给定话题:

      > rosbag record topic_1 topic_2
      
    • 显示一个包的信息:

      > rosbag info bag_name.bag
      
    • 读并发表一个包的内容:

      > rosbag play bag_name.bag
      
    • 定义回放选项:

      > rosbag play --rate=0.5 bag_name.bag
      
      • –rate=factor : Publish rate factor;
      • –clock : Publish the clock time (set param use_sim_time to true)
      • –loop : Loop playback

猜你喜欢

转载自blog.csdn.net/qq_31246717/article/details/80055589