detamamoruのブログ

興味を持ったことや勉強したことに関して記事を書きます。主に低レイヤー寄りの記事を公開。

初めてのロボットアーム作りに挑戦!4: PFRL + Raspberry pi 4 + Raspberry pi camera v2 + ROS(melodic)

出田守です。
アイアンマンを観て、ロボットアームが欲しくなりました。
勉強しながら、初めてのロボットアーム作りに挑戦します。

今回の目標

  1. PFRLをインストール・サンプル実行
  2. Raspberry pi 4にUbuntu 18.04をインストール
  3. Raspberry pi camera v2の動作確認
  4. ROS(melodic)をインストール・動作確認

今回は盛りだくさんです。
ここまでで作ってきたロボットアームの動作をカメラからの画像を入力し強化学習を用いて動作を学習させたいと思いました。
そのための環境構築を行います。

使用した環境

PFRL

友人からPreferred NetworksさんがPFRLという強化学習のライブラリを公開したよと教えてもらいました。
Chainer RLの後継版?で、Chainer RLのコードとも互換性があるようです。
早速インストールします。前提として、Python 3.7.7以上、PyTorchがインストールされていること。

pip install pfrl

私の環境ではPyTorchが入っていないと、エラーが出ました。なので
PyTorch のインストール(Windows 上)
を参考に事前にPyTorchをインストールしました。ちなみにGPUを載せていますので、GPU用をインストールしました。

無事インストールできたら、
pfrl/quickstart.ipynb at master · pfnet/pfrl · GitHub
を実行し、動作確認を行います。

Raspberry pi 4にUbuntu 18.04をインストールと設定

1. ARM用Ubuntu 18.04 serverをダウンロード

まず、ARM用のUbuntu 18.04 serverをダウンロードします。

f:id:detamamoru:20201206202436p:plain
Ubuntu 18.04 server

2. Raspberry Pi Imagerをダウンロード・インストール

Raspberry Pi Imagerをダウンロードし、インストールします。

3. Ubuntu 18.04 serverを書込み・インストール

Rasberry Pi Imagerを起動し、

  1. 「Operating System」→「Use custom」→Ubuntu 18.04 serverイメージを選択
  2. 「SD Card」→書込み対象のSDカードを選択
  3. 「WRITE」

これでSDカードへUbuntu 18.04 serverが書き込まれます。あとは、SDカードをRaspberry pi 4へ差し込み、準備完了です。

4. 初回起動

Raspberry pi 4にモニタやキーボード、マウスを接続します。次に電源を接続し、モニタに起動画面が表示されるのを確認します。初回はUbuntuユーザのパスワードを求められますので、良いパスワードを設定します。しばらくするとログイン画面に進みます。
<注意>電源接続時はまだネットワークは接続しません!

5. 初期設定

Ubuntuにログインしたら、

  1. 有線ネットワークを接続(無線ネットワーク接続出来るのならそれでも良い)
  2. パッケージを更新

    sudo apt update
    sudo apt upgrade


  3. 初期設定
    Ubuntu18.04 インストール後の初期設定メモ - Qiitaを参考に、必要な設定を行いました。

  4. zram-configのインストール
    Rasbian用のメモリをUbuntu用にスワップするためにインストールしておきます。

    sudo apt install zram-config


  5. Ubuntuのデスクトップ環境をインストール

    sudo apt install ubuntu-desktop


  6. デスクトップ環境を起動

    startx


6. RAMの割当て

Raspberry pi 4のRAMをUbuntuに適切に割り当てるために、zram-configを使用します。

sudo vim /usr/bin/init-zram-swapping

そして以下の赤線部分のように「* 3」を加えます。こうすることで約5.5GBのメモリスワップを確保します。

f:id:detamamoru:20201218133422p:plain
「* 3」を加える

7. VNC環境構築

キーボードやマウスを毎回接続するのは面倒なのでVNC環境を構築します。

sudo apt update

xfaceデスクトップ環境を使います。gnomeだとsystemdでgnome-sessionのidがうまく取得できず、画面が真っ暗になって正常動作しなかったためです。

sudo apt install xfce4 xfce4-goodies

tigervncを使うことにしました。特に理由はありません。

sudo apt install tigervnc-standalone-server tigervnc-common

初期起動時はVNCパスワードの設定を行います。このパスワードはVNCクライアントから接続する際に必要なので覚えておいてください。

vncserver

すでに起動しているvncserverをkillします。

vncserver -kill :*

xstartupを既存のものから変更します。

mv ~/.vnc/xstartup ~/.vnc/xstartup.bkp
vim ~/.vnc/xstartup
#!/bin/bash
xrdb $HOME/.Xresources
startxfce4 &

実行権限を与えます。

sudo chmod +x ~/.vnc/xstartup

systemdのサービスファイルを作成します。

sudo vim /etc/systemd/system/tigervnc@1.service
[Unit]
Description=tigervnc (Remote access)
After=syslog.target network.target

[Service]
Type=forking
User=ubuntu
Group=ubuntu
PIDFile=/home/ubuntu/.vnc/%H:%i.pid
WorkingDirectory=/home/ubuntu
ExecStartPre=/usr/bin/vncserver -kill :%i > /dev/null 2>&1
ExecStart=/usr/bin/vncserver -localhost :%i
ExecStop=/usr/bin/vncserver -kill :%i

[Install]
WantedBy=multi-user.target

systemdに作成したサービスを登録します。

sudo systemctl daemon-reload
sudo systemctl enable tigerservice@1.service
sudo systemctl start tigerservice@1.service

