ROS2を使用して、Raspberry PiとホストPCの間で通信をしてみたい。
というわけでros2-web-bridgeを試してみる。
環境
OS : ubuntu-18.04.3-preinstalled-server-arm64+raspi3.img.xz
Middleware : ROS2 Dashing
Hardware: Raspberry Pi 3B+
ros2-web-bridgeをラズパイにインストール
$ git clone https://github.com/RobotWebTools/ros2-web-bridge $ cd ros2-web-bridge $ source /opt/ros/dashing/local_setup.sh $ npm install
(※GUIだとnpm install時ハングアップしたのでCUIでやりました。それでも、ラズパイ3だとリソースが足りないのか、ビルドして5時間後にout of memory kill processとなります。再度チャレンジでビルドが通りました...)
例1:ローカルで実行する
環境変数を読み込んでおく
$ source /opt/ros/dashing/local_setup.sh
ros2-web-bridgeモジュールをスタート
node bin/rosbridge.js
express serverをスタート
cd examples && node index.js
ブラウザを開き下記URLにアクセスする
http://localhost:3000/html/publisher.html
ラズパイ上でexpressサーバを起動しホストPCからアクセスしてみる
無線Lanルータを介すると余計なレイテンシがあると思われるので、Raspberry PiとPCを有線Lanで直結して通信してみます。
Raspberry Pi側を固定IPにする
現状のIp Addressを確認しておきます。
$ ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether b8:27:12:34:ab:cd brd ff:ff:ff:ff:ff:ff inet6 fe80::ffff:1235:4567:2536/64 scope link valid_lft forever preferred_lft forever 3: wlan0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000 link/ether b8:27:eb:2a:70:63 brd ff:ff:ff:ff:ff:ff
eth0が現在の有線Lanの設定です。
Ubuntu18.04の通信設定を編集します。
その前にバックアップを取っておきます。
$ sudo cp /etc/netplan/50-cloud-init.yaml /etc/netplan/50-cloud-init.yaml.bk
nanoエディタで編集
$ sudo nano /etc/netplan/50-cloud-init.yaml # This file is generated from information provided by # the datasource. Changes to it will not persist across an instance. # To disable cloud-init's network configuration capabilities, write a file # /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following: # network: {config: disabled} network: version: 2 ethernets: eth0: dhcp4: true match: macaddress: b8:27:eb:7f:ab:cd set-name: eth0
eth0のDHCPがtrueなっているのでこれをno(false)にしIPv4アドレス(任意)を登録します。
eth0: addresses:[192.168.225.50/24] gateway4:192.168.225.1 dhcp4: no match: macaddress: b8:27:eb:7f:25:36 set-name: eth0
設定を適用します。
$ sudo netplan apply
Ip Addressを再確認します。
$ ip addr 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether b8:27:eb:gh:ab:cd brd ff:ff:ff:ff:ff:ff inet 192.168.225.50/24 brd 192.168.225.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::ba27:ebff:abcd:efgh/64 scope link valid_lft forever preferred_lft forever
exampleを編集
Websocket通信ができるようにexamples/html/publisher.htmlを下記のように編集しておきます。
//編集前 38 : // Create a connection to the rosbridge WebSocket server. 39 : ros.connect('ws://localhost:9090'); //編集後 38 : // Create a connection to the rosbridge WebSocket server. 39 : ros.connect('ws://192.168.225.50:9090');
ホストPC側も固定IPにする
Raspberry Piと同一のネットワークにします。
[設定]→[ネットワーク]を開きRaspberry Piと接続しているネットワークカードの設定を開きます。
IPv4タブを開きIPアドレスの設定を手動にします。 そして、アドレスを192.168.225.xx(Raspberry Piに設定した192.168.225.50以外)にします。
実行
例1と同様の手順を踏めば、ホストPC側のブラウザでtopicがpublishされていることを確認できます。