LoginSignup
19
3

AWS IoT Core を使って Jetson Nano をクラウドに接続してみた

Last updated at Posted at 2023-12-17

1. はじめに

普段シンクライアントやクラウドにしか触れることのない今、物理デバイスへの熱きノスタルジーを捨てきれないエンジニアたちはどこに向かえばよいのでしょうか。

本稿では、CUDA コア 128 基の GPU を搭載した可愛いやつ、NVIDIA Jetson Nano を AWS IoT Core に接続してみたいと思います。

2. 概要

手順はシンプルで、以下の 2 ステップで進めて行きます:

  1. まずは Jetson Nano のセットアップをおこないます。
  2. 次に AWS IoT Core の管理コンソールの手順に従い、Jetson Nano を AWS IoT Core に接続します。

3. 用意した機材

本稿を執筆するにあたり、用意した機材は以下となります:

  • NVIDIA Jetson Nano 開発者キット B01
  • Nextorage 64GB micro SDXC (UHS-I, U3, V30)
    • カメラ関連でお世話になっている Nextorage さんの micro SDXC カードを使用させていただきました。
  • サードパティ製 AC アダプタ(5V, 4A, PSE マーク付き)
  • HHKB Professional Classic 無刻印/墨(英語配列)
  • Logicool MX MASTER 2S
    • 無線でも普通に接続できました。
  • EIZO ColorEdge CS2731
    • HDMI でも DP でも接続できました。
  • MacBook Air (M1 チップ搭載 13 インチモデル)
    • JetPack を micro SDXC カードに書き込むために使用しました。
  • Camera Module for NVIDIA Jetson NANO, 8MP, D160°
    • 今回は使用しませんでした。

なお、無線 LAN には対応していないので有線 LAN ケーブルを繋ぐ必要があります。

4. Jetson Nano を準備する

4.1. micro SDXC カードをフォーマット

SD Memory Card Formatter for Mac を使用して micro SDXC カードのフォーマットをおこないます。クイックフォーマットにしたので一瞬で終わります。

スクリーンショット 2023-12-14 11.18.53.png

4.2. JetPack の SD カードイメージをダウンロード

NVIDIA のサイト から JetPack 4.6.1 の SD カードイメージをダウンロードします。SD カードイメージは ZIP で約 6 GB です。

JetPack は Jetson シリーズ向けの Ubuntu ベースの OS で、Jetson シリーズ独自の機能が付加されています。

4.3. micro SDXC カードに JetPack を書き込む

Etcher を使用して、先ほどダウンロードした JetPack 4.6.1 の SD カードイメージを micro SDXC カードに書き込みます。

スクリーンショット 2023-12-14 12.11.47.png

4.4. JetPack 初期設定

JetPack 4.6.1 を書き込んだ micro SDXC カードを Jetson Nano に挿し込み、AC アダプタを接続します。Jetson Nano には電源ボタンが存在しないため、AC アダプタを接続したら即電源 ON になります。
画面の指示に従い、言語選択、キーボード選択…と進めて行くと JetPack の恰好良いデスクトップが表示されるかと思います。

Screenshot from 2023-12-17 23-14-08.png

これで JetPack の準備が整いました。次は AWS IoT Core に繋げて行きます。

5. AWS IoT Core を準備する

ここからは簡単のため Jetson Nano から直接操作をしています。

5.1. デバイスを準備する

Jetson Nano のブラウザから AWS IoT Core の管理コンソールにアクセスしモノの接続を始めます。

Screenshot from 2023-12-17 22-38-30(2).png

まずは Jetson Nano から AWS IoT Core への疎通確認をおこないます。
ターミナルから ping コマンドを実行します。

