主要内容

本页采用了机器翻译。点击此处可查看英文原文。

使用 gRPC API 以编程方式控制 RoadRunner

R2026b

RoadRunner 提供了一个 API,使您能够以编程方式控制 RoadRunner UI。例如,使用此 API,您可以:

  • 创建、加载和保存 RoadRunner 场景、情境和工程。

  • 将 ASAM OpenDRIVE® 文件导入场景中。

  • 将场景和情境导出为 RoadRunner 支持的文件格式之一。

RoadRunner 使您能够用各种编程语言编译 API 的版本,并以您选择的语言调用它们。或者,您可以使用 API 的预编译版本,以便从命令行控制 RoadRunner。

RoadRunner API 的工作原理

RoadRunner API 是使用开源 gRPC® 框架构建的。该框架使用客户端-服务器架构,其中客户端应用程序使用一组远程过程调用 (RPC)")方法远程控制服务器应用程序。在 RoadRunner 中:

  • 您本地安装的 RoadRunner 版本是服务器应用程序。

  • RoadRunner API 提供了用于远程控制 RoadRunner 的 RPC 方法。

  • 您编写的用于调用 RPC 方法的程序是客户端应用程序。gRPC 框架是语言中立和平台中立的。您可以在 gRPC 支持的任何平台和语言中编写调用 RoadRunner API 的客户端。有关 gRPC 支持的语言和平台的详细信息,请参阅 gRPC 文档。

该图显示了 API 架构的简化布局。在此图中,Python® 客户端使用 LoadScene 方法加载 RoadRunner 中的场景。

A Python client, myClient.py, calls the LoadScene RPC method to load a scene on the RoadRunner server.

RoadRunner API 如何发送和接收数据

RoadRunner API 的 RPC 方法在 gRPC 服务中定义。每次调用属于 gRPC 服务一部分的方法时,该方法:

  • 向服务器发送请求。

  • 接收服务器返回的响应。

此图显示了调用 LoadScene 方法的请求-响应格式。在客户端中,方法 LoadSceneRequest 的输入是客户端向 RoadRunner 应用服务器发送的请求。RoadRunner 处理该请求,加载场景,并发回响应 LoadSceneResponse。

The RoadRunner request-response relationship

这些请求和响应中的数据被构造为使用协议缓冲区 (protobuf)")模式定义的消息。Protobuf 模式是由 Google® 开发的语言中立格式,并针对快速高效的数据传输进行了优化。RoadRunner 服务器可以同时从这些 API 调用发送和接收数百万条 protobuf 消息,同时保持 RoadRunner 的实时更新。

Protobuf 模式中的消息在扩展名为 .proto 的文本文件中定义。这些消息包含定义以下内容的名称-值字段:

  • 您可以在消息中指定的字段的名称。

  • 字段的数据类型。例如,您可以将字段指定为布尔值、字符串或其他 protobuf 消息。

考虑 LoadScene RPC 方法的架构,如 roadrunner_service.proto 文件中所定义。

// Load scene 
rpc LoadScene (LoadSceneRequest) returns (LoadSceneResponse) {}

请求消息 LoadSceneRequest 和响应消息 LoadSceneResponse 的模式在 roadrunner_service_messages.proto 文件中定义。LoadSceneRequest 接受一个必需输入 file_path,它是一个指定要加载的文件路径的字符串。

message LoadSceneRequest
{
  // Scene file to load (required)
  string file_path = 1;
}

在 RoadRunner 处理请求(尝试加载场景)后,RoadRunner API 服务器将发回一个空的 LoadSceneResponse 消息作为响应。

message LoadSceneResponse
{
}

由于 protobuf 架构与语言无关,因此用于调用方法和格式化消息请求的语法取决于您用来编写客户端应用程序的编程语言。

连接到 RoadRunner API 服务器

要使用 RoadRunner API,您必须首先与 RoadRunner API 服务器建立网络连接。该服务器是您本地 RoadRunner 安装的一部分,当您打开工程时开始运行。

