全7307文字
PR

Spotはクラ-サバモデルで制御
Pythonプログラミングが基本
大熊隼人、山本泰弘、堀口真吾=DigitalBlast

 Spotを専用コントローラー以外の機器を使って制御する場合は、パソコンなどで動作するプログラムからWiFiまたはEthernetケーブルを介してSpotのサービスを呼び出す。

 サービスのAPIの呼び出しには、gRPCという手続きを用いる(図4)。gRPCは米Googleが自社サービス開発用に開発したRPCの一種で、クライアント-サーバー型の通信プロトコルである。

図4 Spotのプロトコルスタック
図4 Spotのプロトコルスタック
gRPCを使って外部プログラムとSpotのサービスがクライアント-サーバーモデルで通信する。(図:Boston Dynamicsの図を基に日経クロステックが作成)
[画像のクリックで拡大表示]

 gRPCは特定の言語やプラットフォームに依存しない設計となっており、さまざまな言語向けにクライアントやサーバーを実装するためのライブラリーが公開されている。例えば、CやC++、C#、Objective-C、Java、Python、Node.js、Rubyなどから利用可能だ。プロトコルスタックはHTTPをベースとした構造となっている。Spotの場合は、Python用の開発パッケージが用意されており、gRPCの存在を意識することなくPythonでサービスを呼び出しながらのアプリケーション開発が可能となっている。

10種類のサービスで制御

 gRPCを使って利用できるSpotのサービスとしては、大きく9種類が用意されている。「GraphNav」「Missions」「ChoreoGraphy」「Docking」「State」「Control」「Data」「Base」「Payloads」である(図5)。

図5 9種類のSpotのサービス群
図5 9種類のSpotのサービス群
これに新たにArmサービスが加わっている。(図:Boston Dynamicsの図や文書を参考に日経クロステックが作成)
[画像のクリックで拡大表示]

 Spotのプログラミングを行う場合は、これらのサービスを呼び出しながら、一連の動作をさせることになる。なお2021年2月に新たなサービスとしてオプション機能であるロボットアームを操作する「Arm」が追加されて10種類となった(別掲記事「Spotに蛇の頭のような手が登場、ドア開けや弁の開閉が可能に」参照)。

 それぞれのサービスの内容をまとめると以下の通りになる。

GraphNav

 GraphNavは、Spotの位置や移動に関わるサービスである(表1)。あらかじめ登録された複数の経由地点と、それを巡る経路を持った地図(グラフ)データを基に、Spotに自律的な移動をさせられる。地図は、Spotで巡回させたい経路を歩かせて、記録したものを利用する。

表1 GraphNavサービスのAPI
API サービス概要
GraphNav Recording Service Spotを歩行させて地図を記録する
GraphNav Service 目的地や、そこまでのルートをSpotにインプットしたり、Spotに地図をアップロードしたり、Spotからダウンロードしたりできる

 GraphNavサービスを利用するには次のような4つの手順を踏む必要がある。

  1. Spotを歩行させて地図を記録する
  2. 記録した地図をSpotにアップロードする
  3. Spotの現在地を地図に初期設定する
  4. 地図上の経由地に移動するようにSpotに指示する

Mission

 Missionは、動作ツリーを使用してSpotの高度な自律動作を指定するサービスである(表2)。動作ツリーとはGraphNavに沿った目的地への移動や、目的地での画像撮影などの動作を記述したものである。この動作ツリーを使用することで、一連のタスクを実行する簡単な動作だけでなく、バッテリー残量が少なくなったときにSpotをドッキングステーションに戻すなどの、より複雑な動作を指定することが可能となる。

表2 MissionサービスのAPI
API サービス概要
Mission Service GraphNav Recording Serviceを使用して記録されたミッションをロードおよび再生する
Remote Mission Service Mission Serviceの中でペイロード(外部追加機器)を動作させるために利用される

ChoreoGraphy

 ChoreoGraphyは、スクリプト化された動きを創作することでSpotにダンスをさせることができるサービスである。振り付けは複数の動きを組み合わせたり、動作のパラメーターを変更したりすることにより多様性を持った動きを創作可能となる。なお、このサービスでは、安全機能を外した不安定な動作も許容するため、一般には公開されておらず、特別許可ライセンスを受けた開発者のみが利用できるサービスとなっている。

Docking

 Spotの最新バージョンである「Spot Enterprise」にはSpot Dockというドッキングステーションと連係する機能があり、ドッキング時に電源供給やSpotからのデータのダウンロードが可能である(表3)。DockingはSpotとSpot Dockのドッキングを制御したり、その状態を把握したりするためのサービスである。

