我用ros1实现server接收client发送的消息,比如客户端发送一个a 服务端接收到这个a并打印出来 C++实现
时间: 2024-11-09 12:30:21 浏览: 8
在ROS 1中,要实现Server接收Client发送的消息并打印,你可以使用`std_msgs/String`作为消息类型,因为这是一个基本的字符串类型,适合用于演示目的。以下是一个简单的C++示例,展示了如何创建一个服务以及处理请求:
```cpp
#include <ros/ros.h>
#include <std_msgs/String.h>
// 定义服务器节点
class MyServiceServer {
public:
void handleRequest(const std_msgs::String::ConstPtr msg) {
std::cout << "Received message from client: " << msg->data << std::endl;
}
private:
ros::NodeHandle nh_;
ros::ServiceServer service_;
};
int main(int argc, char **argv) {
ros::init(argc, argv, "my_service_server");
MyServiceServer server;
// 创建服务广告
service_ = nh_.advertiseService("receive_message", &MyServiceServer::handleRequest, &server);
ros::Rate loop_rate(10); // 每秒循环10次
while (ros::ok()) {
if (!service_.isAvailable()) { // 等待客户端连接
ROS_INFO_ONCE("Waiting for a client to connect...");
continue;
}
ros::spinOnce(); // 更新ROS事件循环
loop_rate.sleep();
}
return 0;
}
```
客户端可以像这样调用服务并发送消息:
```cpp
#include <ros/ros.h>
#include <std_msgs/String.h>
class MyServiceClient {
public:
void sendMessage() {
std_msgs::String request_msg;
request_msg.data = "a"; // 设置消息内容
// 发送请求
ros::ServiceClient client = nh_.serviceClient< std_msgs::String >("receive_message");
if (client.waitForExistence(5)) { // 等待5秒,如果服务不存在则返回false
try {
client.call(request_msg);
ROS_INFO("Sent message 'a'");
} catch (const ros::ServiceException& e) {
ROS_ERROR("Service call failed: %s", e.what());
}
} else {
ROS_WARN("Service not available");
}
}
private:
ros::NodeHandle nh_;
};
int main(int argc, char **argv) {
ros::init(argc, argv, "my_service_client");
MyServiceClient client;
client.sendMessage();
ros::spin();
return 0;
}
```
当你运行这两个程序,客户端会向服务端发送消息"a",服务端会接收到并打印出来。
阅读全文