$ ping aaq***.iot.ap-northeast-1.amazonaws.com
PING aaq***.iot.ap-northeast-1.amazonaws.com (35.75.217.165) 56(84) bytes of data.
64 bytes from ec2-35-75-217-165.ap-northeast-1.compute.amazonaws.com (35.75.217.165): icmp_seq=1 ttl=245 time=15.1 ms
64 bytes from ec2-35-75-217-165.ap-northeast-1.compute.amazonaws.com (35.75.217.165): icmp_seq=2 ttl=245 time=15.3 ms
64 bytes from ec2-35-75-217-165.ap-northeast-1.compute.amazonaws.com (35.75.217.165): icmp_seq=3 ttl=245 time=14.9 ms
64 bytes from ec2-35-75-217-165.ap-northeast-1.compute.amazonaws.com (35.75.217.165): icmp_seq=4 ttl=245 time=16.8 ms
64 bytes from ec2-35-75-217-165.ap-northeast-1.compute.amazonaws.com (35.75.217.165): icmp_seq=5 ttl=245 time=14.9 ms
64 bytes from ec2-35-75-217-165.ap-northeast-1.compute.amazonaws.com (35.75.217.165): icmp_seq=6 ttl=245 time=15.2 ms
64 bytes from ec2-35-75-217-165.ap-northeast-1.compute.amazonaws.com (35.75.217.165): icmp_seq=7 ttl=245 time=18.0 ms
^C
--- aaq***.iot.ap-northeast-1.amazonaws.com ping statistics ---
7 packets transmitted, 7 received, 0% packet loss, time 6008ms
rtt min/avg/max/mdev = 14.904/15.775/18.011/1.114 ms

無事に ping は通ったようです。

5.2. デバイスを登録して保護する

モノの名前に jetson-nano と入力し、他はデフォルトで 次へ を選択します。

Screenshot from 2023-12-17 22-39-35 (1).png

5.3. プラットフォームと SDK を選択します

JetPack は Ubuntu ベースであるため、デバイスプラットフォームのオペレーティングシステムは Linux / macOS を選択します。
AWS IoT デバイス SDK は好みで良いですが、ここでは Python を選択しました。

Screenshot from 2023-12-17 22-40-01.png

5.4. 接続キットをダウンロード

接続キットをダウンロード を選択し接続キットをダウンロードします。

Screenshot from 2023-12-17 22-40-44 (1).png

ダウンロードした接続キットは unzip で解凍します。

$ mkdir awsiotcore
$ cp connect_device_package.zip awsiotcore/
$ cd awsiotcore/
$ unzip connect_device_package.zip

5.5. 接続キットを実行

start.sh に実行権限を与えて、start.sh を実行します。

Screenshot from 2023-12-17 22-43-08 (1).png

$ chmod +x start.sh
$ ./start.sh

Downloading AWS IoT Root CA certificate from AWS...
./start.sh: line 14: curl: command not found

curl 入ってないのですね、、ということで apt でインストールします。

$ sudo apt install curl

改めて start.sh を実行します。

$ ./start.sh 

Cloning the AWS SDK...
Cloning into 'aws-iot-device-sdk-python-v2'...
remote: Enumerating objects: 2472, done.
remote: Counting objects: 100% (940/940), done.
remote: Compressing objects: 100% (248/248), done.
remote: Total 2472 (delta 771), reused 763 (delta 678), pack-reused 1532
Receiving objects: 100% (2472/2472), 2.11 MiB | 4.08 MiB/s, done.
Resolving deltas: 100% (1614/1614), done.

Installing AWS SDK...
/usr/bin/python3: No module named pip

pip 入れてなかったですね、、ということで apt でインストールします。

$ sudo apt install python3-pip

改めて start.sh を実行します。

$ ./start.sh 

Installing AWS SDK...
Processing ./aws-iot-device-sdk-python-v2
awsiotsdk requires Python '>=3.7' but the running Python is 3.6.9

Python が古いんですね、、ということで apt でインストールします。
ついでに、デフォルトを 3.8 となるように変更します。

$ sudo apt install python3.8
$ sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1
update-alternatives: /usr/bin/python3 (python3) を提供するために自動モードで /usr/bin/python3.8 を使います
$ sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 2
update-alternatives: /usr/bin/python3 (python3) を提供するために自動モードで /usr/bin/python3.6 を使います
$ sudo update-alternatives --config python3
alternative python3 (/usr/bin/python3 を提供) には 2 個の選択肢があります。

  選択肢    パス              優先度  状態
------------------------------------------------------------
* 0            /usr/bin/python3.6   2         自動モード
  1            /usr/bin/python3.6   2         手動モード
  2            /usr/bin/python3.8   1         手動モード

