Course 4
ROS Service服务
- 请求和回复之间信息交流由服务Service实现
- 服务的服务器server给service发送信息
- 服务的客户client接收来自这个服务器的信息
- 服务的结构和信息messages很相似,在*.srv中定义
代码
服务列表:
> rosservice list
显示服务类型:
> rosservice type /servoce_name
用请求内容调用一个服务:
> rosservice call /service_name args
- 结构图:
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; }
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行为
- 和服务调用很像,但是一般用于提供任务取消、过程反馈;
- 是实现时间扩展,目标导向行为的最佳方式;
- 结构上和services很像,用*.action文件来定义;
- 在内部,行为由一系列主题实现;
- 结构图:
ROS 参数,动态重配置,主题,服务和行为的比较
ROS Time时间
- 一般来说,ROS使用PC的系统时钟作为时间源
- 对于记录数据的模拟或者回放,使用模拟时间(暂停,减速等)是很方便的。
使用模拟时钟:
设定 /use_sim_time参数:
> rosparam set use_sim_time true
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 数据记录包
- 包是一种存储message数据的格式
- 用扩展格式*.bag来存储二进制格式
- 适用于记录和记录数据集来用于后期可视化分析
代码:
记录包中所有的话题:
> 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