只含有ros::Subscriber sub = nh.subscribe("/rosout", 1000, callback);的ros功能包怎么添加service接口
时间: 2024-03-28 13:42:32 浏览: 103
service接口需要的包
一个只含有 `ros::Subscriber` 的 ROS 功能包是无法提供 service 接口的,因为 service 是一种不同于 topic 的通信机制。
要添加 service 接口,你需要在 ROS 功能包中创建一个服务定义文件来定义服务请求和响应的格式,然后在代码中添加服务服务器和客户端的实现。
以下是一个简单的例子,演示如何在一个 ROS 功能包中添加服务接口:
1. 创建一个服务定义文件 `MyService.srv`,定义服务请求和响应的格式。例如:
```
int64 a
int64 b
---
int64 sum
```
2. 在 `CMakeLists.txt` 文件中添加服务定义文件的编译:
```
add_service_files(
FILES
MyService.srv
)
```
3. 在 `CMakeLists.txt` 文件中添加服务依赖:
```
generate_messages(
DEPENDENCIES
std_msgs
)
```
4. 在 `CMakeLists.txt` 文件中链接服务库:
```
target_link_libraries(my_package_node ${catkin_LIBRARIES})
```
5. 在 `my_package_node.cpp` 文件中添加服务服务器和客户端的实现。例如:
```cpp
#include "ros/ros.h"
#include "my_package/MyService.h"
void service_callback(const my_package::MyService::Request& req,
my_package::MyService::Response& res)
{
res.sum = req.a + req.b;
ROS_INFO("Received service request: %ld + %ld = %ld", req.a, req.b, res.sum);
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "my_package_node");
ros::NodeHandle nh;
ros::ServiceServer service = nh.advertiseService("my_service", service_callback);
ROS_INFO("Ready to receive service requests.");
ros::Subscriber sub = nh.subscribe("/rosout", 1000, callback);
ros::spin();
return 0;
}
```
现在,你的 ROS 功能包就同时包含了一个服务服务器和一个订阅者。当你运行该节点时,服务服务器将会监听服务请求,并根据请求提供响应。同时,订阅者将会监听 ROSout topic,并在收到消息时调用回调函数 `callback`。
阅读全文