コンテンツへスキップ

ラズパイ上でruby on Railsをやるのが楽なのでは?と思って環境構築したときに詰まったことを書きます。

IoT的なシステムを作る上で、センサ情報をラズパイが取得し、webアプリへ送信するものを作るならラズパイ上でruby on Railsをやるのが楽なのでは?と思って環境構築したときに詰まったことを書きます。

目次

  • 目的
  • 環境構築
  • 参考

目的

ラズパイ上でRuby on Rails環境を作ります。現在の環境は以下。

  • raspberry pi 3 B +
  • ubuntu MATE

Railsとは

Ruby on RailsはRubyで書かれたwebアプリケーションフレームワークであり、webアプリケーションを他のフレームワークよりも少ないコードでかけるように設計されています。 Model View Controllerアーキテクチャに基づいて構築されています。


Model View Controller
  • model:処理
  • view:画面表示部分
  • controller:modelとviewをつなぐ処理 modelとviewへの命令に変換する

modelとviewの中間処理をcontrollerに書く、というような思想がModel View Controllerです。図はwikipediaを参考にしました。

環境構築

普段通りアップデートを確認した後、以下のコマンドを打っていきます。先にnode.jsをインストールしているのは、これがないとjavascriptがないと怒られるからだそうです。

$sudo apt-get install nodejs 

次に参考で見たのでは以下のようにやっていましたが、rbenv install -listで入れたいバージョンが出てこないエラーが発生しました。

$sudo apt-get install rbenv ruby-build 

理由についていろいろと調べたところ、知人によってsudoでrbenvを入れたせいでroot権限が付与されたのではないかと指摘されますた。 ですので、試行錯誤の結果、gitからcloneでインストールしたら成功しました。APPはお好きな名前に変更してください。

$sudo rm -rf ~/.rbenv
$git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build //続いているので注意
$rbenv install -l 
$rbenv install 2.5.0
$rbenv rehash
$sudo reboot
$gem install bundler
$gem install rails
$ sudo apt-get install libsqlite3-dev
$ sudo reboot
$ mkdir rails
$ cd rails
$ rails new APP —skip-bundle //APPアプリを作成。
$ cd APP

ここで、ラズパイと相性が悪い部分があるので、エラー回避のため、config/boot.rbの以下を削除(コメントアウト)します。

#require ‘bootsnap/setup’

ラズパイの接続状況を調べて、以下のように書きます。右上の有線・無線マークの接続情報から見られます。

$ rails s -b (ラズパイの現在のPIアドレス) -d

これにて成功です。http://(ラズパイのIPアドレス):3000 を開いて確認します。

Railsのhello

成功ではありますが、chromium-driver-helperがサポート終了するらしいので、webdriberに移行して欲しいというメッセージが現れます。

+--------------------------------------------------------------------+
 |                                                                    |
 |  NOTICE: chromedriver-helper is deprecated after 2019-03-31.       |
 |                                                                    |
 |  Please update to use the 'webdrivers' gem instead.                |
 |  See https://github.com/flavorjones/chromedriver-helper/issues/83  |
 |                                                                    |
 +--------------------------------------------------------------------+

rails/Gemfileを以下のように変更して、

group :test do
 # Adds support for Capybara system testing and selenium driver
 gem 'capybara', '>= 2.15'
 gem 'selenium-webdriver'
 # Easy installation and use of chromedriver to run system tests with Chrome
 gem 'chromedriver-helper' => gem 'webdrivers'  //ここ
end
$bundle install

同様にサーバーを立てて動作を確認しましょう。 アプリケーションを作るたびにこの設定をした方がいいと思います。このときもconfig/boot.rbの設定変更を忘れずに。

雑記

以前windowsに入れたときにめちゃくちゃ大変だった記憶があります。rubyのバージョンが合わないとすぐエラー!要注意。

参考

1

ラズパイからSlackへの通信をSlack APIのSlack Incoming WebHooksでやります。

目次

  • Slackとは
  • slackへの通知
  • やってみた

slackとは

slackとは、スチュワート・バターフィールドによって開発されたチームコミュニケーションツールです。基本的にはITっぽいLINEみたいなもので、大学やIT系の集団がよく使っており、コードを送ったりするときに便利です。 公式Slack 機能 、公式slack サインイン

