在unity3d使用微软的Airsim

在unity3d使用微软的Airsim

最近要用unity3d来集成微软的airsim,关于unity3d使用airsim的案列较少,并且官方对于airsim在uinty3d上还是实验阶段。看样子,不打算更新对uinty3d的使用demo的开发了。

使用前期准备

  1. 官网clone仓库,按照文档进行安装。

  2. 下载MessagePack.Unity.unitypackage,并导入到UnityDemo。

    在准备实现rpc调起airsim API之前,可以先尝试运行下UnityDemo,仓库里有很多已经实现rpc调起airsim API的demo,都是c++或python项目,这些demo都是启动一个进程,通过tcp连接到Unitydemo开启的airsim 服务端口,41451(默认airsim服务端口)。

    这种方式不符合我的需求,我需要直接通过unity,直接调起airsim 的API,而不是通过另一个进程,这时候,就需要自己在unity里,通过tcp去实现一个rpc了。

Unity APIs-AirSim

这个是目前unity支持的API,可以通过rpc调起。

典型RPC数据包内容

一个典型的RPC数据包一般包含以下内容:

  1. 方法名:要调用的远程方法的名称。
  2. 参数:方法所需的参数,可能是基本数据类型或复杂对象。
  3. 请求ID:用于匹配请求和响应,确保通信的可靠性。
  4. 其他元数据:如认证信息、上下文信息等(可选)

这是我自己定义的一个发送rpc的数据结构。

[MessagePackObject]
public class RpcRequest
{
    [Key(0)]
    public int type { get; set; }

    [Key(1)]
    public int id { get; set; }

    [Key(2)]
    public string method { get; set; }

    [Key(3)]
    public object[] _params { get; set; }
}

通过运行AirSim的例子,可以查看得到,airsim服务接收处理的数据结构。这里举个例子,让无人机起飞,takeoff指令,发送出去的数据结构是这样的:

[
   0,
   3,
   "takeoff",
   [
   	5,
   	"SimpleFlight"
   ]
]

我是通过运行python demo,打印出发送给airsim server 字节数组的hex,94-00-03-A7-74-61-6B-65-6F-66-66-92-CA-40-A0-00-00-AC-53-69-6D-70-6C-65-46-6C-69-67-68-74,解析出来的,指令大部分都是这样的一个结构。

很明显了,takeoff,就是unity支持的API里的一个rpc指令了,airsim 服务端就要找相应的函数,去执行命令,当然,还有相应的参数,这里的takeoff后面的参数,就是5,SimpleFlight。通过TCP,把RpcRequest这样的数据发送给airsim server,就可以调起airsim 的API了。

序列化要发送的数据

在发送数据到airsim server之前,肯定是要把RpcRequest这样的数据进行序列化的,MessagePack-CSharp 官网有如何在unity平台,序列化自定义的数据类型的说明,在mono平台的话,更简单一些,如果是IL2CPP,还需要安装mpc工具,把自己定义的数据类型,生成AOT代码。这里就不赘述了,官网都有介绍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值