このページの本文へ

車とスマホがつながるSDLの世界 第5回

【SDLアプリ作りの実際】クラウド型シュミレーターで作るロボホンSDLアプリ

クルマがしゃべる未来って? ロボホンとクルマをつないでみた

2018年12月28日 09時00分更新

文● 久田智之(株式会社アナザーブレイン )

提供: SDLコンソーシアム 日本分科会

  • この記事をはてなブックマークに追加
  • 本文印刷

家庭用ロボットを何かと繋ぐと表現力や役割が増す

 クルマってよく映画やアニメで擬人化されますよね。 『ナイトライダー』(80年代の米国テレビドラマ)から『カーズ』(ディズニー映画)まで。実際にそれが現実のものになったら、ひとは、どう感じるんだろう。ひととクルマの距離って近づくのだろうか?

 そういう未来を感じてみたいな、試してみたいな、と思っていたところ、Smart Device Link (SDL) という、クルマとスマホアプリをつなぐ オープンソースの規格があることを知りました。AndroidスマホやiPhone用のSDLアプリを書けば、カーナビなどのSDL対応機車載機の画面をアプリで表示して操作できる。

 ヒューマンインターフェイスとして、車載機の液晶画面だけでも擬人化できるのかもしれませんが、体験をより豊かにするため、Android OSで動いているシャープ製のロボット、ロボホンに登場してもらうことにしました。

 個人的に、ロボホンをはじめとする家庭用ロボットは、なんらかの電子機器とつながることでより表現力や役割がつくのではないか? と思っています。そんなわけで、いままで業務用ビールサーバーや、BB弾を発射するおもちゃの銃とをBLE(Bluetooth Low Energy)でロボホンと接続するなど、いろいろと試してきました。今回は、なんとクルマとつなげられるなんて! クルマ=絶好のガジェットですかね?

 ということで、今回、ロボホンとクルマをSDL規格でつないでみたらこんなことになりました。クルマに乗ってアプリを起動すると「シートベルトはつけたかな。確認してね」、パーキングブレーキを解除すると「よーし、出発進行!」とロボホンが喋る。



 次が、ワイパーが動いたらロボホンが「「♪雨、雨、ふれふれかぁさんが」と歌いだす。



 そして、バックギアが入ったら「ピーピーピー、バックします。ご注意ください」と喋ります。



 これらを含めて7つのフィーチャーを盛り込んだSDLアプリを作ってみましたので、その方法を説明したいと思います。Androidアプリを作った経験のある人ならチャレンジできる内容になっています。

SDLアプリの作り方

 SDLは、日本の自動車メーカー10社も参加するクルマとスマホを繋ぐためのオープンソースの国際規格です。カーナビがSDL規格に対応していれば(対応機の本格的な発売は2019年から)、いままで決まりきった画面しかなかったカーナビの画面が、スマホのようにバラエティに富んだ世界になるというものです。

 このとき、スマホ側から見て、カーナビなど車載機はいわばスマホの入出力デバイスのように機能します(USBかBluetoothで接続)。そして、その車載機はクルマと繋がっています。AndroidやiPhoneのアプリを作ることで、SDL対応カーナビの画面にいろんな画像やビデオを表示したり、逆に、画面をタッチしてアプリを操作できるわけです。

 Android OSやiOS用のSDLアプリを開発するには、SDL機器やクルマの役割をどのように実現するかによって次の3つの方法があります。

1)「SDL Development Toolkit」など実機デバイスを入手しクルマと繋ぐ
2)「Manticoe」(クラウド SDLデバイスシミュレーター)を利用する
3)「SDLデバイスシミュレーター」をローカルのLinux環境でセットアップして利用する

 SDL Development Toolkitは、アスキーストアで約4万円で販売されています。今回、それを入手して愛車の スズキ ハスラー にも繋いでみたのですが、欲しい車両情報をすべてを取得できなかったためSDL コンソーシアムが準備している「Manticore」というSDLデバイスシミュレーターを用いて、開発やデバッグを行いました。

Manticore(クラウド型のSDLデバイスシミュレーター)の起動方法

 Manticoreは、SDLアプリを最も簡単に試せるSDLデバイスシミュレーターです。クリックひとつで立ち上がりとても便利です。まずSDLアプリ開発を試してみるならこれを第一歩にするのがお勧めです。

1)Manticore のページにアクセスします(Google Chrome で試しました)。

 URLはコチラです。ここで、ユーザー登録やログインが促されます。適宜、ユーザー登録など行ってください。すると、次のようなManticore の画面が表示されます。

 ここで、"Launch Manticore" をクリックしましょう。