APIについて

slackにはいろいろと便利機能が有るらしく、今回の通知機能もslackが提供していすサービス「Incoming WebHooks」「Outgoing WebHooks」を使用します。 公式Slack API

APIとは、

ソフトウェアからOSの機能を利用するための仕様、またはインターフェースのこと。一般的にAPIといった場合は、OSの機能を利用するための関数を指す。APIの概念が登場するまでは、OSの機能を利用するためのプログラムをそのつど開発していたが、APIの登場によりそれらの関数を呼び出すだけでOSの機能を利用できるようになった。最近では、Webサービスの機能を外部から利用するためのインターフェースもAPIと呼ばれる。

from API(エー ピー アイ)とは - コトバンク

APIを使うと、OS(windowsなど。人間やアプリケーションとハードウェアの中間で頑張っている)の機能を呼び出せるという事だと思います。

slackへの通知

今回は簡単のためにSlack Incoming WebHooksを使用します(前提として、slackにすでにサインインしているものとします)。Incoming WebHooksはslackが提供しているAPIの一つで、外部からslackへ送信する機能です。slack側から送信することはできないようです。

通知をするまでの手順です。

  • Slackアプリを作成
  • Incoming WebHooksを有効化し、各種設定をする
  • テスト

Slack Incoming Webhookの設定

ここからSlackn App Directory,検索バーからincoming webhooksを検索して選びます。投稿先のチャンネルを選び、追加します。私はあらかじめSlackでtestチャンネルを作っておきました。プライベートチャンネルも選べます。また、この画面下の方でアイコン画像の設定もできます。

なんやかんや設定して、保存します。

slackwebのインストール

ラズパイにslakwebをインストールします。pipとはPythonのパッケージをインストールするのを簡単にするツールです。apt-getと同じ感覚で使えます。Pythonパッケージに関するツールなので、今回のコードはPythonで書いていきます。ラズパイに以下のように入力すればインストール完了です。

$sudo pip install slackweb
デバック

一応slackwebはインストールできたものの、You should consider upgrading via the 'pip install --upgrade pip' command.というメッセージが出ているので指示に従いました。pip はpythonのapt-get見たいなものです。するとまたもエラー。

$pip install --upgrade pip
Collecting pip
 Downloading https://files.pythonhosted.org/packages/d8/f3/413bab4ff08e1fc4828dfc59996d721917df8e8583ea85385d51125dceff/pip-19.0.3-py2.py3-none-any.whl (1.4MB)
   100% |████████████████████████████████| 1.4MB 207kB/s
Installing collected packages: pip
Successfully installed pip-8.1.1
You are using pip version 8.1.1, however version 19.0.3 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
inomata@inomata-desktop:~$ pip install --upgrade pip
Traceback (most recent call last):
 File "/usr/bin/pip", line 9, in <module>
   from pip import main
ImportError: cannot import name main

どうやら参考サイトによると、aptで入れたpipと今入れようとしたpipに互換性がないために怒られてしまっている模様。

$python -m pip uninstall pip
 Successfully uninstalled pip-19.0.3

これ、uninstallするのって19のほうなんですね。このあと

$ sudo apt install python-pip
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
python-pip はすでに最新バージョン (8.1.1-2ubuntu0.4) です。
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 0 個。

こんな感じ。まあ問題はない。

この章の参考

やってみた

まずは動作テストです。コードはpythonで書きます。ラズパイにはPythonが標準でインストールされています。incomingSlackwebhools_test.pyを作成し、emacs(好きなエディタ)で開きます。

$touch incomingSlackWebhooks_test.py
$emacs incomingSlackWebhooks_test.py 
import slackweb
slack = slackweb.Slack(url="incoming設定ページでコピーしたURL")
slack.notify(text= "hello world")

slackで指定したチャンネルに「hello world」と届いていればOKです。

画像

incomingの方はすぐですね。同様にすればセンサーの値を取得して変数に与えたりできます。今で元にメスのジャンパーピンがないのでできませんが、何もしないと面白くないので以下のような日にちを伝えるプログラムdateForSlack.pyを作成しました。

# -*- coding: utf-8 -*-

import slackweb
import datetime

slack = slackweb.Slack(url = "incoming設定ページでコピーしたURL")
date = datetime.date.today()
slack.notify(text = "今日は"+str(date))
print("今日は"+str(date))

