向 AirSim 添加新的 API#
添加新的 API 需要修改源代码。许多更改是机械的,并且是 AirSim 支持的各个抽象级别所必需的。下面列出了需要修改的主要文件,并附上了一些提交和 PR 以供演示。PR 或提交的特定部分可能在某些地方有链接,但查看完整的 diff 有助于更好地了解工作流程。此外,如果您不确定如何进行更改或需要获取反馈,请随时提交问题或 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 调用。
要添加 RPC 代码来调用新的 API,请按照以下步骤操作。其他 API 的实现请参见文件中定义的部分。
-
在服务器中添加一个 RPC 处理程序,该处理程序会调用您在 RpcLibServerBase.cpp 中实现的方法。特定于车辆的 API 位于其各自的 Vehicle 子文件夹中。
-
在 RpcClientBase.cpp 中添加 C++ 客户端 API 方法
-
在 client.py 中添加 Python 客户端 API 方法。如果需要,请在 types.py 中添加或修改结构体定义。
测试#
需要进行测试以确保 API 能够按预期运行。为此,您必须使用源代码构建的 AirSim 和 Blocks 环境。此外,如果使用 Python API,则必须使用源代码中的 airsim
软件包,而不是 PyPI 软件包。以下介绍了 2 种使用源代码软件包的方法
-
使用 setup_path.py 。它将设置路径,以便使用本地 airsim 模块而不是 pip 安装的软件包。许多脚本都使用这种方法,因为用户除了运行脚本之外无需执行任何其他操作。将示例脚本放在
PythonClient
中的某个文件夹中,例如multirotor
、car
等。您也可以创建一个单独的文件夹,然后从其他文件夹复制setup_path.py
文件。在文件中的import airsim
之前添加import setup_path
。现在将使用最新的主 API(或当前检出的任何分支)。 -
使用 本地项目 pip install 。常规安装会创建当前源的副本并使用它,而可编辑安装(在
PythonClient
文件夹中执行pip install -e .
)则会在 Python API 文件发生更改时更改包。在处理多个分支或 API 尚未最终确定时,可编辑安装更具优势。
建议使用虚拟环境来处理 Python 打包,以免破坏任何现有设置。
提交 PR 时,请务必遵循 编码指南 。此外,请在 Python 文件中添加 API 的文档字符串,并包含脚本中所需的所有示例脚本和设置。