2)画面の右下に、SDLデバイスシミュレーターが立ちあがっている状態が表示されます。

 この画面では"1 user ahead of you" と表示されています。日本だけでなく米国など世界中からこのクラウド型のシュミレーターは利用されますが、同時に利用できる人数には制限があるらしく、これは1人が利用を待っている状態です。ときには、8名や10名が待っているときもありますが、これは気長に待つしかありません。

3)しばらくすると、画面右下が切り替わります。

 この画面では任意の5桁のポート番号とIPアドレスが与えられます。この2つの情報を Androidアプリに与えることで、ManticoreのSDLデバイスシミュレーターに接続される仕組みです。この画面の最大化ボタンをクリックしてみましょう。

4)画面が大きく表示されます。まだ操作はできません。

 次に、SDLアプリを起動します。具体的にはAndroidの開発環境であるAndroid Studioを立ち上げて、コチラにあるhellosdlandroidで試してみましょう。

 以下のSDLService.java のポート番号とIPアドレスを、Manticoreで与えられた情報に変更して、ビルド、実行してみましょう。


5)すると、Manticoreの画面が切り替わります。

 Manticoreの画面は、おおきく3つの要素で構成されています。

●いわゆるカーナビのディスプレイ部分
●シミュレーターのログ
●自動車のステータスをシミュレート操作するコントロールパネルです。

6)カーナビのディスプレイ部分に表示されたアイコンをクリックすると、

 helloandroidアプリが表示されます。

7)その状態で、自動車のステータスを変更したかったら、画面右側のコントロールパネルで操作します。

 たとえば "Body Information”をクリックすると次のように表示されます。

●Drive Door ajar : 運転席のドアが半ドアかどうか
●Ignition Stable Status : イグニッションの安定性の状態
●Ignition Status: イグニッションの状態
●Park Brake Active: パーキングブレーキがアクティブか

 上記の車の状態を変更・シミュレートすることができます。変更できるステータスは、スピードやガソリンタンク残量、シートベルト状態などさまざまあるので確認しましょう。

 これによって、クルマの状態を変化させそれを読み取って動作するアプリの開発・テストができるわけです。Manticoreは、スマホアプリの開発者なら簡単に試せますので、まずはManticore でアプリを開発し、デバッグがある程度終わったらアプリを実機で動作させてみる。それによって、クルマとつながるアプリを体感・体験し、改良をフィードバックするような開発スタイルがベストではないかと思います。

ロボホンとクルマをSDLでつないでみる

 さて、今回は、ロボホンを使ったSDLアプリを開発しました。ロボホンもスマホの1つなので、Android用のSDLアプリも同じような手順と考えてください(ロボホンならではの部分がありますが)。開発したアプリのソースコードは、以下で公開しています。

 URL:https://github.com/hisayan/sdlwithrobohon

 今回は、「クルマのステータスの変化をロボホンが察知し、状況に応じて、話したり歌ったりする」動作をいろいろ実装してみました。アプリのシナリオは、次のとおりです。

●シートベルトをしてなかったら「シートベルトはつけたかな。確認してね」
●パーキングブレーキがOFFになると「よーし、出発進行!」
●ギアがバックにはいると「ピーピーピー、バックします。ご注意ください」
●105km/h こえたら「キンコン、キンコン」と言う
●ガソリンが減ってきたら「ガソリンがすくなくなってきたよ。そろそろガソリンスタンドに行ったらどうかな?」
●ワイパーが動いたら「♪雨、雨、ふれふれかぁさんが」と歌い出す
●77777km になったら「やったー、走行距離がオールセブンだよ。なにかいいことあるかなぁ」

 これらをSDLの機能を使って実現していくわけですが、SDLが持つ機能としては以下のようなものがあります。

1)車載機の画面に、あらかじめSDLで定められたテンプレートに沿って、画像やテキスト、ボタン、メニューなどを表示する
2)車載機の画面に、アプリから比較的自由に、画像(やストリーミング)を表示する
3)車載機の画面に表示されたボタンなどをタッチしたときに、アプリに通知する
4)クルマのステータスを、アプリ側から任意のタイミングで取得する
5)クルマのステータス変更を、アプリ側で察知 (Listen) する
6)クルマのオーディオ等とアプリが連動する

 今回のシナリオを実現するために、このアプリでは、こられのうち主に5を、一部で4を利用しています(デバッグ用に、ログをディスプレイ表示するために1も利用していますが、ここでは触れません)。

 Androidアプリですが、ロボホンの「テンプレートプロジェクト」から開発を開始しました。テンプレートプロジェクトとは、ロボホンが「〜したら〜する」といった動作を定義しやすいよう準備されているもので、そのやり方については、ロボホンSDKについている各種ドキュメントを参考にしてください。

 新規プロジェクトを作成したら、SDL mobile library for Android を、そのプロジェクトで使えるよう設定します。これは、build.gradle の dependencies に、一行追加するだけです。


