Contents
- 0.概要
- 1. Node-REDを動かしてみる
- 1.1. GCP上のVMインスタンスにNode-REDをインストールする
- 1)Google ConsoleでVMに接続
- 2)Node.jsのインストール
- a) curlの存在確認
- b) スクリプトのダウンロード
- c) スクリプトの実行
- d) node.jsのインストール
- e) インストールの確認
- 3) Node-REDのインストール
- 1.2. ファイアウォールの設定
- 1)仕様の確認
- 2) ファイアルールの作成
- 1.3. Node-REDの実行
- 1) node-redの実行
- 2) エディタ画面の表示
- 2. MQTTを使った通信実験
- 4.1. GCP側Node-RED
- 4.2. ローカル側Node-RED
- 4.3. GCPのファイアウォールにMQTT用設定
- 1)上りの仕様
- 2) 下りの仕様
- 4.4. MQTT通信の結果
- 4.4.1. ローカル側
- 4.4.2. GCP側
- 3. ファイルの転送(sftp)
- 4. C++のコンパイル
- 5. 9軸センサを使った姿勢計算と姿勢表示
- 5.1. ローカル側のNode-RED
- 5.2. GCP側のNode-RED
- 5.3. 姿勢表示の動画
0.概要
投稿「GCP上にUbuntuを立ち上げる」で、Google Cloud Platform(GCP)のVM(Virtual Machine)インスタンス上でOS Ubuntuを走らせました。
本投稿では、VMインスタンス上に立ち上げたOS Ubuntu上でアプリを動かしてみます。
最終的に、preMSMの9軸センサ(BMX160)の出力をGCPに送り、姿勢計算をGCP上でやらせてみます。
クラウドを使わずに姿勢表示を以前に行っています。
その時の投稿「ロール、ピッチ、ヨー!! 9軸センサを使ったオイラー角の算出と表示」も参考にご覧ください。
次の図は、ソフトの構成図です。
- preMSMに搭載されたBMX160の出力をBluetoothでGatewayに送ります。
- Gateway上のNode-REDで信号を受けて、MQTTを使い、GCPのVMインスタンスに送信(Publish)します。
- GCP VMインスタンス上のNode-REDには、MQTTのブローカーを配置します。そして、MQTTで送信されてきた信号を受信した順に、UDPを使ってC++の姿勢計算プログラムに送ります。
- VMインスタンス上の姿勢計算プログラムは、順次、データをもとに姿勢計算(オイラー角)を行い、結果をUDPでNode-REDに送り返します。
- VMインスタンスは、姿勢計算結果を受け取るとMQTTを使って、PC上のprocessingに送信(Publish)します。
- PC上のprocessingは、計算結果を表示します。
以前の検討と異なる所は、姿勢計算を行うために、GCPのVMインスタンスに姿勢計算をさせているところです。
そのため、本稿では、以下の項目に関して説明します。
- UbuntuベースのVMインスタンス上でのNode-REDの動作確認
- MQTTブローカーをVMインスタンス上のNode-REDに配置し、通信実験
- C++プログラムのVMインスタンスへの転送
- C++コンパイルのVMインスタンス上での実行
- センサデータからの姿勢計算と姿勢表示確認
1. Node-REDを動かしてみる
1.1. GCP上のVMインスタンスにNode-REDをインストールする
GCPのVM上にインストールしたUbuntu 24.04 LTSにNode-REDをインストールします。
インストールは、Node-REDのHPの「npmによってインストールする」に従ってインストールします。npmはNode.jsに同梱されていますので、まず、Node.jsをインストールします。その後、npmを使ってNode-REDをインストールします。
インストールは、Google Consoleから行います。
(Node-REDのインストールは、2024年8月19日時点の情報です)
1)Google ConsoleでVMに接続
Google Cloud PlatformのVMインスタンスの画面にある[SSH]のボタンをクリックしてGoogle Consoleを開きます。
(開き方はこちらをご覧ください:「Google Consoleを使用する方法」)
開いたGoogle Consoleにコマンドを入力します。
2)Node.jsのインストール
Node-REDがサポートしているNode.jsのバージョンを「サポートされているNodeのバージョン」のページで確認します。Version 18.xとVersion 20.xが推奨のバージョンになっています。
Node.jsのVersion 20.xをGithubの「NodeSource N|Solid & Node.js Binary Distributions」のページに従ってインストールします。
Installation Instructions (DEB)のUsing Ubuntu (Node.js 20)に書かれているコマンドをVMのコンソール画面に入力します。
a) curlの存在確認
以下のコマンドで、curlがインストールされているかどうかを確認します。
$ which curl
パスが表示されなかった場合はインストールされていませんので、インストールが必要になります。インストールのコマンドは次になります。
$ sudo apt-get install -y curl
b) スクリプトのダウンロード
Version 20.xを指定してスクリプトをダウンロードします。
$ curl -fsSL https://deb.nodesource.com/setup_20.x -o nodesource_setup.sh
c) スクリプトの実行
ダウンロードしたスクリプトをbashで実行します。
$ sudo -E bash nodesource_setup.sh
d) node.jsのインストール
上記のスクリプトの実行が終わったら、node.jsのインストールの準備が完了しました。node.jsをインストールします。
$ sudo apt install -y nodejs
e) インストールの確認
nodeのバージョンを確認して、インストールがうまく行ったことを確認します。
$ node -v
3) Node-REDのインストール
上記Node-REDのHPに記載されている次のコマンドを実行します。
sudo npm install -g --unsafe-perm node-red
少し時間がかかりますが、インストールが終わります。
端末で起動してみます。[Ctrl-C]で止めることができます。
$ node-red
以上で、Node-REDのインストールが完了しました。自動で起動させるためのsystemdに関する設定は「1.3 Node-REDの実行」のところで説明します。
次に、まずNode-REDのフローエディタ画面をローカル端末から開くために、ファイアウォールの設定を行います。
1.2. ファイアウォールの設定
Node-REDのエディタ画面をローカル端末から開くために、ファイアウォールにポート1880へのアクセスを許可する記述を追加します。
1)仕様の確認
ソースフィルタの接続IPアドレスは、各自のネット環境で異なります。
簡単に調べるには、ブラウザを開いて、検索窓に”my ip address”と入力してみてください。いくつかのURLが表示されますので、いずれかを開くとIPアドレスが分かります。
項目 |
仕様 |
---|---|
名前 |
allow-node-red-access |
トラフィック方向 |
上り |
ターゲット |
ネットワーク上のすべてのインスタンス |
ソースフィルタ |
接続IPアドレス(各自確認) |
プロトコルとポート |
プロトコル:tcp, ポート:1880 |
2) ファイアルールの作成
ファイアウォールの作成方法は、下記HPを参照ください。
(4.2. IAP に VM インスタンスへの接続を許可するファイアウォールの作成)
設定後、以下のように新しいルールが作られていることを確認してください。
以上で、VMインスタンス側のNode-REDのインストールおよび設定が終了しました。
1.3. Node-REDの実行
次に、VMインスタンスにSSH接続を行い、Node-REDを自動起動するためにsystemdの設定ファイルの作成と起動設定を行います。そして、systemdを使ってNode-REDを起動します。その後、ローカル端末(例えばWindows PC)側から、Node-REDのフローエディタ画面の確認を行います。
1) node-redの実行
ここでは、VMが再起動した際にも自動でNode-REDが起動されるように、Linux(Ubuntu)のsystemdの仕組みを利用して、Node-REDを起動する設定を説明します。
a) nodered.serviceファイルの作成
以下のコマンドを使って、node-red.serviceファイルをsystemdのディレクトリに作成します。
ファイルの中身には以下の記述を記載します。
# systemd service file to start Node-RED
[Unit]
Description=Node-RED graphical event wiring tool
Wants=network.target
Documentation=http://nodered.org/docs/hardware/raspberrypi.html
[Service]
Type=simple
# Run as normal pi user - change to the user name you wish to run Node-RED as
User="user-name"
Group="user-name"
WorkingDirectory="home-directory"
Environment="NODE_OPTIONS=--max_old_space_size=2048"
# define an optional environment file in Node-RED's user directory to set custom variables externally
EnvironmentFile=-"home-deirectory"/.node-red/EnvironmentFile
# uncomment and edit next line if you need an http proxy
#Environment="HTTP_PROXY=my.httpproxy.server.address"
# uncomment the next line for a more verbose log output
#Environment="NODE_RED_OPTIONS=-v"
# uncomment next line if you need to wait for time sync before starting
#ExecStartPre=/bin/bash -c '/bin/journalctl -b -u systemd-timesyncd | /bin/grep -q "systemd-timesyncd.* Synchronized to time server"'
ExecStart=/usr/bin/node-red $NODE_OPTIONS $NODE_RED_OPTIONS
#ExecStart=/usr/bin/env node $NODE_OPTIONS red.js $NODE_RED_OPTIONS
# Use SIGINT to stop
KillSignal=SIGINT
# Auto restart on crash
Restart=on-failure
RestartSec=20
# Tag things in the log
SyslogIdentifier=Node-RED
#StandardOutput=syslog
[Install]
WantedBy=multi-user.target
“user-name”と”home-directory”の部分はご自分のユーザー名とホームディレクトリの名称を記載ください(””は不要です”)。ユーザー名は、SSHで接続した端末画面のプロンプトの初めの部分です。また、ホームディレクトリは、以下のコマンドで確認できます。一つ目のcdでホームディレクトリへ移動します。pwdで、現在のディレクトリをフルパスで表示します。
$ cd
$ pwd
以下の例では、ユーザー名は、hayapapajp、ホームディレクトリは、/home/hayapapajpです。
User=hayapapajp
Group=hayapapajp
WorkingDirectory=/home/hayapapajp
EnvironmentFile=-/home/hayapapajp/.node-red/EnvironmentFile
記載が終わったら、エディタnanoを保存して[Ctrl-w]、閉じます[Ctrl-x]。
次に、VMインスタンスがリセットやリブートしても、Node-REDが自動で立ち上がるように設定(enableに)します。
$ sudo systemctl enable nodered.service
enableになったかどうか確認するコマンドは以下です。
$ systemctl is-enabled nodered.service
それでは、Node-REDを起動します。
$ sudo systemctl start nodered.service
起動しているかどうかを確認してみます。
$ systemctl status nodered.service
以上で、Node-REDの起動が完了しました。
2) エディタ画面の表示
ローカル端末のWebブラウザに下記アドレスを入力し、Node-REDのエディタが起動することを確認します。
http://(VMインスタンスの外部IP):1880/
起動すると下記の様なエディタが立ち上がります。
2. MQTTを使った通信実験
GCP上のNode-REDにMQTTのブローカーを置き、ローカルのマシンとMQTT通信を行わせます。
MQTTブローカーノードの追加と設定方法は、ユーザーガイド「20.MQTTによるネットワークの構築とデータの活用」をご覧ください。
4.1. GCP側Node-RED
GCP側のNode-REDには、MQTTのブローカーと受信した結果を送信した際に結果を確認するためのMQTT inのノードを配置しました。
ローカル側からデータがPublishされるとMQTTのブローカーがSubscribeし、すぐにPublishします。その内容をMQTT inでSubscribeし、デバッグノードで表示します。
また、セキュリティの観点から、MQTTの通常のポート番号1883から、8101に変更しています。
4.2. ローカル側Node-RED
ローカル側は、インジェクトノードにMQTT outを直結しています。インジェクトボタンが押されると、インジェクトノードから”Hello World from local !!”と出力されます。MQTT outは、それをMQTTのブローカーにPublishします。
また、MQTT inとデバッグノードを配置しています。MQTTブローカーからPublishされた結果を受け取り、表示します。
インジェクトボタンを押すと、GCP側に送られ、送り返されてきて、デバッグノードから”Hello World from local !!”が表示される予定です。
4.3. GCPのファイアウォールにMQTT用設定
GCPのファイアウォールにMQTT用に、TCP ポート 8101を追加します(通常の1883でも設定は必要です)。
ファイアウォールの作成方法は、投稿「GCP上にUbuntuを立ち上げる 」の「4. ファイアウォールの設定」を参照ください。
1)上りの仕様
「1.2. ファイアウォールの設定」で作成したルールにポート 8101を追加します。
項目 |
仕様 |
名前 |
allow-node-red-access |
トラフィック方向 |
上り |
ターゲット |
ネットワーク上のすべてのインスタンス |
ソースフィルタ |
接続IPアドレス(各自確認) |
プロトコルとポート |
プロトコル:tcp, ポート:1880, 8101 |
2) 下りの仕様
新規にMQTT用の下りのルールを作ります。
項目 |
仕様 |
名前 |
allow-mqtt-down-access |
トラフィック方向 |
下り |
ターゲット |
ネットワーク上のすべてのインスタンス |
ソースフィルタ |
接続IPアドレス(各自確認) |
プロトコルとポート |
プロトコル:tcp, ポート:8101 |
4.4. MQTT通信の結果
MQTTの通信の結果を示します。GCPとMQTTの通信ができました。
4.4.1. ローカル側
予想通り、インジェクトボタンを押すとSubscribe側のデバッグノードから”Hello World from local !!”と表示されました。
4.4.2. GCP側
MQTT inのノードに接続されているデバッグノードから”Hello World from local !!”と表示されました。
3. ファイルの転送(sftp)
GCPのVMインスタンスとのファイルのやりとりの方法は、GCPのチュートリアルによると3種類あります。
- Cloud Storageを介した方法
- gcloudコマンドを使う方法
- sftpを使う方法
VMインスタンスとSSH接続ができていれば、SSH認証鍵の設定が終わっているので、PowerShellからsftpを使う方法が最も簡便です。
注意事項:sftpの場合、認証鍵のフォルダ指定は、(ユーザー名)@(外部IPアドレス)の前に必要です。
> sftp –i .\.ssh\(認証鍵作成時のフォルダ) (ユーザー名)@(外部IPアドレス)
4. C++のコンパイル
sftpでVMインスタンスに送ったc++のファイルを、sshでVMインスタンスに入って、コンパイルしてみました。
何の問題もなくコンパイルできました。コンパイル前後で、実行ファイルacs_2udpができているのが分かります。
5. 9軸センサを使った姿勢計算と姿勢表示
以上で、9軸センサを使った姿勢計算を、GCP上のVMインスタンスで実行する準備が整いました。
5.1. ローカル側のNode-RED
ローカル側は、センサ入力を受けるシリアルノード(/dev/rfcomm0に接続)から、jsonノードを経て、MQTT outノードでGCPへPublishしています。
ファイル保存のフローやBluetooth接続のノードがあり、煩雑に見えますが、上記3つのノードが基本です。
5.2. GCP側のNode-RED
GCP側は、大きく以下の4つで構成されます。
① 姿勢計算プログラムを起動するノード
②MQTT inからデータを受け取り、姿勢計算プログラムへUDPで送信するノード
③姿勢計算プログラムからUDPでデータを受け取るノード
④姿勢表示プログラム(processing)へMQTTで送信するノード
5.3. 姿勢表示の動画
結果の動画を以下に示します。うまくGCP上で姿勢計算をさせることができました。