現在の選択 [*] を保持するには <Enter>、さもなければ選択肢の番号のキーを押してください: 2
update-alternatives: /usr/bin/python3 (python3) を提供するためにマニュアルモードで /usr/bin/python3.8 を使います
$ python3 -V
Python 3.8.0

気を取り直して start.sh を実行します。

$ ./start.sh 

Downloading AWS IoT Root CA certificate from AWS...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1188  100  1188    0     0   3346      0 --:--:-- --:--:-- --:--:--  3346

Cloning the AWS SDK...
Cloning into 'aws-iot-device-sdk-python-v2'...
remote: Enumerating objects: 2472, done.
remote: Counting objects: 100% (953/953), done.
remote: Compressing objects: 100% (250/250), done.
remote: Total 2472 (delta 783), reused 774 (delta 689), pack-reused 1519
Receiving objects: 100% (2472/2472), 2.11 MiB | 6.01 MiB/s, done.
Resolving deltas: 100% (1614/1614), done.

Running pub/sub sample application...
Connecting to aaq***.iot.ap-northeast-1.amazonaws.com with client ID 'basicPubSub'...
Connection Successful with return code: 0 session present: True
Connected!
Subscribing to topic 'sdk/test/python'...
Subscribed with QoS.AT_LEAST_ONCE
Sending messages until program killed
Publishing message to topic 'sdk/test/python': Hello World!  [1]
Received message from topic 'sdk/test/python': b'"Hello World!  [1]"'
Publishing message to topic 'sdk/test/python': Hello World!  [2]
Received message from topic 'sdk/test/python': b'"Hello World!  [2]"'
Publishing message to topic 'sdk/test/python': Hello World!  [3]
Received message from topic 'sdk/test/python': b'"Hello World!  [3]"'
^CTraceback (most recent call last):
  File "aws-iot-device-sdk-python-v2/samples/pubsub.py", line 142, in <module>
    time.sleep(1)
KeyboardInterrupt

ようやく繋がりました!
AWS のコンソール上でもメッセージを確認することができます。

Screenshot from 2023-12-17 22-44-05.png

これで、Jetson Nano から AWS IoT Core へのメッセージ送信は完了です。

Screenshot from 2023-12-17 22-57-52.png

6. 自分の好きなメッセージを送ってみる

ここまでは管理コンソールの手順通りに実行しただけですので、少しだけメッセージを変更してみたいと思います。
start.sh の最終行を以下のように書き換えます:

python3 aws-iot-device-sdk-python-v2/samples/pubsub.py --endpoint aaq***.iot.ap-northeast-1.amazonaws.com --ca_file root-CA.crt --cert jetson-nano.cert.pem --key jetson-nano.private.key --client_id basicPubSub --topic sdk/test/python --count 1 --message "I am Jetson Nano." 

--count 1 とすることで、メッセージは 1 回だけ送信するようにしています。
では、再度 start.sh を実行します。

$ ./start.sh 

Running pub/sub sample application...
Connecting to aaq***.iot.ap-northeast-1.amazonaws.com with client ID 'basicPubSub'...
Connection Successful with return code: 0 session present: True
Connected!
Subscribing to topic 'sdk/test/python'...
Subscribed with QoS.AT_LEAST_ONCE
Sending 1 message(s)
Publishing message to topic 'sdk/test/python': I am Jetson Nano. [1]
Received message from topic 'sdk/test/python': b'"I am Jetson Nano. [1]"'
1 message(s) received.
Disconnecting...
Connection closed
Disconnected!

"I am Jetson Nano." というメッセージを 1 回だけ送ることができました。AWS のコンソール上でもメッセージを確認することができます。

Screenshot from 2023-12-17 22-46-43.png

7. おわりに

Jetson Nano をモノとして AWS IoT Core にメッセージを送ってみました。AWS IoT Core の管理コンソールのステップに従って行くと、接続キットを用意してくれて実行すべきコマンドも丁寧に示してくれるので、セミオートで接続まで辿り着けるかと思います。

本稿ではただメッセージ送ったに過ぎず、Jetson Nano の GPU, Camera Module を活かせていません。次回は画像・映像を使ったより実践的な内容にしたいと思います。

それでは、アディオス!

参考記事

19
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
3