dependencies {
    implementation 'com.smartdevicelink:sdl_android:4.+'
}

 ※実際のソース


 つづいて「クルマのステータス変更を、アプリ側で察知」するようなプログラムを書いていきます。Step 1〜4 という段階にわけて、プログラムの動きを紹介します。

 アプリの主機能は、MainActivity.javaに、SDLの各種コントロールは、SDLService.javaに書いていきます。

 SDLService ですが、こちらは、SmartDeviceLink mobile library for Android に含まれている、hellosdlandroid をベースにしています。公開されているソースコードから、適切な部分を借りてきました。 具体的にはコチラです。

(1) クルマ側のステータス変化を察知するようにする

 これには、SubscribeVehicleData という命令を利用します。名前から想像できるように、クルマのステータス(の変化)を監視する命令です。この命令は、タイミング的に、SDLとアプリのリンクが確立した直後くらいが適切です。SDLService に、performWelcomeShow という関数がありますので、それが完了したタイミングで、呼び出すようにします。


private void performWelcomeShow() {
    @Override
    public void onComplete(boolean success) {
        if (success){
            // ここに SubscriveVehicleData を追加
        }
    }
}

 この、監視できるクルマのステータスについては、SDLコンソーシアムが提供されているドキュメントに一覧が掲載されています。コチラをご覧ください。

 ですが、それぞれの項目ごとに「任意のタイミングで取得できる」「変化を監視し取得できる」「取得できない」などの権限の違いが、車種やメーカー、SDLデバイスによって変わってくることがあるようです。そのため、実際のアプリ開発には配慮が必要ですが、今回は、すべてを監視できる環境を想定して開発してみました。開発環境のSDLデバイスシミュレーターの Manticore は、すべてを監視し取得できるようになっています。

 例えば、スピードの変化を監視したい場合は、次のようなソースコードとなります。


SubscribeVehicleData subscribeRequest = new SubscribeVehicleData();
subscribeRequest.setSpeed(true);
subscribeRequest.setOnRPCResponseListener(new OnRPCResponseListener() {
    @Override
    public void onResponse(int correlationId, RPCResponse response) {
        if(response.getSuccess()){
            Log.i("SdlService", "Successfully subscribed to vehicle data.");
        }else{
            Log.i("SdlService", "Request to subscribe to vehicle data was rejected.");
        }
    }
});
sdlManager.sendRPC(subscribeRequest);

 ※ 実際のソース


(2) SDLService に、SDLManagerListener を用意する

 Step 1で、監視を開始しました。その変化がイベントとして発生したときに呼び出されるリスナーを準備します。

 hellosdlandroid のSDLServiceには、すでに SDLManagerListener が宣言されていますので、そこに追記します。たとえば、スピードを監視していて、その変化を監視(Listen)するためには、このようなソースコードとなります。


SdlManagerListener listener = new SdlManagerListener() {
    @Override
    public void onStart() {
        // SubscribeVehicleData
        sdlManager.addOnRPCNotificationListener(FunctionID.ON_VEHICLE_DATA, new OnRPCNotificationListener() {
            @Override
            public void onNotified(RPCNotification notification) {
                OnVehicleData onVehicleDataNotification = (OnVehicleData) notification;
                Double speed = onVehicleDataNotification.getSpeed();
                if (speed != null) {
                    Log.i("SdlService", "Speed was updated to: " + speed);
                }
            }
        }
    }
}

 ※ 実際のソース


(3) MainActivity に、SDLService からのイベントリスナーを用意する

 これは SDL というより Androidアプリ開発のお作法ですね。Service と Activity が連動するための仕組みを用意します。

 ※ 実際のソース

SDLService.java で、BroadCast する

MainActivity.java で、SDLServiceのイベントレシーバーを定義する。

MainActivity.java で、SDLServiceのイベントレシーバーを登録する

(4) ロボホンが話したり歌ったりするように

 こちらは、ロボホンアプリ開発のお作法ですね。ここでは詳しくは取り上げません。ロボホン SDK ドキュメントを参考にしてください。

 次に、具体的なシナリオごとに、抜粋します。

■ シートベルトをしてなかったら「シートベルトはつけたかな。確認してね」

 動作のようすは冒頭の動画。

Step 1)