datetimeというのは実行したときの日付を取得するモジュールです。型変換して文字列にして出力しています。出力結果は以下のようになります。

$cd dateForSlack.pyがあるところ
$python dateForSlack.py

この章の参考

raspberry pi のpythonライブラリはpipよりart-getで入れるのが断然早い -からあげ

IPアドレスを調べるときの参考 ifconfigが非推奨に!? ifconfigコマンドを使わずにRaspberry PiのIPアドレスを調べる方法 -猿まね電子工作

ラズパイを繋いだときに、ホストアドレスからランダムに指定されるのがデフォルトのはず。固定アドレスにする時 Raspbian(jessie)の固定IPアドレス設定方法 -俺の技術メモ

雑談

参考のリンクを書く場所で迷っています。文章の邪魔をしないようにしつつ文章のすぐ近くに配置すれば情報元の対応がわかりやすいですが、一方でこの投稿でほしい情報がすべて手に入るのであれば対応がわかる必要がないから最後にまとめて書くのが親切かもしれない。いろいろなパターンでやってみるつもりです。

目次

  • やった事
  • 目的
  • ラズパイとは
  • ROSとは
  • 環境構築1 Ubuntu
  • 環境構築2 ROS

やった事

Raspberry Pi 3 B+ に Ubuntu MATE と ROSをインストールし、ROSで動作確認を行いました。PCはWindows10です。

目的

これは Web X IoT メイカーズチャレンジ のハッカソンの一環としての活動で、機能の1つである通知機能をやったので、もっといろいろやってみる準備をします。 =>webIoTメイカーズチャレンジに参加前編

一方でゼミでROSをやっていて、全然解らなくてヤバいので家で勉強しようかとも思っています。というわけで、

  • ROSが使える
  • Webとの通信ができる

上記2点を満たした環境を用意しようと思います。調べてみるとRaspbian(ラズパイで一番スタンダードであろうOS)でROS環境を作るのは大変そうなので、Ubuntuでいきたいと思います。ラズパイに向いているのは軽量なMATEらしいですので採用。

Raspberry Piとは

ラズパイとは、内蔵ハードディスクなどを搭載しない代わりに、SDカード又はmicroSDを起動および長期保存用のストレージに利用する、「ワンボードマイコン」と呼ばれるハードウェアです。ラズベリーパイ財団より安価な教育用のシングルボードコンピューターとして開発されました。

つまり、PCほどの計算の能力はないけど、PCみたいに使えるIoTに向いた機械です。標準でネットにつなげたりするので初心者に優しいらしい。今回私はRaspberryPi 3 model B+ を使います。一番新しい奴です。

ラズパイ本体の他にいくつか用意するものがあります。

  • SDカード(ubuntuMATE、ROSを入れるなら32GB以上)
  • ディスプレイ(HDMLが接続できるTVでOK。PS4をやってるやつとか)
  • 有線ネットワーク(raspberryPiは3はwifiでもいける)
  • キーボード
  • マウス

RSコンポーネントRaspberry Pi 3 B +マザーボード

Team microSDHCカード 32GB 高速転送UHS-1 日本国内10年保証 SD変換アダプター付属 正規品

アイトランク iTrunk Raspberry Pi 3用USB電源アダプター PSE認証 5V 2.5A Raspberry Pi 3 Model B/B+ Raspberry Pi 2 Model B Raspberry Pi Model B+ B Plus適用

この章の参考

ROS とは

ソフトウェア開発者のロボット・アプリケーション作成を支援するライブラリとツールを提供しているオープンソースのソフトウェアです。特徴として以下をあげます。

  • ソフトウェアプラットホームである
  • ミドルウェアである
  • フレームワークである

ソフトウェアプラットホーム

情報プラットホームのエコシステムの4要素としてハードウェア、OS、アプリケーション、ユーザがあります。 「情報プラットホームのエコシステム」というのはわかりにくい言い回しですが、これは俗な言い方をすれば「技術が流行る」ということです。

現在私たちはスマホを持ち、アプリをインストールして使って居ますが、このようにスマホが流行るとよりよいアプリが開発されてさらに利用される、というような循環が生まれます。