表3 DockingサービスのAPI
API サービス概要
Docking Service Spotを制御し、Spot Dockを使用するためのインターフェースを提供する

State

 Stateは現在のSpotの物理的状態、取得したカメラ画像、周囲の地形や障害物などの情報をモニターできるサービスである(表4)。これらの状態情報を使用することでSpotの動作を決定できる。

表4 StateサービスのAPI群
API サービス概要
Robot State Service 計測された現在のSpotの状態(電源の状態やネットワーク通信状況など)に関する情報をモニターする
Image Service Spotやペイロードに搭載されているカメラの画像を取得する。またネットワークを介して送信されるデータサイズ削減のためにエンコードと圧縮の機能も利用可能
Local Grid Service Spotのボディーやセンサーの情報を使用して、近くの地形や物体を把握し、それらの情報は地図として保存する
World Object Service Spot周辺で検出された物体を追跡および保存する

Control

 ControlはSpotのモーターのオン/オフや立ち上がり・座り・移動などの動作、緊急停止や機能チェックなどを可能とするサービスである(表5)。Spotを移動させる際は、目的地の位置や移動速度などをパラメーターで指定して制御することができる。

表5 Controlサービスの主なAPI群
API サービス概要
E-Stop Service 異常が発生した際に緊急停止を行う。停止レベルは3段階(すぐにモーターの電源を切断する、Spotが座ってから切断する、切断しない)で設定が可能
Power Service モーターの電源をオンまたはオフにする
Robot Command Service Spotの立ち上がりや座らせの動作、指定した位置への移動などを行う

 Spotでは、Spot自体および周辺のオブジェクトを表すフレームがありこれを基準に位置や回転を記述する(図6)。Spotは、x、y、z軸を使用して3Dで空間を把握する。

(a)Spotで利用できるフレームの例
フレーム 概要
odom ロボットの運動学を使用して、Spotが起動した場所を基準に固定位置を推定する慣性フレーム
vision 固定位置を推定し、視覚的分析とSpotのオドメトリー(移動変位の計測)を使用して計算される慣性フレーム
body Spot本体の位置と方向を表すフレーム
flat_body Spot本体の位置と方向を表す重力方向のフレーム
gpe Spotの地面の推定値を表すフレーム
fiducial_XXX 生の基準検出を表すフレーム。「XXX」には基準のタグIDが入力される
filtered_fiducial_XXX フィルタリングされた、より安定した基準検出を表すフレーム。「XXX」には基準のタグIDが入力される
frontleft_fisheye センサーフレームの1つ。このフレーム名は、左前の魚眼カメラを表す。5台のカメラすべてに独自のセンサーフレーム名があり、正確なカメラセンサーの位置と向きを表す
(b)Spotのボディーのフレームの定義
(b)Spotのボディーのフレームの定義
[画像のクリックで拡大表示]
図6 Spot本体や周辺オブジェクトを表すフレーム
フレームを使ってその基準からの変位位置を指定することで、Spotを動作させることが可能である。(図表:(a)はBoston Dynamicsの情報を基にDigitalBlastが作成、(b)はBoston DynamicsのWebサイト)

 例えば、フロント左の魚眼カメラ(frontleft_fisheye)の場合、カメラのレンズと鉛直方向がz軸を指す。位置は、x軸とy軸は画像の水平/垂直寸法に合わせてカメラのレンズを基準に配置できる。x=0、y=0、z=1mのポイントは、レンズの中心にあり、カメラが向いている原点から1m前方の地点になる。こうしたフレームによる位置は、APIを通じて相互に変換することが可能である。

 平行移動は3要素のベクトル(x、y、z)で表現するが、回転は座標軸の方向間の変化を表すクォータニオン(w、x、y、z)で表現される。

クォータニオン=4次元の値を使って3次元ベクトル方向と、その回転を表す手法。回転の結合計算が容易にできる。

Data

 Dataは各種センサーのデータや画像を取得し、Spotのストレージ内に保存するためのサービスである(表6)。クライアントからSpotを制御する遠隔操作モードや記録されたミッションを再生することによって制御する自動歩行モードなどで使用できる(図7)。