下記のURLを参考にインストールしました。
Install TigerVNC on Ubuntu 18.04 - JournalDev
Ubuntu 20 .04にVNC をインストールして構成 する方法 | DigitalOcean

8. OpenCV 4.5.0をインストール

使うと思うのでOpenCV 4.5.0(2020/12/17時点の最新バージョン)をインストールしておきます。

  1. 必要なライブラリをインストール

    sudo apt update
    sudo apt upgrade
    sudo apt install build-essential cmake gcc g++ git unzip pkg-config
    sudo apt install libjpeg-dev libpng-dev libtiff-dev
    sudo apt install libavcodec-dev libavformat-dev libswscale-dev
    sudo apt install libgtk2.0-dev libcanberra-gtk*
    sudo apt install libxvidcore-dev libx264-dev
    sudo apt install python3-dev python3-numpy python3-pip
    sudo apt install python-dev python-numpy
    sudo apt install libtbb2 libtbb-dev libdc1394-22-dev
    sudo apt install libv4l-dev v4l-utils
    sudo apt install libopenblas-dev libatlas-base-dev libblas-dev
    sudo apt install liblapack-dev gfortran libhdf5-dev
    sudo apt install libprotobuf-dev libgoogle-glog-dev libgflags-dev
    sudo apt install protobuf-compiler

  2. OpenCV 4.5.0をダウンロード

    cd ~
    wget -O opencv.zip https://github.com/opencv/opencv/archive/4.5.0.zip
    wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.5.0.zip
    unzip opencv.zip
    unzip opencv_contrib.zip
    mv opencv-4.5.0 opencv
    mv opencv_contrib-4.5.0 opencv_contrib
    cd opencv
    mkdir build
    cd build
    make -j4
    sudo make install
    sudo ldconfig
    sudo apt-get update


Raspberry Pi Camera V2の接続とテスト

  1. 接続
    下記写真のように、両側の黒いピンを押し上げて、隙間に差し込みます。

    f:id:detamamoru:20201220180038j:plain
    接続前
    f:id:detamamoru:20201220180139j:plain
    接続後


  2. テスト
    OpenCVで確認してみます。
    テストコードは以下。VideoCaptureの引数は私の環境では0でした。

    #test_camera.py
    import cv2
    
    capture = cv2.VideoCapture(0)
    
    while(True):
        ret, frame = capture.read()
        windowsize = (800, 600)
        frame = cv2.resize(frame, windowsize)
    
        cv2.imshow('test cameara',frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    
    capture.release()
    cv2.destroyAllWindows()
    
    python3 test_camera.py

    ちゃんとカメラ動画が映れば準備完了です。


ROS(melodic)のインストール

Ubuntu 18.04にインストール

Ubuntu 18.04にROS(melodic)をmelodic/Installation/Ubuntu - ROS Wikiに従ってインストールします。
Keyが変わったりするので、必ずwikiを見てインストールします。
今回はros-melodic-desktop-fullをインストールします。
インストールが完了したら、ROSのワークスペースを作成・初期化しておきます。

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
cd ../
catkin_make
echo "source ${HOME}/devel/setup.bash" >> ~/.bashrc

roscoreコマンドを実行してマスターが起動するか確認します。

roscore
...
started core service [/rosout]

Windows 10 64bitにインストール

併せて、Windows 10マシンにもROS(melodic)をInstallation/Windows - ROS Wikiに従ってインストールします。
ただし、最初のChocolateyのインストールがうまくいかなかったので、Chocolatey Software | Installing Chocolateyに従ってインストールします。
PowerShellを管理者権限で起動して、以下を実行します。ただし、コマンドは上記したページをコピーすること!

Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))

こちらもroscoreコマンドを実行してマスターが起動するか確認します。

roscore
...
started core service [/rosout]

ROSからカメラ画像データを送信

ROSパッケージのcv_cameraを使ってカメラ画像を送ってみます。

cv_cameraパッケージのインストール

cd ~/catkin_ws/src
git clone https://github.com/OTL/cv_camera.git
cd ../
catkin_make

動作確認

まずはローカル内で動かしてみます。

roscore
rosparam set cv_camera/device_id 0
rosrun cv_camera cv_camera_node

rvizで確認します。

rviz

起動後「Displays」→「Image」を追加し、「Image Topic」に「/cv_camera/image_raw」を選択するとカメラ画像が表示されます。

別マシン上でカメラ画像を確認します。
Windows 10側をペアレントとし、Raspberry Pi 4側をチャイルドとします。(ちなみに最近マスター/スレーブという呼び方は差別的として改められているようです。なのでここではマスターをペアレント、スレーブをチャイルドと呼ぶことにします。)
まず、Windows 10側、Raspberry Pi 4側どちらにも環境変数「ROS_HOSTNAME」と「ROS_MASTER_URI」を設定します。
Windows 10側はROS_HOSTNAMEに「自身のIPアドレス」を、ROS_MASTER_URIに「http://自身のIPアドレス:11311」を設定します。
Windows 10側はROS_HOSTNAMEに「自身のIPアドレス」を、ROS_MASTER_URIに「http://Windows 10側のIPアドレス:11311」を設定します。

次に、Windows 10側でroscoreを起動します。さらに、rvizも起動しておきましょう。
Raspberry Pi 4側では先ほどと同様にcv_cameraノードを起動します。
rviz上にImageを追加して、カメラ画像が表示されていれば成功です。

もし、この時何もトピック名が表示されない場合は、Windows 10側のファイアウォールを疑ってください。私の場合受信規則のpythonのパブリックを許可していなかったため、TCP接続できない状態でした。

以上で、環境構築は完了です。