ふるお〜と!- FullAuto

AI・ロボットが普及しBI(ベーシックインカム)が早急に実現されることを願う元ニートのブログ

ふるお〜と!-FullAuto

ros2-web-bridgeをRaspberry Piで試してみた

ROS2を使用して、Raspberry PiとホストPCの間で通信をしてみたい。

github.com

というわけで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からアクセスしてみる

f:id:nullpo24:20191019185232j:plain

無線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と接続しているネットワークカードの設定を開きます。

f:id:nullpo24:20191019192307p:plain

IPv4タブを開きIPアドレスの設定を手動にします。 そして、アドレスを192.168.225.xx(Raspberry Piに設定した192.168.225.50以外)にします。

f:id:nullpo24:20191019192331p:plain

実行

例1と同様の手順を踏めば、ホストPC側のブラウザでtopicがpublishされていることを確認できます。 f:id:nullpo24:20191019193040p:plain

参考

Micro XRCE-DDSのAgentをRaspberry Piで構築してTopicを送受信する - Qiita

How To Configure IP Address In Ubuntu 18.04 LTS - OSTechNix