快速记录 ros 写service 与 client 节点

ROS服务与客户端创建教程
本文档详细介绍了如何在ROS环境中创建服务与客户端节点。首先创建一个名为test_pkg_service的功能包,包含一个服务AddTwo.srv,定义了加法操作。接着编写服务端节点service_node.py,处理加法请求并返回结果。然后创建客户端节点client.py,调用服务并打印结果。最后,更新相关配置文件,编译并运行服务和客户端。

继续上节快速回忆了 ros publisher 与subscriber 节点的写法之后,继续回顾 service与client 节点写法

在相同的工作空间 ~/catkin_ws/src 下新建一个功能包:

$catkin_create_pkg test_pkg_service std_msgs rospy roscpp

回到 ~/catkin_ws/下

catkin_make 一下, source ./devel/setup.bash

$roscd test_pkg_service

创建脚本与服务-响应的数据类文件夹

$mkdir scripts

$mkdir srv

新建一个AddTwo.srv 的文本文件

内容:

int64 a
int64 b
---
int64 sum

此格式为ros service 的一般格式,发送请求数据 为 a和b, 返回数据为 sum

之后修改 package.xml 与CMakelist.txt

1 ) 然后在 package.xml中

<build_depend>message_generation</build_depend>
  <exec_depend>message_runtime</exec_depend>

不被注释;

2) CMakelist.txt 中(改动4个地方):

1.在find_package 改动:

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation
)

2.改动add_service_files

add_service_files(
  FILES
  AddTwo.srv
)

3. 去掉注释

generate_messages(
   DEPENDENCIES
   std_msgs
)

4.增加依赖脚本

catkin_install_python(PROGRAMS
  scripts/service_node.py
  DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

然后 

回到 ~/catkin_ws/下

catkin_make 一下, source ./devel/setup.bash

 $rossrv list 一下 可以看到:

test_pkg_service/AddTwo

$ rossrv info test_pkg_service/AddTwo 就可以看到 service数据格式定义的内容

在scripts 文件夹下增加文件 service_node.py

#!/usr/bin/python

import rospy
from test_pkg_service.srv import AddTwo, AddTwoResponse

# define the function to handle the request
def handle_add_two(req):
    rospy.loginfo('Receive the req: %d + %d' % (req.a, req.b))
    re = req.a + req.b
    rospy.loginfo('The results is %d' % re)
    return AddTwoResponse(re)


def add_two_ints_service():
    
    rospy.init_node('adding_node',anonymous=True)
    
    s = rospy.Service('add_two_ints',AddTwo,handle_add_two)
    
    rospy.loginfo('The service started...')
    rospy.spin()


if __name__ =="__main__":
    add_two_ints_service()

chmod +x service_node.py 

运行服务:

$ rosrun test_pkg_service service_node.py 

不编写客户端进行 快速测试服务:

$ rosservice call /add_two_ints 2 3 

编写客户端情形:

在scripts 文件夹下 建立 client.py

#!/usr/bin/python

import rospy
from test_pkg_service.srv import AddTwo, AddTwoResponse
import sys 


def add_two_ints_call_service(x,y):
    rospy.wait_for_service('add_two_ints')
    func = rospy.ServiceProxy('add_two_ints',AddTwo)
    rospy.loginfo('ready to call the service from client!')
    res = func(x, y)
    return res.sum


if __name__ == "__main__":
    x = int(sys.argv[1])
    y = int(sys.argv[2])
    re = add_two_ints_call_service(x,y)
    print('The sum of %d and %d is %d' % (x,y,re))

chmod +x client.py

需要在 CMakelist.txt中增加脚本引用

catkin_install_python(PROGRAMS
  scripts/service_node.py
  scripts/client.py
  DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

回到 ~/catkin_ws/下

catkin_make 一下, source ./devel/setup.bash

运行客户端

$rosrun test_pkg_service client.py 3 5

### 创建 ROS ServiceClient 的方法 在机器人操作系统(ROS)中,`service` 是一种用于实现客户端/服务器通信的方式。通过 `service`,可以请求特定的任务并接收响应。以下是关于如何使用 Python 编程语言来创建和调用自定义的服务。 #### 定义服务消息 要创建一个新的服务类型,首先需要定义 `.srv` 文件的内容。假设我们正在开发一个名为 `AddTwoInts.srv` 的服务: ```plaintext int64 a int64 b --- int64 sum ``` 此文件表示两个整数作为输入参数 (`a`, `b`) 并返回它们的总和 (`sum`) 作为输出[^3]。 #### 修改 package.xml 和 CMakeLists.txt 为了使新定义的服务可用,需更新项目的配置文件: - **package.xml**: 添加必要的依赖项 `<build_depend>message_generation</build_depend>` 和 `<exec_depend>message_runtime</exec_depend>`。 - **CMakeLists.txt**: 使用命令查找所需的组件以及注册新的服务文件路径。 完成这些更改之后运行构建工具以生成相应的代码接口: ```bash cd ~/catkin_ws/ catkin_make source devel/setup.bash ``` #### 实现 Server 节点 (Python 版本) 下面展示了一个简单的 Python 程序片段用来处理来自客户的加法运算请求: ```python #!/usr/bin/env python import rospy from beginner_tutorials.srv import AddTwoInts, AddTwoIntsResponse def handle_add_two_ints(req): result = req.a + req.b print(f"Returning [{req.a} + {req.b}] = {result}") return AddTwoIntsResponse(result) if __name__ == "__main__": rospy.init_node('adder_server') s = rospy.Service('add_two_ints', AddTwoInts, handle_add_two_ints) print("Ready to add two ints.") rospy.spin() ``` 上述脚本初始化了一个节点并将自己暴露给名称为 `"add_two_ints"` 的服务上等待连接到来[^1]. #### 构建 Client 请求方 (Python 版本) 相对应地,这里提供了一种方式去发起远程过程呼叫至先前建立起来的那个 server : ```python #!/usr/bin/env python import sys import rospy from beginner_tutorials.srv import AddTwoInts def add_two_ints_client(x, y): rospy.wait_for_service('add_two_ints') # Wait until service becomes available. try: add_two_ints_proxy = rospy.ServiceProxy('add_two_ints', AddTwoInts) # Create proxy object once connected successfully. resp = add_two_ints_proxy(x, y) # Call remote procedure through this instance passing arguments along too. return resp.sum except rospy.ServiceException as e: print(f"Service call failed: {e}") if __name__ == "__main__": if len(sys.argv) != 3: usage = f"{sys.argv[0]} <A> <B>" print(usage) sys.exit(1) A = int(sys.argv[1]) B = int(sys.argv[2]) total_sum = add_two_ints_client(A,B) print(f"The addition of {A} and {B} is equal to {total_sum}.") ``` 该部分展示了怎样利用 `rospy.ServiceProxy()` 方法实例化代理对象从而能够轻松发送数据包到目标地址上去执行具体操作. --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chenxin0215

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值