Step 2)

 このコードでは、

 Step 2-1) パーキングブレーキ解除を感知
 Step 2-2) 続いて GetVehicleData で、シートベルトの状態を取得し、していなければ「シートベルトを確認してね」も実装しています。
Step 3)

■パーキングブレーキがOFFになると「よーし、出発進行!」

Step 1) 上記 "シートベルトをしていなかったら" と同じです。
Step 2) 上記 "シートベルトをしていなかったら" と同じです。
 このコードでは、
 Step 2-1) パーキングブレーキ解除を感知
 Step 2-2) 続いて GetVehicleData で、シートベルトの状態を取得し、していれば「出発進行!」も実装しています。
Step 3)

■ギアがバックにはいると「ピーピーピー、バックします。ご注意ください」

Step 1)

Step 2)

Step 3)

■ 105km/h こえたら「キンコン、キンコン」と言う。



Step 1)

Step 2)

Step 3)

■ガソリンが減ってきたら「ガソリンがすくなくなってきたよ。そろそろガソリンスタンドに行ったらどうかな?」



Step 1)

Step 2)

Step 3)

■ワイパーが動いたら「♪雨、雨、ふれふれかぁさんが」と歌い出す

 動作のようすは冒頭の動画を参照。

Step 1)

Step 2)

Step 3)

■77777km になったら「やったー、走行距離がオールセブンだよ。なにかいいことあるかなぁ」



Step 1)

Step 2)

Step 3)

 このように、とても簡単に、ロボホンとクルマをつなぐことができました。

まとめ

 SDLでのプログラミングは、次の2つの繰り返しになっているといえます。

1)イベント発生を監視(Listen)する準備をする
2)イベントが実際に発生したら、なにかしら動作させる

 いわゆるイベント駆動形プログラミングです。Android アプリのお作法になれていたら、とてもスムースに開発することができると思います。

 とはいえ、まだまだSDLは発展途上なところもあり、私がこのアプリを開発していた間にも、SmartDeviceLink mobile library for Android のバージョンがあがり、命令系に変更があり戸惑うこともありました。

 そんなときも、SDLはオープンソースプロジェクトです。コミュニティが Slack で立ち上がっていて活発に交流がなされています。開発中にバギーな動きに出会ったりしたときは、そこで相談するのもよいかもしれません(英語でのコミュニティではありますが)。

 URL:http://slack.smartdevicelink.com/

 最後に、ロボホンはそれ自体が個性がある(個性が設定されている)ため、実際にアプリを動かし、体験してみると、クルマを擬人化したというより、クルマと人間をつなぐコンシェルジュのようなロボットができあがったように感じています。

 とはいえ、きちんと、未来のドライブ体験を感じられるアプリに仕上がったのではないでしょうか! よりユーザー体験が具体化するので、SDL実機を入手することができれば、さらにアプリを進化させてみたいです。




 SDLアプリのコンテストが開催されています。今回紹介したManticoreを使ったシュミレーションの状態で応募できます。クルマの中でどんな体験ができるのか? ちょっとしたアイデアで楽しいことができそうです。

(提供:SDLコンソーシアム 日本分科会)

【SDLアプリコンテストの開催概要】

■名称:クルマとスマホがつながる SDLアプリコンテスト
■主催:SDLアプリコンテスト実行委員会
   (事務局:角川アスキー総合研究所)
■協力:SDLコンソーシアム日本分科会
■募集内容:SDLを利用したAndroid、またはiOSアプリ
■応募期間:2018年10月3日(水)〜2019年1月31日(木)
■応募方法:コンテスト専用サイトにて( http://sdl-contest.com/
      以下を提出してください。
  (1)応募作品の動きがわかる動画および画像
  (2)作品内容の説明資料(PDF)
■受賞発表:事務局による事前審査の結果発表は、2019年3月上旬を予定しています。
      その後、最終審査会を兼ねた受賞発表・表彰式を2019年2月末に予定しています。
      事前審査通過者は、最終審査会でプレゼンテーションをしていただきます。
■賞・賞金等:グランプリ 賞金50万円+副賞
       特別賞   賞金10万円×5本

カテゴリートップへ

この連載の記事

編集部のお勧め

ASCII倶楽部

ASCII.jp Focus

MITテクノロジーレビュー

  • 角川アスキー総合研究所
  • アスキーカード
ピックアップ