【ros实验二】使用ros服务机制实现同步请求与答复(实现加法)(python)

本文详细介绍了如何在ROS(RobotOperatingSystem)环境中创建工作空间,创建功能包,配置服务数据,编写服务端和客户端Python代码,以及如何解决服务调用中的错误。
该文章已生成可运行项目,

目录

一,创建工作空间(略)

二,创建功能包

三,配置“环境”

(1)在功能包文件夹下创建srv文件夹,存放自定义的服务数据

(2)在package.xml包里面添加功能包依赖

(3)在CMakeLists.txt添加编译选项

四,服务端和客户端代码编写

(1)在对应功能包的src下创建python文件

(2)服务端代码

(3)客户端代码

五,开跑!!!(更改图里文件名就好咯)一定记得勾选为可执行文件

六,封装成launch文件


一,创建工作空间(略)

二,创建功能包

在工作空间下的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

本文章已经生成可运行项目
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值