ロボットが身近な存在になり、 ユーザーや開発者が増え、市場が活発になれば様々な技術が生まれて行く。このようなサイクルを作るために必要なものがロボットソフトウェアプラットホーム です。

ROSの機能

技術を流行らせるためにはソフトウェアを使い回せるようにしたり、開発者がロボットのすべてを知らなくても一部だけのソフトウェアを作ればいいようにしたりする必要があります。

ROSでは機能(モジュール)を小さな単位(ノード)に分割し、ノード間で厳格なプロトコルのもとで異なる言語でも通信する仕組みになっています。それによって、C++で書かれたモジュールとPythonで書かれたモジュール間で通信するような事を可能にしています。

また、パッケージ管理、デバッグ用ツール、開発ツールなどが整っているので開発がしやすくなっており、誰でも公開できるようになっています。

という訳でROSはミドルウェアとフレームワークの側面をとったロボットソフトウェアプラットホームです。(という風にまとめましたがどうでしょう)

この章の参考

Ubuntuとは

ラップトップ、デスクトップ、そしてサーバーに利用することができるOSで、無料で提供されています。一般のコミュニティによって開発されており、Linuxの派生のDebianから派生して作られました。カノニカル社が支援しており、Linuxとしては資金的にも人員的にも非常に手厚い支援によって開発されています。 半年ごとにリリースされていて開発が早い一方で、長期補償板(LTS)も存在します。最新のアプリケーションを利用する事も、安定した環境で作業する事も出来ます。また、Ubuntu Japanese Teamによって日本語環境が整えられています。インストール後すぐに使える、GUIでデスクトップでマウスで操作できる、など初心者にも使いやすいOSです。

今回入れるのはUbuntuの派生の一つである Ubuntu MATE です。メモリ消費が軽いのでラズパイ向きです。

この章の参考

環境構築1 Ubuntu MATE

起動まで

ラズビアンでROS環境を作るのは大変そうなので、ubuntu の中でラズパイに向いている ubuntu MATE 環境を作ります。このとき、

ラズパイ公式 Downloads

でダウンロードしたのを使うと、ラズパイ3 model B+ではOSが動きません。虹&雷マークで固まってしまいます。

雷マークは電圧不足のマークですが、電源を変えてもダメでした。調べてみるとシステムファイルの不具合でも発生するとのこと。ラズパイはB B+でハードもファームウェアも違うらしい。なのでいろいろ設定が必要みたいです。 下のサイトが最高に神なので乗せていきます。ありがとうございます。このサイトの添付に3B+でも動くように修正されたimgファイルがありますので、これを使います。

RaspberryPi 3B+にROSを導入する - Isao HARA

このページのubuntu MATE からダウンロードした「ubuntu-mate-16.04~.img.xz」を解凍します。このとき解凍は7-zipをインストールして使いました。


「ubuntu-mate-16.04~.img」をSDカードに書き込みます。このSDカードがラズパイのメモリになります。書き込みにはWin32 Disk Imagerをインストールしました。microSDをセットして起動すると、

出ました。ついに!(ここまで調べるのになんやかんや2日)

ここからはubuntu上での作業です。言語等の説明は省略します。ただ、wifi設定は後でやるのが無難だと思います。wifi設定に失敗するとユーザーが登録されなくなるのではじめからやり直す事になります。左上の アプリケーション/システムツール/MATE端末 で指示を出していきます。この端末はよく使うので右クリックしてデスクトップに追加しておくと良いと思います。

更新

まずはいろいろ更新 //コメント

sudo apt apdate //最新のパッケージを取得
sudo apt dist-upgrade// 最新のパッケージの更新と不要なパッケージの削除
sudo apt autoremove//依存関係で必要なくなったパッケージの削除

初回の更新なのでこれだけで1時間くらい掛かりました。

日本語入力

日本語設定をします。システム/設定/ユーザー向け/言語サポートででたウインドウの「言語のインストールと削除...」を押してインストール、「システム全体に適用」そのあと再起動します。もう一度言語サポートを開いて「キーボード入力に使うIMシステム:」のドロップダウンリストから「fcitx」を選択して再起動します。

インターネットブラウザ

インターネットブラウザのChromiumをインストールします。 私はいつもネットにつなっているか試すとき猫で検索をかけるんですが、あらかじめ入っているfirefoxというブラウザがcrashしたという通知が出ました。新しくChromiumを入れます。Chromium は Google Chrome のベースらしいです。コマンドのsudoというのは管理者権限のようなものです。

