見出し画像

RaspberryPi Zero WH へ ROS melodic をインストールした後の試行錯誤の備忘録

RaspberryPi Zero WH へ ROS melodic をインストールし、PiCamera や ROSSerial で Arduino を動かそうとした過程や結果を残しておこうと思います。

使用機器

- RaspberryPi Zero WH 
- Arduino Pro mini (5V)

OSやROSバージョンなど

- Raspbian Stretch
- ROS Melodic

ROSのインストール

RaspberryPi Zero WH へ ROS をインストールする方法としてソースコードのビルド&インストールが必要になります。ただし、これらを RaspberryPi Zero WH で行うとインストール完了するまで半日以上かかる可能性があります。なので、既にインストール済みのものを使うことをオススメします。

というわけで Installing ROS Melodic on Raspbian Stretch の執筆者の方が用意されているものを使わせてもらいます。(download からイメージが取得できます)

前準備

イメージを SD カードにインストールしてから起動する前にやることがあります。それは SSH の設定と USB 接続によるインターネット接続を有効化しておくことです。まず、SSH の設定は SD カードを PC で開くと /boot フォルダ、ディレクトリがあるので、/boot 配下に ssh というファイルを作成するだけです。また、ダウンロードしたイメージは静的 IP が設定されているため、初めて起動すると WiFi に接続できないです。なので USB 接続によるインターネット接続を有効化しておく必要があります。こちらの有効化は Windows や Mac などで手順が異なると思うので Raspberry Pi Zero(W, WH)のセットアップ を参考にしてみてください。あとは RaspberryPi Zero WH と PC を USB で接続して起動しましょう。うまくいけば、SSH で接続できるはずです。

起動してからの設定

起動したら WiFi のパワーマネジメント機能をオフにしておきましょう。これは省電力モードへ移行すると WiFi が切れてしまうという問題を防ぐために行います。デフォルトはオンのままです。やることは Vim などで /etc/rc.local を開き、以下のように修正して保存するだけです。再起動して iwconfig コマンドで power management の項目が off になっていれば正しく設定完了です。

_IP=$(hostname -I) || true
if [ "$_IP" ]; then
 printf "My IP address is %s\n" "$_IP"
fi

# Raspberry Pi Zero W WiFi Power Management off
sudo /sbin/iw dev wlan0 set power_save off  # ここを追記
exit 0

あとはネットワーク関係の不要な設定を無効化・停止させます(必要であればそのままでも良いと思います)

$ sudo systemctl stop hostapd
$ sudo systemctl stop dnsmasq
$ sudo systemctl disable hostapd
$ sudo systemctl disable dnsmasq

OpenCV 3.4.6 のインストール

ROS で cv_camera を使いたいのですが、インストールできなかったため、RaspiCamera V1 と Picamera と OpenCV の組み合わせで画像の Publish ができないか考えました。まずは OpenCV のインストールとして以下手順を実行。

$ sudo apt install -y libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libgtk2.0-dev libatlas-base-dev gfortran python-numpy
$ mkdir opencv_3.4.6
$ cd opencv_3.4.6
$ git clone https://github.com/opencv/opencv.git -b 3.4.6 --depth 1 opencv_source
$ cd opencv_source
$ mkdir build
$ cd build
$ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..
$ make
$ sudo make install

make を実行し、完了するまで 12 時間ぐらいかかりました...笑。インストール後に以下のような感じで確認できればインストール完了です。

>>> import cv2
>>> cv.__version__
>>> 3.4.6

ROS の vision_opencv パッケージのインストール

ROS で OpenCV を使用するにあたり、vision_opencv パッケージが必要らしいので以下手順でインストール

$ cd catkin_ws/src
$ git clone https://github.com/ros-perception/vision_opencv.git
$ cd vision_opencv
$ git checkout melodic
$ cd ../..
$ catkin_make
$ catkin_make install

cv_bridge に依存したパッケージの用意

ROS と OpenCV を繋ぐには cv_bridge が必要になります。お試しのため、以下コマンドで cv_bridge に依存したパッケージを作成しました。

$ catkin_create_pkg cv_bridge_tutorial sensor_msgs opencv2 cv_bridge rospy std_msgs

しかし、この作成した cv_bridge_tutorial のパッケージを catkin_make すると以下エラーが発生し失敗します。

