はじめに
SDV(Software Defined Vehicle)は、資料やスライドだと概念の話が中心になりがちで、「結局どう動くの?」が掴みにくいと感じていました。 そこで、趣味で ラズパイ(Raspberry Pi 5)を搭載したラジコンカー(PiCar-X)の上に、SDV 風のソフトウェア構成を載せて実機を動かす ことにしました。
この記事では次の流れで進めます。
- 用意したもの
- GitHub で見つけた SDV 系リポジトリの紹介(何を参考にするか)
- PiCar-X にどうマッピングするか(設計)
- 実際の構築手順
- 動かしてみた結果・今後
「本物の SDV を作る」のではなく、SDV の考え方(ハードウェア抽象化・信号の標準化・アプリの分離)を小さな実機で体験する ことがゴールです。
用意したもの
| もの | 用途 |
|---|---|
| PiCar-X(Raspberry Pi 用) | 実機。モーター、ステアリング、カメラ用サーボ、超音波センサ等を載せたラジコンカー |
| microSD カード 256GB | ラズパイの OS・コンテナイメージ・ログ置き場。余裕を持たせたいので大きめを選びました |
| Raspberry Pi 5 | PiCar-X に載せる本体。車載コンピュータ役 |
- PiCar-X:
PiCar-X は、ラズパイをコントロール中枢にして、左右の駆動モーターとステアリング/カメラ用サーボを専用の Robot HAT で制御する構成です。ソフトは Python で書け、公式のライブラリが GitHub で公開されています。
なお PiCar-X のキットにはラズパイ本体は付属しません。SunFounder の製品ページでは、対応ボードとして Raspberry Pi 5 / 4 / 3B+ などが挙げられており、今回はその中から Pi 5 を選びました。Pi 5 を選んだ理由はできるならなるべく高いスペックで動かしたいよね。 それこそADASとかで動かすかもしれないし、そういう余裕しろのためになるべくいいモノに。
GitHub の SDV 系リポジトリを調べてみた
「SDV」で GitHub を検索すると、Eclipse SDV 関連がまとまって見つかります。今回、構成の参考にしたものを紹介します。
1. eclipse-sdv-blueprints/service-to-signal
「車両のサービスを、実際のハードウェアにつなぐ」ことを見せるサンプルです。
COVESA の VSS(Vehicle Signal Specification)で定義された Vehicle.Body.Horn.IsActive というシグナルを Eclipse Kuksa Databroker で管理し、そのシグナルと Zenoh 経由のメッセージを橋渡しして、ホーンのハードウェアを動かす、という構成になっています。
→ PiCar-X に一番マッピングしやすい題材。「ホーンのシグナルが true になったらスピーカーを鳴らす」を PiCar-X でやれば、そのまま実機版になります。
2. eclipse-velocitas/vehicle-app-python-sdk(と vehicle-app-python-template)
車両アプリ(Vehicle App)を Python で書くための SDK とテンプレートです。サンプルにはシート調整アプリがあり、MQTT で受けた要求を、アクチュエータ用のデータポイント経由で制御する流れが示されています。
→ アプリ層を「車両ハードウェアの詳細を知らない形」で書く考え方の参考にします。
3. eclipse-sdv-blueprints/fleet-management
車両のデータを VSS の形でバックエンドへ送り、Grafana のダッシュボードで見る、というブループリントです。センサ値の代わりに CSV の再生データを Kuksa の CSV Provider で流し込み、Docker Compose で一式起動します。
→ 「CSV の代わりに PiCar-X の実センサ値 を流し込む」ことで、実機版にできそうです。
4. SEA-ME(PiRacer 系の教育プロジェクト群)
SDV/SdV 人材育成を掲げる教育プログラムの GitHub で、ラズパイ + ラジコンカー(PiRacer) を題材に、メータークラスタやヘッドユニットの Qt アプリ、車線検出、OTA など、実機で SDV を学ぶリポジトリが並んでいます。
→ 発想はまさに今回のやりたいことと同じ。「小さな実機で SDV を学ぶ」先行事例として、全体像の参考になります。
5. boschresearch/kuksa.hardware(Eclipse KUKSA CANOPi)
Raspberry Pi Compute Module 4 向けのベースボードで、CAN-FD や OBD-II を備え、実車でのプロトタイピングを想定したハードです。
→ PiCar-X には CAN がないため今回は使いませんが、「本物の車ならここが CAN になる」という 対比 として押さえておく価値があります。
6. Donkeycar(Python 自動運転ライブラリ)
ラズパイ搭載のラジコンカー向けライブラリで、「パーツ」をパイプライン状に並べ、車両ループの中で毎周期、入力を読んで出力を書く、という設計です。
→ SDV とは用語が違いますが、「ハードウェア抽象 → ロジック → アクチュエータ」の分け方は参考になります。
PiCar-X 側のリポジトリ
sunfounder/picar-x(本体ライブラリ)、robot-hat、vilib(カメラ/画像処理)- 手元でどう書けるか試す用に、Go 製の
emergingrobotics/gopicarのような別言語ドライバもあります
設計:SDV の考え方を PiCar-X に当てはめる
全体構成
┌──────────────────────────────────────┐
│ アプリ層 (Vehicle App) │
│ ・障害物で自動停止 ・ホーン操作 │
└───────────────▲──────────────────────┘
│ VSS シグナルだけを読み書き
┌───────────────▼──────────────────────┐
│ 車両抽象層 │
│ Kuksa Databroker (VSS シグナル) │
└───────────────▲──────────────────────┘
│
┌───────────────▼──────────────────────┐
│ ハードウェア層 │
│ Provider (picar-x ライブラリ) │
│ ─ モーター/サーボ/超音波/スピーカー │
│ ※ 動作基盤: Raspberry Pi 5 │
└──────────────────────────────────────┘
SDV らしさのポイントは アプリが picar-x ライブラリを直接呼ばない ことです。アプリは VSS のシグナルだけを見て、PiCar-X 固有の処理は Provider に閉じ込めます。こうすると、PiCar-X を別の車体に差し替えても、アプリは変えずに済みます。
シグナルのマッピング(案)
| やりたいこと | VSS のシグナル(案) | PiCar-X 側 |
|---|---|---|
| ホーンを鳴らす | Vehicle.Body.Horn.IsActive |
スピーカーでビープ音 |
| ステアリング | VSS の操舵系シグナル or 独自拡張 | ステアリング用サーボ |
| 前進/後退 | VSS に適当なものがなければ独自拡張 | 左右駆動モーター |
| 前方距離 | VSS の ADAS 系 or 独自拡張 | 超音波センサ |
※ VSS に該当が無いものは、独自のシグナルを追加定義する前提です。シグナル名は VSS のカタログで確認してから決めます。 ※ PiCar-X には車速センサがないので、「速度」はモーターの出力指令値であり、実速度ではない点に注意が必要です。
作るシナリオ
- ホーン:
Horn.IsActiveを true にするとスピーカーが鳴る(service-to-signal の PiCar-X 版) - 自動停止:前方距離が閾値以下になったら、アプリが停止要求を出す
- 見える化:センサ値を Grafana で見る(fleet-management の PiCar-X 版)
構築手順
1. OS とマイクロ SD
256GB の microSD に、Raspberry Pi 5 に対応した Raspberry Pi OS を書き込みます。
Pi 5 でのセットアップ手順は、SunFounder の公式ドキュメントに最新のものがあります。ライブラリのブランチ指定などは更新されるため、下の手順も含めて必ず公式を確認してください。
2. PiCar-X のライブラリを入れる
公式ライブラリの README に沿ってインストールします(ブランチ名は更新されるので、必ず公式の最新手順を確認してください)。
# robot_hat git clone --depth 1 -b 2.5.x https://github.com/sunfounder/robot-hat.git cd robot-hat && sudo python3 install.py && cd .. # vilib git clone --depth 1 https://github.com/sunfounder/vilib.git cd vilib && sudo python3 install.py && cd .. # picar-x git clone -b 2.1.x https://github.com/sunfounder/picar-x.git cd picar-x && sudo pip3 install . --break-system-packages
3. まず素の PiCar-X を動かす(SDV 層を載せる前の動作確認)
from picarx import Picarx import time px = Picarx() px.set_dir_servo_angle(0) # 直進 px.forward(30) # 出力 30% time.sleep(1) px.stop()
ここでサーボのゼロ点調整・キャリブレーションを済ませておくと、後が楽です。
4. Kuksa Databroker を立てる
Databroker を Docker で起動します。 Raspberry Pi 5 は arm64 なので、イメージが arm64 に対応しているかも確認します。 SDV 系のツールはバージョンで API が変わりやすいので、ここは公式ドキュメントに合わせてください。
実動作はラズパイから持ってくるのが大変なので省略。。。。
5. PiCar-X Provider を書く
役割は 2 つだけです。
- アクチュエータ:Databroker のターゲット値の変化を購読し、picar-x の API に変換して実行
- センサ:超音波センサなどの値を読み、Databroker に現在値として書き込む
構造のイメージ(擬似コード。Kuksa クライアントの API は使用バージョンに合わせて書き換えてください):
from picarx import Picarx px = Picarx() def on_horn(active: bool): if active: beep() # スピーカーで鳴らす def on_distance_poll(): return px.ultrasonic.read() # cm # 1) Databroker の Horn.IsActive のターゲット値を購読 → on_horn() # 2) 周期的に on_distance_poll() の値を Databroker に書き込む
6. アプリ(自動停止)を書く
アプリは PiCar-X を知らない 作りにします。前方距離のシグナルを購読し、閾値以下なら停止要求のシグナルを書くだけです。
7. Grafana で見る
fleet-management のブループリントの構成を参考に、センサ値を Grafana へ出します。
ハマったところ・気づき
- 普通にRaspiで動かすまでに時間がかかった。
- 一般論として、SDV 系の OSS はバージョンの更新が速く、サンプルがそのまま動かないことがあるので、動いたバージョンを記録しておくと後で助かります。
今後やりたいこと
- ステアリング/駆動も VSS 経由にして、スマホからの操作をアプリ層に載せる
- カメラ(vilib)で物体検出し、結果をシグナルとして扱う
- コンテナ化して、Provider やアプリを個別に入れ替えられるようにする
- SEA-ME のように、メータークラスタ風の表示を足してみる
まとめ
- SDV の肝は「ハードウェアの詳細」と「アプリ」を シグナルの標準化 で分離すること
- GitHub には、ホーン(service-to-signal)、車両アプリ SDK、フリート管理など、小さく真似できる題材が揃っている
- PiCar-X のような小さな実機があると、概念が一気に手触りのあるものになる
参考
- eclipse-sdv-blueprints/service-to-signal: https://github.com/eclipse-sdv-blueprints/service-to-signal
- eclipse-sdv-blueprints/fleet-management: https://github.com/eclipse-sdv-blueprints/fleet-management
- eclipse-sdv-blueprints(一覧): https://github.com/eclipse-sdv-blueprints
- eclipse-velocitas/vehicle-app-python-sdk: https://github.com/eclipse-velocitas/vehicle-app-python-sdk
- eclipse-velocitas/vehicle-app-python-template: https://github.com/eclipse-velocitas/vehicle-app-python-template
- SEA-ME: https://github.com/SEA-ME
- boschresearch/kuksa.hardware(CANOPi): https://github.com/boschresearch/kuksa.hardware
- Donkeycar: https://github.com/autorope/donkeycar
- sunfounder/picar-x: https://github.com/sunfounder/picar-x
- emergingrobotics/gopicar: https://github.com/emergingrobotics/gopicar