【ros实验二】使用ros服务机制实现同步请求与答复(实现加法)(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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
本次实验旨在使用ROS框架实现服务器和客户端通信程序,具体实验步骤如下: 1. 安装ROSUbuntu系统下,使用以下命令安装ROS: ``` sudo apt-get install ros-<distro>-desktop-full ``` 其中,`<distro>`表示ROS版本,如Melodic、Noetic等。 2. 创建ROS工作空间 在终端中执行以下命令,创建ROS工作空间: ``` mkdir -p ~/catkin_ws/src cd ~/catkin_ws/ catkin_make ``` 3. 创建ROS包和节点 在终端中执行以下命令,创建ROS包和节点: ``` cd ~/catkin_ws/src catkin_create_pkg my_package std_msgs rospy roscpp cd my_package mkdir scripts cd scripts touch my_server.py touch my_client.py ``` 在`my_server.py`和`my_client.py`中,编写服务器和客户端程序,具体代码如下: `my_server.py`: ```python #!/usr/bin/env python import rospy from std_msgs.msg import String def callback(data): rospy.loginfo(rospy.get_caller_id() + 'I heard %s', data.data) def listener(): rospy.init_node('my_server', anonymous=True) rospy.Subscriber('chatter', String, callback) rospy.spin() if __name__ == '__main__': listener() ``` `my_client.py`: ```python #!/usr/bin/env python import rospy from std_msgs.msg import String def talker(): pub = rospy.Publisher('chatter', String, queue_size=10) rospy.init_node('my_client', anonymous=True) rate = rospy.Rate(10) # 10hz while not rospy.is_shutdown(): hello_str = 'hello world %s' % rospy.get_time() rospy.loginfo(hello_str) pub.publish(hello_str) rate.sleep() if __name__ == '__main__': try: talker() except rospy.ROSInterruptException: pass ``` 4. 编译ROS包 在终端中执行以下命令,编译ROS包: ``` cd ~/catkin_ws/ catkin_make ``` 5. 运行ROS节点 在两个终端中分别执行以下命令,运行ROS节点: ``` rosrun my_package my_server.py rosrun my_package my_client.py ``` 6. 测试 在客户端终端中,可以看到发布的消息: ``` [INFO] [1632282400.974590]: hello world 0.000425100326538 [INFO] [1632282401.974994]: hello world 1.00042057037 [INFO] [1632282402.975398]: hello world 2.00041604042 ... ``` 在服务器终端中,可以看到接收到的消息: ``` [INFO] [1632282400.980415]: I heard hello world 0.000425100326538 [INFO] [1632282401.980743]: I heard hello world 1.00042057037 [INFO] [1632282402.981175]: I heard hello world 2.00041604042 ... ``` 至此,使用ROS框架实现服务器和客户端通信程序的实验完成。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值