目录
(1)在功能包文件夹下创建srv文件夹,存放自定义的服务数据
五,开跑!!!(更改图里文件名就好咯)一定记得勾选为可执行文件
一,创建工作空间(略)
二,创建功能包
在工作空间下的src文件夹下使用终端,输入以下指令:
catkin_create_pkg task_service roscpp rospy std_msgs
三,配置“环境”
(1)在功能包文件夹下创建srv文件夹,存放自定义的服务数据
touch addition.srv
输入内容,三个横线进行区分,以上为request(请求)数据,以下为respond(相应)数据
int32 a
int32 b
---
int32 sum
(2)在package.xml包里面添加功能包依赖
(3)在CMakeLists.txt添加编译选项
前面的find_package是指创建的功能包所依赖的包,而catkin_package是指find_package所依赖的包
四,服务端和客户端代码编写
(1)在对应功能包的src下创建python文件
touch task_service_server.py
touch task_service_client.py
(2)服务端代码
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 该例程将执行/show_addition服务,服务数据类型task_service::addition
import rospy
from task_service.srv import Addition, AdditionResponse
# 定义服务处理函数。它将接受一个请求对象并返回一个响应对象
def addition_function(req):
# 计算两个数字的和
result = req.a + req.b
# 记录和
rospy.loginfo("Sum of %d and %d is %d", req.a, req.b, result)
# 返回响应对象
return AdditionResponse(sum=result)
def addition_server():
# ROS节点初始化
rospy.init_node('addition_server')
# 声明一个新服务。指定服务名,服务类型和处理函数
s= rospy.Service('/show_addition', Addition, addition_function)
# 循环等待回调函数
print("Ready to show addition information.")
rospy.spin()
if __name__ == "__main__":
addition_server()
(3)客户端代码
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 该例程将请求/show_addition服务,服务数据类型task_service::addition
import sys
import rospy
from task_service.srv import Addition
def addition_client(x, y):
# ROS节点初始化
rospy.init_node('addition_client')
# 等待服务变为可用
rospy.wait_for_service('/show_addition')
try:
# 定义服务代理
addition_client_proxy = rospy.ServiceProxy('/show_addition', Addition)
# 请求服务调用,输入请求数据
response = addition_client_proxy(x, y)
# 返回响应的数值
return response.sum
except rospy.ServiceException as e:
print("Service call failed: %s" % e)
return -1
if __name__ == "__main__":
result = addition_client(3, 9)
# 服务调用并显示调用结果
print("Show addition result : %d" % result)
报错分析:
File "/home/lingqi/catkin_ws/src/task_service/src/task_service_client.py", line 31, in <module> print("Show addition result : %d" % result) TypeError: %d format: a number is required, not NoneType
客户端问题:
%d format: a number is required, not NoneType
这意味着
result
变量是None
,而不是一个数字。当服务调用失败时,addition_client
函数没有返回任何值,所以result
变量默认为None
。为了解决这个问题,你应该在addition_client
函数中的异常处理部分添加一个返回值,例如return -1
或其他默认值,以表示服务调用失败。
五,开跑!!!(更改图里文件名就好咯)一定记得勾选为可执行文件
六,封装成launch文件
<launch>
<node pkg="task_service" type="task_service_server.py" name="server" output="screen" />
<node pkg="task_service" type="task_service_client.py" name="client" output="screen" />
</launch>
catkin_make
roscore
roslaunch task_service task_service_7.launch