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 をインストールするといった方法が一番良いと思います。
この記事が気に入ったらサポートをしてみませんか?