ロボットはどのように通信するか:gRPCとWebRTCで分散ロボットを構築する
ロボット、ドローン、IoTデバイスのような分散マシンを構築している場合、すぐに2つの疑問が生じます。
- 構造化されたコマンドとデータを効率的に送信するにはどうすればよいですか?
- ネットワークが不安定な場合に、通信を回復力のあるものにするにはどうすればよいですか?
この記事では、オープンソースのロボットプラットフォームであるViamで使用しているアプローチを紹介します。このプラットフォームは、構造化されたRPCのためにgRPCを、P2PストリーミングのためにWebRTCを組み合わせています。ロボットを構築していなくても、同じアーキテクチャのアイデアが、よりスケーラブルで適応性の高いシステムを設計するのに役立つかもしれません。
ラボグレードのロボット技術と実世界システムとの間のギャップを埋める
ROS(Robot Operating System)は、特に研究や学術分野で、ロボットシステムの構築やプロトタイピングの長年の標準となっています。信頼性の高いローカルネットワークではうまく機能しますが、それはそのように設計されているからです。
しかし、今日のロボットは、厳密に管理された実験室のベンチにとどまっていません。工場、海上、あるいは遠隔地など、ネットワーク条件が予測不可能で、信頼性が重要になる場所で展開されています。
ROSは、標準でネットワーク通信を処理しません。インターネット経由でロボットと通信する必要がある場合、ソリューションのアーキテクチャは自己責任となります。現代のロボット工学には、ローカルLANプロトコル以上のものが必要です。クラウド対応、P2P、回復力のある通信スタックが必要です。
MQTTのような分散メッセージングスタックに依存したり、クラウド経由でコマンドを中継したりするのではなく、ViamはgRPCとWebRTCを使用してそのロボットプラットフォームを強化しています。これらのプロトコルを組み合わせることで、ROSの強みを補完する現代的な代替手段が提供されます。gRPCは、高速で効率的なProtobufシリアライゼーションを備えた、構造化された言語非依存のAPIを提供します。WebRTCは、低遅延のP2P接続を追加し、マシン間のセンサーデータやリアルタイムビデオのストリーミングに最適です。
一部のロボットビルダーは、ROSの上にgRPCインターフェースを重ねて、ROSの豊富なエコシステムとgRPCの最新のトランスポートおよびスケーラビリティを組み合わせています。
なぜgRPCがロボットにとって理にかなっているのか
現代のロボットは、固定環境における単一目的の機械ではなくなっています。それらは、センサー、認識サービス、制御ループと、しばしばリアルタイムで連携する必要がある、モバイルでマルチパートのシステムです。
gRPCは、いくつかの主要な方法でこれらのニーズをサポートします。
- 低遅延、リアルタイム制御:gRPCは連続的な双方向ストリームを可能にし、システムがロボットアームにリアルタイムの姿勢更新を送信し、追加の往復遅延なしにテレメトリを同時に受信できます。
- クロスプラットフォーム、マルチ言語の一貫性:gRPCは、Python、Go、C++などの言語のクライアントライブラリ(スタブ)を自動生成し、一貫したインターフェースで異なるデバイス、SDK、環境を容易に橋渡しできます。
- 軽量で効率的なシリアライゼーション:gRPCは、Protobufの軽量バイナリエンコーディングにより、帯域幅が制限された環境や組み込みデバイスでも役立ちます。
- セキュリティ上の利点:gRPCは、エンドツーエンド暗号化(デフォルトでTLS)と認証機能を組み込んで設計されており、開発者が個別のセキュリティレイヤーを追加する必要なく、ローカルネットワークまたはパブリックインターネットを介してマシンパーツ間の安全な通信を確保します。
- マシンパーツのサービス抽象化:gRPCとProtobufを使用すると、モーターからカメラ、センサーまで、ロボットのあらゆる部分を標準化された言語非依存のサービスとしてモデル化できます。