sudo apt install chromium-browser

以上です。

本来ならリモートデスクトップしたいんですが、うまくいきませんでした。出来たら追記します。RDPできるとコピペができます。

この章の参考

以前使って居たラズパイでは画面サイズがおかしくなりました。画面の大きさはディスプレイによっては合っていないことがあります。以下を見ました。メモとして張っておきます。

環境構築2 ROS

参考に挙げた本によれば、2019年現在(次のROS LTSまでは)Ubuntu 16.04 Xenial Xerus(LTS)(またはLinux Mint 1.8x) + ROS Kinetic Kameがいいらしいです。

以下を順番に実行しました //コメント

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' //関連サーバのURL追加
sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116//ROS関連サーバの公開キー。サーバ更新のたびに変化するのでwikiで確認してください
sudo apt-get update  //ubuntuのアップデート さっきやったからやらなくていいかも
sudo apt-get upgrade 
sudo apt-get install ros-kinetic-desktop-full //rosのインストール 関連ライブラが含まれる
sudo apt-get install ros-kinetic-rqt*//グラフィカルユーティリティーツールrqtに関連するすべてのパッケージのインストール 上で基本的なqrtの機能はインストールされるためやらなくてもいい
sudo rosdep init //ROSのメインコンポーネントを利用したりコンパイルする際に、ROSのOSに依存したライブラリやツールをインストールするツールであるrosdepを初期化
rosdep update 
sudo apt-get install python-rosinstall //ROSパッケージをインストールするときに役立つrosinsrallのインストール
source /opt/ros/kinetic/setup.bash //環境変数の読み込み
mkdir -p ~/catkin_ws/src //ROS専用のビルドシステムcatkinのワークスペースcatkin_wsを作成、初期化
cd ~/catkin_ws/src
catkin_init_workspace 
cd ~/catkin_ws/ 
catkin_make //ビルドコマンドcatkin_make。ビルド関連ファイルはbuild、実行関連ファイルはdevelに作成される
source ~/catkin_ws/devel/setup.bash //catkinビルドシステムの環境設定ファイルの読み込み

このあとROSの動作確認のために

roscore

してエラーをはきました。

reboot //再起動

再起動してからroscoreしたら動きました。成功の場合、最後に

started core service [/rosout]

と書かれた文が表示されます。ROSを使うときはorscoreは動かしっぱなしにするので端末を複数開いて使います。 Ctrl+Cで終了することができます。

source のコードを毎回書くのは面倒なので、いくつか設定します。エディタにはemacsを使いました。

emacs ~/.bashrc

で開いて、以下を付け加えました。今回はショートカットコマンドと環境設定の自動読み込みだけ追加します。

# 環境変数
source /opt/ros/kinetic/setup.bash
source ~/catkin_ws/devel/setup.bash

# コマンド
alias cw='cd ~/catkin_ws'
alias cs='cd ~/catkin_ws/src'
alias cm='cd ~/catin_ws && catkin_make'

変更を反映するために一度端末を閉じてからもう一度開いて

source ~/.bashrc

これで自動で読み込まれるようになりました。ラズパイを起動してすぐにroscoreでもオッケーです。

最低限のエディタ

その前に、エディタが入っていないので、ひとまず最低限のエディタの用意をします。ひとまず知ってるエディタemacsをインストール。好きなのを使ってください。

sudo apt-get install emacs24

ROSのテスト

roscoreが起動できればどのサイトでもオッケーみたいでしたが、つまらないのでROSに入っているシミュレーションツールを動かしてみます。

roscore //すでに起動している場合は不要
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key

この状態で←↑→↓など矢印を押してみると、カメが動きます。楽しい!!

これでデータの流れを可視化します。

rosrun rqt_graph rqt_graph

このカメ、矢印上で前進、右で120度右、左で120度左を向きました。動かしにくいので設定をいじりたかったんですが、やめました。

この章の参考

雑談

私はすべてのSNSで亀のアイコンにしているんですが、ROSのシミュレーションも各バージョンで毎回カメでなので運命を感じざるを得ませんね。
追記(2019/3/20)Amazonリンクを増やしました。