编写一个 ROS2 service程序,包含2个节点: 客户端调用一个名为把两个整数相乘的服务,该服务接受两个整数并返回它们的乘积。 请给出具体的代码实现步骤
时间: 2024-10-12 17:18:12 浏览: 45
ROS节点开发指南:编写和运行你的第一个ROS节点
在ROS2(Robot Operating System version 2)中编写一个服务(service)程序,包括客户端和服务端,通常涉及到以下几个步骤:
**服务端(publisher_node.cpp):**
1. 首先,需要定义服务的数据类型。创建一个`.msg`文件,例如`add_integers.msg`,内容如下:
```yaml
syntax = "proto3";
message AddIntegersRequest {
int32 num1 = 1;
int32 num2 = 2;
}
message AddIntegersResponse {
int32 result = 1;
}
```
2. 创建服务节点,如`add_integers_server.py`,其中包含服务声明和处理函数:
```python
#!/usr/bin/env python
import rclpy
from rclpy.node import Node
from add_integers_msgs.srv import AddIntegers
class AddIntegersServer(Node):
def __init__(self):
super().__init__('add_integers_server')
self.service = self.create_service(AddIntegers, 'add_two_integers', self.handle_add_request)
def handle_add_request(self, request, response):
response.result = request.num1 * request.num2
return response
def main(args=None):
rclpy.init(args=args)
server = AddIntegersServer()
rclpy.spin(server)
server.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
```
**客户端(client_node.cpp):**
1. 客户端需要包含服务的头文件,并实现请求和回调函数:
```cpp
#include <rclcpp/rclcpp.hpp>
#include <add_integers_msgs/AddIntegers.h>
class ClientNode : public rclcpp::Node {
public:
ClientNode(const std::string &node_name)
: Node(node_name), client_(get_node_base_namespace() + "/add_two_integers") {}
void call_service(int32_t num1, int32_t num2) {
auto future = client_.async_send_request(
AddIntegers::Request{
.num1 = num1,
.num2 = num2
});
rclcpp::spin_until_future_complete(this->get_node_handle(), future);
if (future.has_result()) {
const AddIntegers::Response::SharedPtr response = future.get_result();
RCLCPP_INFO(get_logger(), "Multiplication result: %d", response->result);
} else {
RCLCPP_ERROR(get_logger(), "Service call failed");
}
}
private:
rclcpp::Client<AddIntegers> client_;
};
int main(int argc, char ** argv) {
rclcpp::init(argc, argv);
ClientNode client("add_integers_client");
// 调用服务,传入参数
client.call_service(4, 5);
rclcpp::shutdown();
return 0;
}
```
完成以上步骤后,你需要分别构建和服务这两个节点。运行服务器`ros2 run your_package add_integers_server.py`,然后启动客户端`ros2 run your_package client_node`。
阅读全文