将新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#
这些API需要与模拟环境本身进行交互,因此很可能在 Unreal/Plugins
文件夹中实现。
-
simCreateVoxelGrid
API用于生成和保存环境的binvox格式网格 - WorldSimApi.cpp -
simAddVehicle
API用于在运行时创建车辆 - SimMode*, WorldSimApi 文件
物理相关API#
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的实现。
-
在服务器中添加一个RPC处理程序,它在 RpcLibServerBase.cpp 中调用您实现的方法。特定于车辆的API位于其各自的车辆子文件夹中。
-
在 RpcClientBase.cpp 中添加 C++ 客户端 API 方法。
-
在 client.py 中添加 Python 客户端 API 方法。如果需要,在 types.py 中添加或修改结构定义。
测试#
需要进行测试以确保 API 正常工作。为此,您需要使用源代码构建的 AirSim 和 Blocks 环境。除此之外,如果使用 Python API,您将必须使用源代码中的 airsim
包,而不是 PyPI 包。下面描述了两种从源代码使用该包的方法:
-
使用 setup_path.py。它将设置路径,以便使用本地airsim模块而不是pip安装的包。这是许多脚本中使用的方法,因为用户除了运行脚本外不需要做任何其他事情。将您的示例脚本放在
PythonClient
内的某个文件夹中,如multirotor
、car
等。您也可以创建一个文件夹以保持分离,并从另一个文件夹复制setup_path.py
文件。在文件中的import airsim
之前添加import setup_path
。现在将使用最新的主API(或当前检出的任何分支)。 -
使用 本地项目pip安装。常规安装将创建当前源代码的副本并使用它,而可编辑安装(在
PythonClient
文件夹内执行pip install -e .
)将在Python API文件更改时更改包。在处理多个分支或API尚未最终确定时,可编辑安装具有优势。
建议使用虚拟环境来处理Python打包,以免破坏任何现有设置。
提交PR时,请务必遵守编码规范。同时在Python文件中为API添加docstring,并请在脚本中包含任何示例脚本和所需的设置。