BC.Wang Welcome

python和Unity3d的GRPC通信

2019-04-18
BCWang

阅读:


来源https://github.com/B-C-WANG/DevelopRLEnv

Unity3D游戏引擎作为engine

用Unity作为强化学习engine,和python的RL框架进行通信

通信

通信方案

  • 参考http://www.360doc.com/content/18/0719/21/9200790_771761124.shtml,以及https://www.cnblogs.com/softidea/p/7232035.html
  • 上面的测试中,Thrift性能较gRPC好,但是两者的通信耗时通常都在1ms内,远远低于engine进行模拟,以及RL决策频率的延时(例如10hz的RL决策频率需要sleep 100ms),即使序列化/反序列化耗时较高(尤其是对于图片数据),只要低于100ms就没有问题。考虑到可能存在的网络通信需求(比如众包的模仿学习),选用gRPC,使用protobuf进行序列/反序列化

    gRPC步骤

    写proto

    1. 在https://github.com/protocolbuffers/protobuf/releases中下载对应的protoc binary文件,可以加入环境变量也可放入protobuf文件夹便于调用
    2. 如果使用JetBrain的ide,推荐安装protobuf的相关插件,包括用于写proto的插件,以及GenProtobuf插件,用于直接从.proto生成相应语言的文件(使用方法查看插件文档,通常在Tools菜单栏中可以找到)。GenProtobuf需要设置protoc的binary的路径,以及生成的语言类型

      python端和C#端grpc生成

    3. 按照github和grpc文档的操作,安装python和C#的protobuf和grpc支持,注意安装需要protoc二进制文件支持,安装时pip可能报错,但是是生成的pb文件有问题,所以不影响
    4. gRPC使用参考https://grpc.io/docs/quickstart/python/和https://grpc.io/docs/quickstart/csharp/,注意,gRPC使用grpc_tools根据.proto文件生成的python或者其他语言的代码,是和protoc不同的,所以要使用gRPC就不用protoc!
      2.1 Python可以直接用python -m的命令生成,但是C#官方推荐的是Visual Studio的插件,对于使用Rider的ide无效,可以在visual studio中新建一个项目,然后在项目解决方案管理器中右键点击Nuget管理,搜索Grpc.Tools安装,安装完成之后,打开项目目录,在source/packages/Grpc.ToolsXXX/tools中找到grpc_csharp_plugin.exe,放到本项目文件夹中
      2.2 grpc tools的生成脚本在generate_gRPC_file.py中,把2.1得到的grpc_csharp_plugin.exe路径在命令中指定,但是python -m命令不会对csharp的proto生成(需要生成proto和grpc的两类文件),所以还需要运行一次protoc.exe

      python端和unity端的grpc运行

    5. Python参考文档即可,比较简单
    6. unity有grpc支持,目前是experimental:https://github.com/grpc/grpc/tree/master/src/csharp/experimental,在grpc的daliy build中点击最新Build ID,下载unity的package复制到unity项目的asset文件夹中即可 2.1 因为下载的unity grpc package是net 4.5的,所以需要在Unity-Edit-Project Settings-Player中修改成.net 4.5,重启就不会有很多报错了,可能因为升级了.net导致一些原本的插件出现问题,需要删除这些插件或者升级 2.2 然后完全按照grpc的C#教程来写,不需要继承MonoBehavior,但是在写Server启动的代码时需要继承MonoBehavior同时写在Start中 2.3 然后别忘了在Unity中创建空Object,放入写的启动Server的脚本,然后运行,之后在Python端进行request即可!

debug记录和注意事项

  • 填对了ip和端口,没有连接上,请检查端口是否可用,可能防火墙关了某些端口,尝试8080端口而不是gRPC文档中的50051端口
  • .proto文件中虽然是小写,但是在C#中成员变量会变为大写,所以以ide的补全为准!

Similar Posts

Comments

0