AWS IoT FleetWiseのチュートリアルをRaspberry Piを使ってやってみた
大阪オフィスの小倉です。
AWS IoT FleetWiseに入門するために、Raspberry Piを使ったチュートリアルを試してみました。
AWS IoT FleetWiseは、車のセンサー等からクラウドにデータを収集するマネージドサービスです。
Raspberry Piは説明不要ですね。あなたの家にも2、3個転がっていると思います(?)
事前準備
今回実施するチュートリアルの内容は以下です。
チュートリアルの前提条件として、A CAN 'Hat' for Raspberry Pi with an MCP2515 CAN controller such as...
と書かれており、Raspberry Pi以外に CAN controllerが必要そうなのですが、今回これは仮想CANソフト(can-utils
)で代用します。
用意したもの
- Raspberry Pi Zero 2 W
- 電源ケーブル
- MicroUSB対応のHub(マウスとキーボードの接続用)
- USBマウスとキーボード
- MicroHDMI - HDMIケーブル(Raspberry Piからのディスプレイ出力用)
- MicroSDカード
- AWSアカウント(バージニアリージョンを使用)
- 手元のPC
Raspberry Pi Zero 2 Wは、Micro HDMIで外部ディスプレイに繋いでおいたり、USB Hub経由でマウス、キーボードを繋げるようにしておくと安心です。
やってみる
1.Raspberry Piの設定
以下を見ながら進めます
Step 1: Setup the Raspberry Pi
https://cdimage.ubuntu.com/ubuntu/releases/20.04/release/ から、Raspberry Pi Generic (64-bit ARM) preinstalled server image
のリンクを探し、Raspberry Pi用Ubuntu20.04を手元のPCダウンロードします。
ダウンロード後、Balena Etcherを使ってMicroSDカードにイメージを書き込んだ後、Raspberry Piにセットし起動します。
起動後、まずはWifiでネットワークに接続できるようにします。接続先の設定は、/etc/netplan/50-cloud-init.yaml
を参考に、/etc/netplan/99-cloud-init.yaml
を新たに作成しました。
network:
wifis:
wlan0:
dhcp4: true
optional: true
access-points:
<ssid>:
password: "<password>"
version: 2
(※Raspberry Pi Zero 2 Wで使えるWifiは2.4GHz 802.11 b/g/nです)
一度Raspberry Piを再起動して、ネットワークに接続されることを確認しておきます。
ネットワークに接続できたら、ドキュメント通りソフトウェアのアップデートと、unzip
のインストールを行います。
sudo apt update \
&& sudo apt upgrade -y \
&& sudo apt install -y unzip
ドキュメントの手順6〜8-ⅰまでは、CAN HATの設定のようですが、ここを仮想CANで代用します。
can-utils
をインストールします。
sudo apt install can-utils
仮想CANモジュールをロードします
sudo modprobe vcan
ロードできたか、lsmod | grep vcan
で確認します。
vcan 16384 0
vcan0
という名前で、仮想CANインターフェースを追加し、その後アクティブ化します。
sudo ip link add dev vcan0 type vcan
sudo ip link set up vcan0
ip link show dev vcan0
で確認します。
3: vcan0: <NOARP,UP,LOWER_UP> mtu 72 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/can
ここまで実施したらチュートリアルの8-ⅲに戻り、Pythonスクリプトを動かします。
作成したインターフェース名vcan0
に書き換えた以下を実行すると、
スクリプトで生成されたデータがターミナル上に表示されます。
cd ~/aws-iot-fleetwise-deploy/tools/cansim
python3 cansim.py -i vcan0
2025-04-15 12:19:39.530766 Set AMBIENT_AIR_TEMPERATURE to 26
2025-04-15 12:19:39.530887 Set ENGINE_COOLANT_TEMPERATURE to 86
2025-04-15 12:19:39.531008 Set THROTTLE_POSITION to 200
2025-04-15 12:19:39.531129 Set ECM_DTC1 to True
2025-04-15 12:19:39.531252 Set ECM_DTC3 to 175
2025-04-15 12:19:39.531402 Set ECM_DTC3 to 1: ['0x01', '0xAA', '0xBB', '0x6']
...
なお、私の場合は実行時にModuleNotFoundError: No module named 'tenacity'
となり失敗したため、
追加でpip3 install tenacity
を行うことで動作するようになりました。
2.開発用EC2の準備
以下の通りに進めます。私の場合はバージニアリージョンでEC2を起動しました。
Step 2: Launch your development machine
3.FleetWise Edge Agentのコンパイル
これも以下の通りで問題ありません。依存関係のインストールに多少時間が掛かります。
4.AWS IoT認証情報のプロビジョニング
これも以下の通りで問題ありません。
Step 4: Provision AWS IoT credentials
この手順を実行すると、AWS IoTにモノ、証明書、ポリシー等が作成されます。モノはFleetWiseで管理する車両と後ほどリンクします。
5.FleetWise Edge Agentのデプロイ
Step5の手順3を実行すると、FleetWiseのEdge Agentがサービスとしてインストールされますが、fwe@0 didn't start correctly. Please check the logs below:
というエラーが表示されます。
これはEdge Agentがcan0
というインターフェースを使用するように設定されているためです。
Step5手順3のスクリプトで作成された、/etc/aws-iot-fleetwise/config-0.json
の networkInterfaces
を can0
からvcan0
に修正します。
{
"version": "1.0",
"networkInterfaces": [
{
"interfaceId": "1",
"type": "canInterface",
"canInterface": {
"interfaceName": "vcan0", // 恐らくこっちは今回使われないので変更不要かも
"protocolName": "CAN",
"protocolVersion": "2.0A"
}
},
{
"interfaceId": "0",
"type": "obdInterface",
"obdInterface": {
"interfaceName": "vcan0", // can0 -> vcan0に修正
"pidRequestIntervalSeconds": 5,
"dtcRequestIntervalSeconds": 5,
"broadcastRequests": true,
"obdStandard": "J1979"
}
}
],
変更後、~/aws-iot-fleetwise-deploy
ディレクトリでsudo ./tools/install-fwe.sh
を実行することで、正常にインストール、起動します。
ubuntu@ubuntu:~/aws-iot-fleetwise-deploy$ sudo ./tools/install-fwe.sh
Stopping fwe@0
Starting and enabling fwe@0
fwe@0 started successfully
6.Raspberry Piにキャンペーンを展開
Step 6: Deploy a campaign to the Raspberry Pi
こちらの手順のdemo.sh
を実行すると、
- AWS IoT FleetWiseの各リソース作成
- Amazon Timestreamの作成
- デバイスからのデータ収集を待機
- 収集データをHTML出力
がまとめて実行されます。
HTMLは以下のようなものが出力されます。
また、AWSIoTの設定でログ出力を有効化していると、CloudWatch LogsのAWSIotLogsV2
ロググループから、Raspberry PiがTopicにPublishしているログが観測できました。
checkin
が車両ステータス、signals
がキャンペーンによって車両から収集されるデータを送信しているものになります。
(補足)HTMLの出力に失敗した場合
私の場合はdemo.sh
の実行時に以下のエラーが出力され、HTMLが作成できないことがありました。
Raspberry Piからデータを送信できておらず、Timestreamに格納されなかったようです。
An error occurred (ValidationException) when calling the Query operation: line 1:66: Column 'vehicleName' does not exist
WARNING: Could not save timestream results for fwdemo-rpi, was any data collected?
Error: No output files saved, was any data collected on any vehicles?
私のケースではRaspberry Piで実行しているpython3 cansim.py -i vcan0
のスクリプトを再起動させることで、データが送信されるようになりましたので、もし同様のエラーに遭遇した方は試してみてください。(Edge Agentの再起動なども有効かもしれません)
demo.sh
は、リソース作成〜HTML出力までまとめて行う為、再度実行する場合は、
- クリーンアップスクリプトの実行で、FleetWise関連リソースを削除
cd ~/aws-iot-fleetwise-edge/tools/cloud && ./clean-up.sh
- 作成されたAmazon TimestreamのテーブルとDBをマネジメントコンソールから削除
- 再度、展開スクリプト(
demo.sh
)をドキュメント通りに実行
の手順でやり直すことができます。
7.クリーンアップ
チュートリアル完了後は、こちらの手順でリソースを削除しましょう。
Amazon Timestreamは削除されないので、自分で削除しておいてください。
まとめ
仮想CANを使ってRaspberry PiでFleetWise Edgeを動作させることができました。
特にデバイス側については詳しい同僚に聞きながらになりましたが、チュートリアルを通して、AWS IoT FleetWiseについての理解をかなり深めることができたと思います。
また、手元の実デバイスで動かせるのも楽しいですね。
Raspberry Piはいくらあっても困らないので、皆さんも試してみてください。