目录
说明:
1. 服务模型
2. 实现过程(C++)
创建功能包
创建客户端代码(C++)
配置客户端代码编译规则
编译
运行
3. 实现过程(Python)
创建客户端代码(Python)
运行效果
说明:
1. 本系列学习笔记基于B站:古月居《ROS入门21讲》课程,且使用的Ubuntu与ROS系统版本与课程完全一致;
虚拟机版本 | Linux系统版本 | ROS系统版本 |
---|---|---|
VMware WorkStation Pro 16 | Ubuntu18.04 | Melodic |
2. 课程中的所有示例代码均已跑通,且对Pyhon版本的代码也都做了运行验证,并附带验证过程(错误均已修正);
3. 本节是整个笔记的第11节,对应视频课程的第13节,请自行对应学习;
4. 整个系列笔记基本已经完结,但部分章节仍需润色修改 ,后面会陆续发布,请大家持续关注, 创作不易,感谢支持!
1. 服务模型
2. 实现过程(C++)
创建功能包
cd ~/catkin_ws/src catkin_create_pkg learning_service roscpp rospy std_msgs geometry_msgs turtlesim
创建客户端代码(C++)
cd ~/catkin_ws/src/learning_service/src touch turtle_spawn.cpp
-
初始化ros节点;
-
创建一个Client实例;
-
发布服务请求数据;
-
等待Server处理之后的应答结果,
/*** 该例程将请求/spawn服务,服务数据类型turtlesim::Spawn*/
#include <ros/ros.h>
#include <turtlesim/Spawn.h>
int main(int argc, char** argv)
{// 初始化ROS节点ros::init(argc, argv, "turtle_spawn");
// 创建节点句柄ros::NodeHandle node;
// 发现/spawn服务后,创建一个服务客户端,连接名为/spawn的serviceros::service::waitForService("/spawn");ros::ServiceClient add_turtle = node.serviceClient<turtlesim::Spawn>("/spawn");
// 初始化turtlesim::Spawn的请求数据turtlesim::Spawn srv;srv.request.x = 2.0;srv.request.y = 2.0;srv.request.name = "turtle2";
// 请求服务调用ROS_INFO("Call service to spwan turtle[x:%0.6f, y:%0.6f, name:%s]", srv.request.x, srv.request.y, srv.request.name.c_str());
add_turtle.call(srv);
// 显示服务调用结果ROS_INFO("Spwan turtle successfully [name:%s]", srv.response.name.c_str());
return 0;
};
配置客户端代码编译规则
add_executable(turtle_spawn src/turtle_spawn.cpp) target_link_libraries(turtle_spawn ${catkin_LIBRARIES})
编译
cd ~/catkin_ws catkin_make source devel/setup.bash(如已配置 **.bashrc**文件,则此步不需要,配置方法在publisher的章节里)
编译完成后生成的可执行文件及其位置路径如下图
运行
roscore rosrun turtlesim turtlesim_node rosrun learning_service turtle_spawn
运行结果如下图
3. 实现过程(Python)
创建客户端代码(Python)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 该例程将请求/spawn服务,服务数据类型turtlesim::Spawn
import sys
import rospy
from turtlesim.srv import Spawn
def turtle_spawn():# ROS节点初始化rospy.init_node('turtle_spawn')
# 发现/spawn服务后,创建一个服务客户端,连接名为/spawn的servicerospy.wait_for_service('/spawn')try:add_turtle = rospy.ServiceProxy('/spawn', Spawn)
# 请求服务调用,输入请求数据response = add_turtle(2.0, 2.0, 0.0, "turtle2")return response.nameexcept rospy.ServiceException, e:print "Service call failed: %s"%e
if __name__ == "__main__":#服务调用并显示调用结果print "Spwan turtle successfully [name:%s]" %(turtle_spawn())
cd ~/catkin_ws/src/learning_service mkdir scripts cd scripts touch turtle_spawn.py
给turtle_spawn.py文件赋作为可执行文件权限