编写一个 ROS2 service程序,包含2个节点客户端调用一个名为把两个整数相乘的服务该服务接受两个整数并返回它们的乘积。
时间: 2024-10-12 07:07:42 浏览: 86
在ROS2(Robot Operating System version 2)中,创建一个服务(service)允许节点之间通过异步请求和响应方式进行交互,比如把两个整数相乘。下面是一个简单的步骤来编写这个服务程序:
1. **创建服务**:
首先,在`src`目录下创建一个新的包(假设叫`multiply_service`),然后创建一个文件`add_two_ints srv`,里面会有一个名为`MultiplyInts.srv`的服务定义文件,内容如下:
```yaml
Header:
seq: # 序列号,用于消息排序
stamp:
secs: # 时间戳秒数
nsecs: # 时间戳纳秒数
MultiplyIntsRequest:
int1: # 第一个整数
int2: # 第二个整数
MultiplyIntsResponse:
result: # 返回两个整数的乘积
```
2. **编写服务服务器**:
在`multiply_service`包的`src`目录下,创建一个Python文件`multiply_server.py`,实现服务的处理函数:
```python
import rclpy
from rclpy.node import Node
from .multiply_ints_srv import MultiplyInts
from rclpy.executors import MultiThreadedExecutor
class MultiplyServer(Node):
def __init__(self):
super().__init__('multiply_server')
self.server = self.create_service(MultiplyInts, 'multiply', self.handle_multiply)
def handle_multiply(self, request, response):
response.result = request.int1 * request.int2
return response
def main(args=None):
rclpy.init(args=args)
executor = MultiThreadedExecutor()
server = MultiplyServer()
try:
while rclpy.ok():
executor.spin_once(server.get_node_base())
except KeyboardInterrupt:
pass
finally:
server.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
```
3. **运行服务**:
使用命令行启动服务端:
```
ros2 run multiply_service multiply_server
```
4. **创建客户端**:
在另一个节点(例如`client_node.py`)中,创建客户端并发送请求:
```python
import rclpy
from rclpy.action import ActionClient
from .multiply_ints_srv import MultiplyInts, MultiplyIntsRequest
class MultiplyClient(Node):
def __init__(self):
super().__init__('multiply_client')
self.client = self.create_client(MultiplyInts, 'multiply')
def send_request(self, int1, int2):
request = MultiplyIntsRequest()
request.int1 = int1
request.int2 = int2
future = self.client.call_async(request)
rclpy.spin_until_future_complete(self, future)
if not future.result() is None:
print(f"Multiplication result: {future.result().result}")
def main(args=None):
rclpy.init(args=args)
client = MultiplyClient()
try:
client.send_request(5, 7) # 发送两个整数请求
except Exception as e:
client.get_logger().error('Failed to call service:', exc_info=True)
finally:
rclpy.shutdown()
if __name__ == '__main__':
main()
```
现在,你可以分别启动服务和客户端,客户端将会调用服务并将结果打印出来。
阅读全文
相关推荐
















