将新API添加到AirSim#

添加新API需要修改源代码。大部分修改是机械性的,并且是AirSim支持的各种抽象级别所必需的。下面描述了需要修改的主要文件,并附带了一些用于演示的提交和PR。PR或提交的特定部分可能在某些地方被链接,但查看整个差异将有助于更好地了解工作流程。此外,如果对如何进行更改或获取反馈不确定,请不要犹豫地提出问题或草稿PR。

实现API#

在添加包装器代码来调用和处理API之前,需要首先实现它。具体实现文件因其功能而异。下面给出了一些可能有助于您入门的示例。

基于车辆的API#

moveByVelocityBodyFrameAsync API用于多旋翼飞行器X-Y坐标系中的基于速度的移动。

主要实现在 MultirotorBaseApi.cpp 中完成,其中实现了大部分多旋翼API。

在某些情况下,可能需要额外的结构来存储数据,getRotorStates API 是一个很好的例子,其中 RotorStates 结构在两个地方定义,用于从RPC到内部代码的转换。它还需要修改AirLib以及Unreal/Plugins进行实现。

这些API需要与模拟环境本身进行交互,因此很可能在 Unreal/Plugins 文件夹中实现。

simSetWind API展示了修改物理行为并为此添加API + 设置字段的示例。有关代码的详细信息,请参见该PR

RPC封装器#

这些API通过 Tamás Szelei 开发的 rpclib 使用基于 TCP/IP 的 msgpack-rpc 协议,允许您使用 C++、C#、Python、Java 等多种编程语言。当 AirSim 启动时,它会打开端口 41451(这可以通过设置更改)并监听传入请求。Python 或 C++ 客户端代码连接到此端口并使用 msgpack 序列化格式发送 RPC 调用。

要添加调用新API的RPC代码,请遵循以下步骤。遵循文件中定义的其他API的实现。

  1. 在服务器中添加一个RPC处理程序,它在 RpcLibServerBase.cpp 中调用您实现的方法。特定于车辆的API位于其各自的车辆子文件夹中。

  2. RpcClientBase.cpp 中添加 C++ 客户端 API 方法。

  3. client.py 中添加 Python 客户端 API 方法。如果需要,在 types.py 中添加或修改结构定义。

测试#

需要进行测试以确保 API 正常工作。为此,您需要使用源代码构建的 AirSim 和 Blocks 环境。除此之外,如果使用 Python API,您将必须使用源代码中的 airsim 包,而不是 PyPI 包。下面描述了两种从源代码使用该包的方法:

  1. 使用 setup_path.py。它将设置路径,以便使用本地airsim模块而不是pip安装的包。这是许多脚本中使用的方法,因为用户除了运行脚本外不需要做任何其他事情。将您的示例脚本放在 PythonClient 内的某个文件夹中,如 multirotorcar 等。您也可以创建一个文件夹以保持分离,并从另一个文件夹复制 setup_path.py 文件。在文件中的 import airsim 之前添加 import setup_path。现在将使用最新的主API(或当前检出的任何分支)。

  2. 使用 本地项目pip安装。常规安装将创建当前源代码的副本并使用它,而可编辑安装(在 PythonClient 文件夹内执行 pip install -e .)将在Python API文件更改时更改包。在处理多个分支或API尚未最终确定时,可编辑安装具有优势。

建议使用虚拟环境来处理Python打包,以免破坏任何现有设置。

提交PR时,请务必遵守编码规范。同时在Python文件中为API添加docstring,并请在脚本中包含任何示例脚本和所需的设置。