0.概要

投稿「GCP上にUbuntuを立ち上げる」で、Google Cloud Platform(GCP)のVM(Virtual Machine)インスタンス上でOS Ubuntuを走らせました。

本投稿では、VMインスタンス上に立ち上げたOS Ubuntu上でアプリを動かしてみます。

最終的に、preMSMの9軸センサ(BMX160)の出力をGCPに送り、姿勢計算をGCP上でやらせてみます。

クラウドを使わずに姿勢表示を以前に行っています。

その時の投稿「ロール、ピッチ、ヨー!! 9軸センサを使ったオイラー角の算出と表示」も参考にご覧ください。

次の図は、ソフトの構成図です。

  1. preMSMに搭載されたBMX160の出力をBluetoothでGatewayに送ります。
  2. Gateway上のNode-REDで信号を受けて、MQTTを使い、GCPのVMインスタンスに送信(Publish)します。
  3. GCP VMインスタンス上のNode-REDには、MQTTのブローカーを配置します。そして、MQTTで送信されてきた信号を受信した順に、UDPを使ってC++の姿勢計算プログラムに送ります。
  4. VMインスタンス上の姿勢計算プログラムは、順次、データをもとに姿勢計算(オイラー角)を行い、結果をUDPでNode-REDに送り返します。
  5. VMインスタンスは、姿勢計算結果を受け取るとMQTTを使って、PC上のprocessingに送信(Publish)します。
  6. PC上のprocessingは、計算結果を表示します。

以前の検討と異なる所は、姿勢計算を行うために、GCPのVMインスタンスに姿勢計算をさせているところです。

そのため、本稿では、以下の項目に関して説明します。

  1. UbuntuベースのVMインスタンス上でのNode-REDの動作確認
  2. MQTTブローカーをVMインスタンス上のNode-REDに配置し、通信実験
  3. C++プログラムのVMインスタンスへの転送
  4. C++コンパイルのVMインスタンス上での実行
  5. センサデータからの姿勢計算と姿勢表示確認

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種類あります。

  1. Cloud Storageを介した方法
  2. gcloudコマンドを使う方法
  3. 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上で姿勢計算をさせることができました。