表6 Dataサービスの主なAPI群
API サービス概要
Data Acquisition Service Spotのメタデータや画像を取得する
Data Acquisition Plugin Service ペイロードのセンサーなどからデータを取得する
Data Acquisition Store Service 後で検索できるようにデータをストレージに保存する
Data Buffer Service Spot本体にAPIを通じてデータを記録する
図7 Spotのデータ取得のモデル
図7 Spotのデータ取得のモデル
最終的にはSpotで取得したデータはストレージに格納されRESTを通じて端末に送られる。(図:Boston Dynamicsの図を基にDigitalBlastが作成)
[画像のクリックで拡大表示]

 データ取得の流れは次の通りだ。

  1. システムの初期化中に、データ取得サービス(Data Acquisition Service)は画像サービス(Image Service)とデータ取得プラグインサービス(Data Acquisition Plugin Services)からのキャプチャー機能のリストを集約する
  2. ユーザーはこのリストからアクションを構成する
  3. コントローラーまたはミッションサービス(Mission Service)は、データを取得するためにデータ取得サービスに取得要求を送信する
  4. データ取得サービスは、データを収集するために、適切な画像サービスとデータ取得プラグインサービスに取得要求を送信する
  5. 収集されたデータは、データ取得ストアサービス(Data Acquisition Store Services)を介してデータバッファサービスに送信される
  6. データバッファサービスは、取得したデータをファイルに書き込み、RESTインターフェースからダウンロードできるようにする

Base

 BaseはSpotを操作するために基本となるユーザー認証、サービスディスカバリー、および時刻同期が含まれるサービスである(表7)。Spotの起動時や各種サービスを使用する前にこのサービスを使用することで、各種サービスの呼び出しが可能になる。

表7 Baseサービスの主なAPI群
API サービス概要
Robot-id Service 通常Spot起動時にアクセスされ、Spotに関するメタデータを提供する
Auth Service Spotに対してユーザー認証を行い、ユーザートークンがrobot-idとauth以外のすべてのサービスに返される
Directory Service 現在Spotで実行されているサービスを検出する
Time-sync Service アプリケーションの時刻とSpotの時刻間のオフセットを推定し、これらの時刻を補正する

Payloads

 ペイロード(Payload)とは、Spotに接続される外部デバイスである。Spotには最大2つのペイロードと1つのロボットアームを取り付け可能である。Payloadsサービスは接続されたペイロードとのデータのやり取りやSpotが提供するサービスの一部を利用するために使う(表8)。

表8 PayloadsサービスのAPI群
API サービス概要
Payload Service 現在登録されているペイロードのリストをSpotに問い合わせる
Payload Registration Service 新しいペイロードを登録し、有効化するための認証トークンを取得する
Directory Service 固有のサービスに関する情報を取得し、リスト化する
Directory Registration Service サービスの登録や解除を行う

いざ、プログラミング

 では、実際にPythonのサンプルコードを使用してSpotを動かしてみよう。作成するのは、Robot Command Serviceを使用してSpotを指定の位置に動かすアプリケーションだ。このアプリケーションではSpotを1m前進後、左後方に1m(後方に1m、左方に1m)動くように指定する。

 まず、準備として、パソコンにPython 3.6または3.7のランタイムと、SpotのSDKパッケージである「package installer for Python」をインストールする注2)。SpotはWiFiのクライアントとして動作させ、プログラムが動作するパソコンと同じアクセスポイントに接続する。

注2)package installer for Pythonのインストールの詳細については、「https://dev.bostondynamics.com/docs/python/quickstart」を参照。

 実行したサンプルプログラムは図8の通りだ。サンプルプログラムは「Robot State Service」や「Robot Command Service」を用いて作成されており、下記のような構成となっている。

図8 Spotを動作させるサンプルプログラム
図8 Spotを動作させるサンプルプログラム
このプログラムを実行すると、前に1m進んだ後、後ろに1m、左に1m進む。(作成:DigitalBlast)
[画像のクリックで拡大表示]
  1. Spotの状態確認およびRobot Commandのセットアップ
  2. Spotを起動し、立ち上がらせる
  3. 現在位置を含むSpotの状態確認
  4. 目的地を指定する(1m前進した場所)
  5. 指定された目的地まで移動させる
  6. 現在位置を含むSpotの状態確認
  7. 新たな目的地を指定する(1m後方および1m左方の場所)
  8. 指定された目的地まで移動させる

 以上のようにSpotのAPIをプログラムからコールすることで、指定した動作をさせることが可能である。さらに多様なAPIを用いてアプリケーションを作成することにより、例えば光に反応してSpotを動かすことや、登録された地点まで自動歩行し画像を撮影して戻ってくるなどといった実用的なアプリケーションも開発できる。