Viamの公開APIでは、各ロボットコンポーネントはProtobufを使用してgRPCサービスとして定義されています。アーム、カメラ、センサーなどのコンポーネントは、リモートから呼び出し可能な型指定されたメソッドを公開します。以下は、ロボットアームの基本的な移動と姿勢取得メソッドを定義するarm.protoファイルからの抜粋です。
// An ArmService services all arms associated with a robot
service ArmService {
rpc MoveToPosition (MoveToPositionRequest) returns (MoveToPositionResponse);
rpc GetEndPosition (GetEndPositionRequest) returns (GetEndPositionResponse);
rpc GetJointPositions(GetJointPositionsRequest) returns (GetJointPositionsResponse);
}
これらのprotoサービスは、SDKを生成して、マシンとの作業を支援できます。この例では、Python SDKを使用してアームを移動させます。内部的には、gRPCがコマンドをProtobufメッセージにエンコードし、HTTP/2(または環境によってはWebRTC)経由で送信します。
from viam.components.arm import ArmClient
arm = ArmClient.from_robot(robot=robot, name="my-arm")
# Move the arm to a target 3D position
arm.move_to_position(x=0.1, y=0.2, z=0.3, orientation=None, world_state=None)
なぜWebRTCもこの話の一部なのか
一見すると、gRPCとWebRTCは冗長に思えるかもしれません。どちらもデータをストリーミングし、構造化されたメッセージを送信できます。しかし、それらはロボット工学において非常に異なる課題を解決します。
WebRTCは、直接的なP2P接続に優れており、これは次のような場合に不可欠です。
- デバイスがローカルネットワーク上にあるか、NAT/ファイアウォールによって制限されている場合
- 中央リレーまたはクラウドサーバーをバイパスしたい場合
- マシン間で高帯域幅のセンサーデータ(リアルタイムビデオやLIDARなど)をストリーミングする場合
Viamは、オーケストレーションのためにgRPCを、基盤となるトランスポートとしてWebRTCを使用し、これらを組み合わせて、最小限のルーティングオーバーヘッドで高速な構造化メッセージングを実現します。
gRPCによる柔軟なトランスポートレイヤー
WebRTCは分散マシンでP2P通信を可能にしますが、gRPCは基盤となるトランスポートレイヤーを交換できる柔軟性も提供します。
WebRTCおよびその他のトランスポートプロトコル上で動作するgRPCサーバーの例があります。Viamはまた、viam-serverと内部モジュールの間のローカルメッセージングにUnixドメインソケット(UDS)を、マシンのプロビジョニングやネットワークトラフィックのプロキシにBluetoothを、組み込みペリフェラルにシリアルポートを使用しています。
gRPCはAPIレイヤーで一貫したインターフェースを定義しているため、クライアントロジックを書き直すことなく、環境やデバイスに応じてトランスポートを変更できます。これは、クラウド、ローカル、および制約のあるネットワークにまたがるシステムを構築する際に大きな強みとなります。
実例:クレーンゲームの連携
アーケードにあるような、リモートコントロールのクレーンゲームを想像してください。カメラとロボットアームの2つの主要コンポーネントがあります。Webアプリケーションやモバイルアプリのようなユーザーインターフェースは、制御コマンドを送信し、賞品をガイドするのに役立つライブビデオストリームを受信します。


以下は、gRPCとWebRTCが舞台裏でどのように連携するかです。
- 初期化:システムは、HTTP/2経由のgRPCを使用して制御チャネルを確立します。各コンポーネントは、サービス(例:
ArmService、CameraService)を登録します。 - 接続:gRPCは、SDKとマシンパーツの間のWebRTCセッションを設定するために、ピアメタデータとシグナリングの交換を調整します。
- リアルタイム操作:WebRTCは、ピア間のメディアおよびデータストリームを直接処理します。コマンドはgRPCメソッド呼び出しを使用して送信され、WebRTCトランスポート経由でルーティングされます。ビデオおよびセンサー ストリームは反対方向に流れます。


このデュアルプロトコルアプローチにより、予測不可能なネットワーク条件下でも、リアルタイムの相互作用、スムーズなストリーミング、および回復力のあるフォールバック動作が可能になります。
なぜこのパターンがより広範なコミュニティにとって重要なのか
gRPCの構造とWebRTCの柔軟性の組み合わせは、ロボット工学だけでなく、次のようなものが必要なあらゆる場所で、新しいクラスの分散システムへの扉を開きます。
- 疎結合システム間のリアルタイム双方向通信
- 言語とデバイスを横断する、型指定されたバージョン管理されたAPI
- 必要に応じてP2Pに移行できる、トランスポートに依存しない柔軟性
gRPCが会話を構造化し、WebRTCがネットワークを横断してそれを伝送します。
Viamによるリアルタイムロボット制御
gRPCは、単純なリクエスト/レスポンスAPIを超えて進化しました。ロボット工学以外の多くの業界で、機械が通信する方法はかつてないほど重要になっています。gRPCとWebRTCは、単に高速なプロトコルではなく、次世代の分散型、回復力のある、インテリジェントな機械の、影響力のあるビルディングブロックです。
デバイス、環境、ネットワーク間で互いに通信する必要があるシステムを構築している場合は、よりスケーラブルで適応性の高い通信レイヤーを検討する時期かもしれません。
同様のスタックを独自にエンジニアリングすることも可能ですが、Viamはこれらの機能をすぐに利用できるように提供しています。オンマシン機能はオープンソースで無料で利用でき、フリートにスケールアップする際には、使用量ベースのモデルでオプションのクラウドサービスが利用可能です。
技術レビュー:Nick Hehr (Viam)