Grpc学习之map变量

创建proto文件时,有时会定义对应的容器变量,如map:

那么在server端和client端是如何调用的呢?简单demo如下:

server:

 server端主要是对getMapData和setMapData函数的重载实现;

client:

client端主要是对getMapData和setMapData的调用;

proto对应的其他变量的使用方法如上,就是正常的容器操作即可。

唯一注意的是容器的变量头文件来自google::protobuf命名空间下。

结果:

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这里提供一个简单的ROS Noetic使用gRPC转发/map话题的C++代码示例: ```c++ #include <iostream> #include <memory> #include <string> #include <grpcpp/grpcpp.h> #include <ros/ros.h> #include <nav_msgs/OccupancyGrid.h> #include "map_service.grpc.pb.h" // gRPC生成的头文件 using grpc::Server; using grpc::ServerBuilder; using grpc::ServerContext; using grpc::Status; using map_service::MapService; using map_service::MapRequest; using map_service::MapReply; using nav_msgs::OccupancyGrid; class MapServiceImpl final : public MapService::Service { public: MapServiceImpl() { // 初始化ROS节点 int argc = 0; char **argv = NULL; ros::init(argc, argv, "map_service_node"); ros::NodeHandle nh; map_sub = nh.subscribe("/map", 1, &MapServiceImpl::mapCallback, this); } Status GetMap(ServerContext* context, const MapRequest* request, MapReply* reply) override { ROS_INFO("Received a map request"); // 将ROS的地图话题转换为gRPC消息 reply->mutable_map()->set_header_frame_id(map.header.frame_id); reply->mutable_map()->set_info_resolution(map.info.resolution); reply->mutable_map()->set_info_width(map.info.width); reply->mutable_map()->set_info_height(map.info.height); reply->mutable_map()->set_data(map.data.begin(), map.data.end()); return Status::OK; } private: ros::Subscriber map_sub; OccupancyGrid map; void mapCallback(const OccupancyGrid::ConstPtr& msg) { ROS_INFO("Received a map message"); map = *msg; } }; void RunServer() { std::string server_address("0.0.0.0:50051"); MapServiceImpl service; ServerBuilder builder; builder.AddListeningPort(server_address, grpc::InsecureServerCredentials()); builder.RegisterService(&service); std::unique_ptr<Server> server(builder.BuildAndStart()); std::cout << "Server listening on " << server_address << std::endl; server->Wait(); } int main(int argc, char** argv) { RunServer(); return 0; } ``` 在这个例子中,我们定义了一个名为`MapServiceImpl`的gRPC服务实现类,它继承自自动生成的`MapService::Service`类。`MapServiceImpl`类中实现了一个`GetMap`方法,用于响应gRPC客户端的地图请求,并将ROS的地图话题转换为gRPC消息。同时,`MapServiceImpl`类中还定义了一个`mapCallback`方法,用于接收ROS地图话题消息,并将其存储到`map`变量中。 在`main`函数中,我们创建了一个`MapServiceImpl`实例,并用`ServerBuilder`类创建了一个gRPC服务器,并将该实例注册到服务器中。在服务器启动之后,它将等待客户端的请求,并在收到请求后调用`GetMap`方法响应请求。 此外,在`MapServiceImpl`构造函数中,我们初始化了ROS节点,并订阅了`/map`话题。当ROS节点接收到`/map`话题消息时,它将调用`mapCallback`方法,并将地图消息存储到`map`变量中。当gRPC客户端请求地图时,`GetMap`方法将使用这个`map`变量来生成gRPC消息并发送给客户端。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值