要以编程方式打开 RoadRunner 并启动 API 服务器,请从本地 RoadRunner 安装调用 AppRoadRunner 可执行文件。此可执行文件包含命令行选项,使您能够指定:

  • RoadRunner 开放的工程

  • RoadRunner API 服务器运行的 IP 网络端口

此命令行代码显示如何从 Windows® 上的默认安装位置打开 RoadRunner。RoadRunner 打开到位于 C:\RR\MyProject IP 网络端口 54321 上的工程。

cd "C:\Program Files\RoadRunner R2026b\bin\win64"
AppRoadRunner --projectPath C:\RR\MyProject --apiPort 54321

RoadRunner 的 Output 窗格显示 RoadRunner API 服务器正在运行的端口。

Output pane with RoadRunner API server message

从命令行使用 RoadRunner API

RoadRunner 提供了一个预编译的辅助命令 CmdRoadRunnerApi,使您能够从命令行调用 RoadRunner RPC 方法。此帮助程序命令与 AppRoadRunner 可执行文件位于同一文件夹中。

此代码调用 LoadScene 方法从打开的工程加载预构建的 FourWaySignal 场景。

CmdRoadRunnerApi "LoadScene(file_path='FourWaySignal')" --serverAddress=localhost:54321

RoadRunner scene containing a four-way intersection with traffic signals

在各种编程语言中使用 RoadRunner API

为了在使用 RoadRunner API 时获得更多灵活性,您可以将 API 编译为 gRPC 支持的语言,然后用该语言编写客户端应用程序以编程方式控制 RoadRunner。

编译 RoadRunner API

要用您想要的编程语言编译 RoadRunner API,您必须首先将定义 API 的 protobuf 文件复制到可写的文件夹中。这些文件位于您本地的 RoadRunner 安装中。然后,您可以使用 protobuf 编译器以及所需编程语言的 gRPC 插件来编译 RoadRunner API 的特定语言版本或绑定。例如,此图显示了 Python 和 C++ 绑定的生成。

Protobuf files compiled into Python and C++ bindings using the protobuf compiler and gRPC plugins.

有关编译 protobuf 文件的详细信息,请参阅 为 RoadRunner gRPC API 编译协议缓冲区。

创建 RoadRunner API 客户端

您编写的用于以编程方式控制 RoadRunner 的客户端通常包含执行以下步骤的代码:

  1. 从已编译的绑定导入 gRPC 代码。

  2. 建立与 RoadRunner API 服务器的本地网络连接。

  3. 使用导入的 gRPC 代码创建 RoadRunnerAPI 对象。该对象被称为桩件。

  4. 从此桩件调用 RPC 方法通过本地网络控制 RoadRunner。

这个简单的 Python 客户端显示了调用 LoadScene 方法的示例。

import grpc
from mathworks.roadrunner import roadrunner_service_messages_pb2
from mathworks.roadrunner import roadrunner_service_pb2_grpc

with grpc.insecure_channel("localhost:54321") as channel:
    api = roadrunner_service_pb2_grpc.RoadRunnerServiceStub(channel)
    loadSceneRequest = roadrunner_service_messages_pb2.LoadSceneRequest()
    loadSceneRequest.file_path = "FourWaySignal"
    api.LoadScene(loadSceneRequest)

导入已编译的 gRPC Python 绑定后,该客户端通过 gRPC 通道建立连接并为 RoadRunner 服务 API 创建桩件。API 的 gRPC 通道使用不安全的通道凭据,并且没有加密或身份验证。由于 RoadRunner 通常在本地机器上运行并且不连接到外部网络,因此安全风险较低。然后,客户端从 API 存根调用 LoadScene,该存根从当前打开的工程加载预构建的 FourWaySignal 场景。

您可以让多个客户端同时调用 RPC 方法,只要它们连接到同一网络端口上的 RoadRunner。例如,在此图中,Python 客户端和 C++ 客户端都通过网络端口 LoadScene 调用 54321。

A Python client, myClient.py, and C++ client, myClient.cc, calling LoadScene over port 54321.

另请参阅

主题