CMake Error at /opt/ros/indigo/share/catkin/cmake/catkinConfig.cmake:83 (find_package):
 Could not find a package configuration file provided by "opencv2" with any
 of the following names:

   opencv2Config.cmake
   opencv2-config.cmake

 Add the installation prefix of "opencv2" to CMAKE_PREFIX_PATH or set
 "opencv2_DIR" to a directory containing one of the above files.  If
 "opencv2" provides a separate development package or SDK, be sure it has
 been installed.

これは opencv2 という名前のパッケージが見つからないというエラーなので、パッケージ内の CMakeLists.txt を修正します。修正後、catkin_make を実行します。

修正前

find_package(catkin REQUIRED COMPONENTS
 cv_bridge
 opencv2
 rospy
 sensor_msgs
 std_msgs
)

修正後

find_package(catkin REQUIRED COMPONENTS
 OpenCV
 cv_bridge
#  opencv2
 rospy
 sensor_msgs
 std_msgs
)

実際に ROS と OpenCV が使えるかは ROS+OpenCV 無地の画像のトピックを出すノード[c++][Python] の記事のコードを参考に試してみたところ、Publish ができていることを確認できました。しかし、Picamera と OpenCV を組み合わせて ROS で Publish するまでは気力が尽きて試せていません...。(多分できると思いますが、スペック的に厳しくなるんじゃないかなと思います)

ROSSerial を使ってみる

ダウンロードしたイメージは ROSSerial がインストール済みなので特に再度インストール等は不要です。まず、Arduino 用に ROS からライブラリを生成して、そのライブラリを用いて Arduino のコードを書いて、Arduino に書き込む必要があります。しかし、現在では Arduino の ROS ライブラリは用意されているので ROS から生成する必要はありません。Arduino IDE の方で ros_lib と検索すれば出てくると思うので、それをインストールすれば使えると思います。一応、ROS からライブラリを生成する手順は以下です。ros_lib というフォルダ/ディレクトリが生成されているので SCP などで Arduino のコードを書く PC に送信し、Arduino/libraries 配下に ros_lib を配置すれば OK です。

$ cd ros_catkin_ws
$ source ./devel/setup.bash
$ rosrun rosserial_arduino make_libraries.py .

ROS をインストールした RaspberryPi から Arduino を操作する例として、Arduino の LED を点灯させる Subscribe のソースコード(以下)を用意し、Arduino へ書き込んでおきます。


#include <ros.h>
#include <std_msgs/Bool.h>

const int LED_PIN = 13;

void blink(const std_msgs::Bool& is_on) {
 if (is_on.data) {
   digitalWrite(LED_PIN, true);
 } else {
   digitalWrite(LED_PIN, false);
 }
}

ros::Subscriber<std_msgs::Bool> led_sub("led", &blink);

void init_pin() {
 pinMode(LED_PIN, OUTPUT);
}

void setup() {
 init_pin();
 nodeHandle.initNode();
 nodeHandle.subscribe(led_sub);
}

void loop() {
 nodeHandle.spinOnce();
 delay(1);
}

RaspberryPi Zero WH の Pin8(Tx)と Arduino の Rx 、RaspberryPi Zero WH の Pin10(Rx)と Arduino の Tx を繋ぎます。繋ぐにあたっては電圧が異なるので変換モジュールを間に挟んでください。(参考:RaspberryPi Zero WHと Arduino Pro mini でシリアル通信してみる

RaspberryPi 側で以下コマンドで Arduino との通信を開始してみましたが、エラーが出てしまい、通信できなかったです。USB 接続の方は両端がオス-オス の micro-USB を持っていないため、試していません...。

$ rosrun rosserial_python serial_node.py /dev/ttyS0

エラー

[ERROR] [1606833131.308248]: Creation of publisher failed: unpack requires a string argument of length 2

まとめ 

・RaspberryPi Zero WH + ROS + OpenCV + PiCamera はできそうであるが、そこまで準備するまでの道のりが長い

・RaspberryPi Zero WH + ROS + Arduino Pro mini 5V のシリアル通信はできなかった

色々と試行錯誤をし、出来そうだけどできない、わからないといったことが多かったです。あと試行錯誤を繰り返したいのですが、やはり RaspberryPi Zero WH のスペック的に何度も繰り返すのは厳しいです。なので、RaspberryPi で ROS をインストールして使いたい場合は無難に Zero ではない RaspberryPi に Ubuntu を入れて ROS をインストールするといった方法が一番良いと思います。

この記事が気に入ったらサポートをしてみませんか?