FC2ブログ

raspi4にROS-kineticを入れる


自分用にRaspi4にKineticを入れたSDイメージも作っておいた方が良さそうなので作っておきました。
melodicよりも需要ありそう。
Raspi3へのROS-kineticインストールは簡単だったのですが、Raspi4-kineticとなるとまた面倒が。
そのままではインストールがうまくいかないので、なかなか大変でした。。。
余力があったらQiita化しておきます。まずは自分メモ。



参考URL
インストール方法
https://wiki.ros.org/ROSberryPi/Installing%20ROS%20Kinetic%20on%20the%20Raspberry%20Pi

boostのダウンロードもと
https://www.boost.org/users/history/version_1_58_0.html

boostのビルド方法
https://boostjp.github.io/howtobuild.html


■ 環境
・ラズパイ4でSDカードはNoobsから入れたもの。
・devian version 10.1
・カーネルのバージョン Linux raspberrypi 4.19.75-v7l+

■ 公式のインストール手順を途中まで行う。

$ sudo apt-get install dirmngr

$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'

$ sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654

$ sudo apt-get update
$ sudo apt upgrade
(注:公式通りのsudo apt-get upgradeだと引っかかることがある)

$ sudo apt-get install -y python-rosdep python-rosinstall-generator python-wstool python-rosinstall build-essential cmake

$ sudo rosdep init
$ rosdep update

$ mkdir -p ~/ros_catkin_ws
$ cd ~/ros_catkin_ws

■ ROS-Comm: (recommended) を入れる。
(Desktopを入れようとするとOpenCVのところで引っかかるのですが未解決のため)

$ rosinstall_generator ros_comm --rosdistro kinetic --deps --wet-only --tar > kinetic-ros_comm-wet.rosinstall
$ wstool init src kinetic-ros_comm-wet.rosinstall


■ 3.2 依存関連の処理

$ mkdir -p ~/ros_catkin_ws/external_src
$ cd ~/ros_catkin_ws/external_src
$ wget http://sourceforge.net/projects/assimp/files/assimp-3.1/assimp-3.1.1_no_test_models.zip/download -O assimp-3.1.1_no_test_models.zip
$ unzip assimp-3.1.1_no_test_models.zip
$ cd assimp-3.1.1
$ cmake .
$ make
$ sudo make install

$ cd ~/ros_catkin_ws
$ rosdep install -y --from-paths src --ignore-src --rosdistro kinetic -r --os=debian:buster

■ Boost1.58.0を導入する

公式サイトにも記載がありますが、kineticの中にあるrospackファイルがBoost1.58.0を利用して作られているため、このrospackのためだけにBoost1.58.0を準備してあげる必要があります。
すでにインストールされているBoostは別のファイルが利用するため、隔離された特別な場所にBoost1.58.0を入れておきます。当例ではrospackの中にboostディレクトリを作成し、その中に格納しています。その上で、rospackがその場所のBoostを参照しに行くようにファイルを数箇所書き換えます。

$ cd ~/ros_catkin_ws/src/rospack
ダウンロード
$ wget http://sourceforge.net/projects/boost/files/boost/1.58.0/boost_1_58_0.tar.gz
解凍
$ tar -zxvf boost_1_58_0.tar.gz
$ rm boost_1_58_0.tar.gz

実行ファイルの作成
$ cd ~/ros_catkin_ws/src/rospack/boost_1_58_0
$ sudo sh bootstrap.sh

$ mkdir ~/ros_catkin_ws/src/rospack/boost
$ sudo ./b2 install -j2 --prefix=/home/pi/ros_catkin_ws/src/rospack/boost
ls

■rosBoost関連のファイルの修正


$ sudo nano /home/pi/ros_catkin_ws/src/rospack/include/rospack/rospack.h
として、ファイルの中身から
#include <boost/tr1/unordered_set.hpp>
#include <boost/tr1/unordered_map.hpp>
をそれぞれ
#include </home/pi/ros_catkin_ws/src/rospack/boost/include/boost/tr1/unordered_set.hpp>
#include </home/pi/ros_catkin_ws/src/rospack/boost/include/boost/tr1/unordered_map.hpp>
に書き換える。


$ sudo nano /home/pi/ros_catkin_ws/src/rospack/src/utils.cpp
として
#include <boost/tr1/unordered_set.hpp>

#include </home/pi/ros_catkin_ws/src/rospack/boost/include/boost/tr1/unordered_set.hpp>



$ sudo nano /home/pi/ros_catkin_ws/src/rospack/boost/include/boost/tr1/unordered_set.hpp
を開いて、3箇所書き換える。
# include <boost/tr1/detail/config.hpp> を
# include </home/pi/ros_catkin_ws/src/rospack/boost/include/boost/tr1/detail/config.hpp> に。
また
# include <boost/tr1/detail/config_all.hpp> を
# include </home/pi/ros_catkin_ws/src/rospack/boost/include/boost/tr1/detail/config_all.hpp> に。
また
#include <boost/unordered_set.hpp>を
#include </home/pi/ros_catkin_ws/src/rospack/boost/include/boost/unordered_set.hpp> に書き換える。


<p>
$ sudo nano /home/pi/ros_catkin_ws/src/rospack/boost/include/boost/tr1/unordered_map.hpp
# include <boost/tr1/detail/config.hpp> を
# include </home/pi/ros_catkin_ws/src/rospack/boost/include/boost/tr1/detail/config.hpp> に。
また
# include <boost/tr1/detail/config_all.hpp> を
# include </home/pi/ros_catkin_ws/src/rospack/boost/include/boost/tr1/detail/config_all.hpp> に。
また
#include <boost/unordered_map.hpp> を
#include </home/pi/ros_catkin_ws/src/rospack/boost/include/boost/unordered_map.hpp> に
書き換える。
</p>

■ スワップ領域を増やす
CONF_SWAPSIZE=1024
CONF_SWAPFILE=/mnt/sda1/swap.file
(ここで再起動したほうがよいかどうかわからないけどそのまま進みます)

■ いよいよワークスペースのビルド
$ cd ~/ros_catkin_ws
$ sudo ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release --install-space /opt/ros/kinetic -j2
(苦労した身としてはこれがすんなり行くとかなり気持ちよい。)

■ ソースの追加とバッシュへの登録
$ source /opt/ros/kinetic/setup.bash
$ echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc

■ 4.ソースのメンテ
$ sudo apt-get install python-rosdep python-rosinstall-generator python-wstool python-rosinstall build-essential
$ rosdep update

$ cd ~/ros_catkin_ws
$ rosinstall_generator ros_comm ros_control joystick_drivers --rosdistro kinetic --deps --wet-only --tar > kinetic-custom_ros.rosinstall

$ wstool merge -t src kinetic-custom_ros.rosinstall
$ wstool update -t src

$ rosdep install --from-paths src --ignore-src --rosdistro kinetic -y -r --os=debian:jessie
$ sudo ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release --install-space /opt/ros/kinetic
スポンサーサイト



RALF_01 : まずラズパイ4にROS-melodicを入れる

あけましておめでとうございます。


Raspberrypi4用OSのRasbianはBusterというバージョンが使えます。
ROSも新しいMelodicを入れたいところですが、ROS入りのイメージはまだ配布されていないようで、自分でビルドする必要があります。
ビルドガイドが紹介されていますので、それに沿って導入してみます。
https://www.instructables.com/id/ROS-Melodic-on-Raspberry-Pi-4-RPLIDAR/

また環境構築からかぁ〜って思っちゃいますが、今回はクリーンインストールで再現性があるようにしておこうと思います。


▼ まず環境確認

基盤:ラズパイ4
OS:debian_version 7.8
カーネル:Linux raspberry 4.19.75

ちなみにRasbian のバージョン確認方法とカーネルのバージョン確認方法
$ cat /etc/debian_version
>7.8
$ uname -a
>Linux raspberry 4.19.75-v71+ #ほにゃらら


▼ いつもの準備

$sudo apt-get update
$sudo apt-get upgrade


▼ ROSを入れる(melodic)
そのままではまだインストールできないので下記を参考にビルドする。下記URLのステップ3までをやる。
https://www.instructables.com/id/ROS-Melodic-on-Raspberry-Pi-4-RPLIDAR/
http://wiki.ros.org/melodic/Installation/Debian を参考にしてもうまくいかない。)

$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
$ sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
$ sudo apt-get update
$ sudo apt-get install -y python-rosdep python-rosinstall-generator python-wstool python-rosinstall build-essential cmake
$ sudo rosdep init
$ rosdep update

ros_catkin_ws の 作成:
$ mkdir ~/ros_catkin_ws
$ cd ~/ros_catkin_ws

ROS Desktop の Install:
$ rosinstall_generator desktop --rosdistro melodic --deps --wet-only --tar > melodic-desktop-wet.rosinstall
$ wstool init -j8 src melodic-desktop-wet.rosinstall

(上記のインストールが途中で止まったら右記で再開 $ wstool update -j4 -t src)

依存関係の細かな修正:
$ mkdir -p ~/ros_catkin_ws/external_src
$ cd ~/ros_catkin_ws/external_src

$ wget http://sourceforge.net/projects/assimp/files/assimp-3.1/assimp-3.1.1_no_test_models.zip/download -O assimp-3.1.1_no_test_models.zip
$ unzip assimp-3.1.1_no_test_models.zip
$ cd assimp-3.1.1
$ cmake .
$ make
$ sudo make install

OGRE for rvizのインストール:
$ sudo apt-get install libogre-1.9-dev

※元のサイトのこのあたりで出てくる「Finally we'll need to fix the issues with libboost….」の修正項目(boost::posix_time::milliseconds関連の修正)は、元のファイルに修正が入ったようで今はは必要なさそうです。

次に以下を実施。(ここは時間がかかります。)
$ cd ~/ros_catkin_ws
$ rosdep install --from-paths src --ignore-src --rosdistro melodic -y

Build と Install:
$ sudo ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release --install-space /opt/ros/melodic -j2
(ここはもっと時間がかかる。1時間ぐらい?)

$ echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc

一旦再起動。
$ sudo reboot

roscoreを起動。(上記のrebootなしで動かそうとしたら動きませんでした。)
$ roscore

ちなみにturtlesimもテスト。
$ rosrun turtlesim turtlesim_node
$ rosrun turtlesim turtle_teleop_key


よし動いた。

th_IMG_6858.jpg



こちらをベースに、自分用にカスタマイズしたRALFシステムを乗せていきます。

テーマ : 自然科学
ジャンル : 学問・文化・芸術

M5stickV で物体認識

th_IMG_2770.jpg


K210というAIカメラを搭載したM5stickVを購入していましたが、やっと動かしました。
物体認識しているものを声で教えてくれる「ブラウニー」が無事に動いています。



参考にしたのは下記。
・スイッチサイエンスの説明
  https://www.switch-science.com/catalog/5700/
・はじめてのM5stickVレビュー——購入してから転送までのセットアップ
  https://raspida.com/m5stickv-review
・macOSでM5StickVをはじめる
  https://qiita.com/mayfair/items/d1a4ad360670c61ba0fa
・ブラウニーのGitHub
  https://github.com/ksasao/brownie/blob/master/README.ja.md
・Mac miniでM5StickVのファームウェアアップデートしたらハマった件
  https://www.hivoki.com/m5stickv-firmware/



M5stickVを使うには、いくつかのソフトを使います。またTIPSも少しあります。

□ kflash_gui
  →ファームウェアをM5stickVに書き込む際に必要。
   TIPSとして新しいバージョンのkflash_gui 1.5ではアイコンから起動しないが、
   ターミナルからopen (ファイルパス)とすれば無事起動する。
   M5stickVが認識されない場合は電力不足の可能性があるそうで、
   その場合は電力付きのUSBハブを使うとうまくいくそうです。

□ MaixPy IDE
  →プログラムを書くときに使用する。

□ uPyLoader
→プログラムを転送する際に使用する。
  TIPSとして、シリアル接続の際にはCONNECTボタンを押す際に、
  あらかじめM5側のボタンA(LCDと同じ面にある大きなボタン)を押しっぱなしにしておく。
  (スクリプトの自動起動を避けるため)

□ SDカードは相性がある。
  スプレッドシートを参考に、
  Transcendの64GBのものをMacのディスクユーティリティにてFATフォーマットして使用したところうまくいきました。
  (フォーマットせずに購入したままで試したところ失敗しました。)



あと、ボタンがよくわからなくなる。。。。

5bc5874e-8e16-4a93-8a68-07aa33f82cf5.jpg

ディスプレイの横がボタンA、USBに近いボタンが電源ボタン。反対側がボタンB
ブラウニー入れると電源が切れなくなる謎。

cd5f5730-7990-4567-bf57-4d7e4f1e9da0.jpg



ブラウニーを入れてしまうと、電源を切ろうとしても再起動されてしまいます。
boot.pyを書き直せばできそうですが、リファレンスがわからず。
カードを抜けば電源をオフできるが。。。



外部と簡単に接続した場合には、4ピンでているコネクタが使えるようです。
https://hrkz.tokyo/m5stickv-grove/
GPIOで3.3Vの信号線が2つ出ているとのこと。
まずはHIGH/LOWで簡易的な出口に。
コネクタはGroveシステムというものらしく、PH系にも見えますが独自規格のようでなのでケーブルが届くまで作業お預け。

こちらも参考になりそう
https://www.google.co.jp/search?num=50&q=http%3A%2F%2Fshikarunochi.matrix.jp%2F%3Fp%3D3497%0A">http://shikarunochi.matrix.jp/?p=3497</a>">http://shikarunochi.matrix.jp/?p=3497


いま試しているラズパイ4も物体認識スピードがかなり上がっているようです。
けどautoの予選程度であれば、このAIカメラを使っちゃった方が早いような気がします。(OpenCVも捨てがたいですが)
次はM5stick用に学習データと学習モデルを作ってみます。

テーマ : 自然科学
ジャンル : 学問・文化・芸術

カラーボールのトラッキング


カラーボールのトラッキング。大昔からある技術だし、ライブラリが揃っている今であればやればいつでもできるだろう…
と思いつつもなかなか手がまわらないまま平成が終了してしまいました。
ので、理解のためにまずは原始的なところからはじめます。
シンプルなものであればラズパイでも十分なスピードが確保でき、すぐ遊べそうです。



プログラムの方針は、

1)カメラで画像を捉える。
2)その画像から赤色の濃い部分だけ抽出する。(つまりマスク画像を作る。)
3)いくつかの赤色のカタマリに分ける。
4)中でも、一番面積の大きいカタマリを選ぶ。
5)その中心座標を求める。

とします。



いろいろ調べつつなるべくコンパクトにpythonを書いてみました。
便利なライブラリを製作してくださった方々や記事を残してくださった皆様には頭が上がりません!
(参考記事:
 https://algorithm.joho.info/programming/python/opencv-color-tracking-py/
 http://opencv.jp/opencv-2svn/py/core_operations_on_arrays.html 等)

import numpy as np
import cv2

cap = cv2.VideoCapture(0) #カメラを定義

def red_range(img): #赤色の領域をマスクする関数
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) #BGRをHSV色空間に変換

#赤色の領域を閾値でフィルタリング
#OpenCVのHSV色空間では赤は0~30付近と150~180付近に分かれるが、
#181~255は0からの循環なので180を中心に範囲を取れば赤の閾値を一回で指定できる。たぶん。
    hsv_min = np.array([170,170,60]) #色相(Hue)、彩度(Saturation)、明度(Value)
    hsv_max = np.array([190,255,255])
    mask = cv2.inRange(hsv, hsv_min, hsv_max) #hsvの各ドットについてhsv_minからhsv_maxの範囲内ならtrue

    return mask

while( cap.isOpened() ): #カメラが使える限りループ

    ret, frame = cap.read() #カメラの情報を取得。frameに640x480x3の配列データが入る。
    frame_np = red_range(np.array(frame)) #frameデータをnp配列に変換。

#領域のカタマリである「ブロブ」を識別し、データを格納する。すごくありがたい機能。
    nLabels, labelimages, data, center = cv2.connectedComponentsWithStats(frame_np)

    blob_count = nLabels - 1 #ブロブの数。画面領域全体を1つのブロブとしてカウントするので、-1する。

    if blob_count >= 1: #ブロブが1つ以上存在すれば、画面全体を示すブロブデータを削除。
        data = np.delete(data, 0, 0)
        center = np.delete(center, 0, 0)

#認識したブロブの中で最大領域を持つもののインデックスを取得
    tbi = np.argmax(data[:, 4]) #target_blob_index

#最大ブロブの中心に青の円マークを直径10pix、太さ3pixで描く
    cv2.circle(frame,(int(center[tbi][0]),int(center[tbi][1])),10,(255,0,0),3)

#画像を表示する
    cv2.imshow('RaspiCam_Live',frame)

#キーが押されたら終了する
    if cv2.waitKey(1) != -1:
        break

#終了処理。カメラを解放し、表示ウィンドウを破棄。
cap.release()
cv2.destroyAllWindows()






動作しているところの様子。ポンコツデジカメなので画面が暗いですが、画面の中で一番大きい赤色の塊の中心を捉え緑の円でマーキングしているのが確認できるかと思います。


▼ cv2.connectedComponentsWithStats() について

nLabels, labelImages, data, center = cv2.connectedComponentsWithStats(image_src)
[0] nLabelsは、ブロブのラベル数(ただし、背景のラベル番号0も含むためオブジェクトの数は nLabels - 1 となる)
[1] labelImagesは、ラベル番号が入った配列データ(座標 (x, y) のラベル番号は、labelImages[x, y] で参照できる)
[2] dataは、オブジェク詳細の配列データ(x, y, w, h, size = data[ラベル番号] で参照できる)
※x, y, w, h は、オブジェクトの外接矩形の左上のx座標、y座標、高さ、幅 ※size は、面積(pixcel)
[3] centerは、オブジェクの中心点(オブジェクトの重心座標 (x, y) を浮動小数点数で出力。描画に使うときはintにする)
※ image_srcは、二値画像の入力配列


▼おまけ
もしこの記事を読んでいてロボットは作れるが画像処理はさっぱりわからない!という人がいたら、
「画像は配列として扱える」
という概念だけ合点がいけばあとはなんでもできるようになると思います。

たとえば640x480の画像は、それぞれのドットについて赤緑青の3原色の強さのデータになりますが、
それは「横ドット数640]x[縦ドット数480]x[赤0〜255、緑0〜255、青0〜255]といった感じで表されます。
画像としてではなく、そのデータを配列として扱うことで、いろんな画像操作ができるようになるのです。

赤のデータが閾値以上のところで切れば赤っぽい画素をマスクできます。
上下左右に隣接するドット同士の関係性を重視するアルゴリズムを用いてフィルタリングすることで画像の特徴としてデータ化することもできます。
難しいアルゴリズムについてもすでにかなりの量のライブラリが準備されていますので、
基本原理さえわかれば細かい計算式まで書かずともどんどん実装が可能になっています。

テーマ : 自然科学
ジャンル : 学問・文化・芸術

分類器② YOLOv3


分類器としてYOLOv3も試してみました。環境はgoogle colab(GPUあり)です。
(Twitterでとり天さんとにゅくすさんにアドバイスいただきました。ありがとうございました!)



↓のQiitaを参考にコンパクトに。ただそのままだとGPUを使用しない状態なので少しだけアレンジ必要。
https://eng-memo.info/blog/deep_learning_yolo_detect/


from IPython.display import Image,display_jpeg
!git clone https://github.com/pjreddie/darknet

#ここで一旦Darknetの中のMakefileを開き、1行目のGPU=0をGPU=1に書き換える。
#自分はcat Makefileで内容表示させてからローカルのエディタ上で書き換えてcolabにアップロードしました。
#linuxコマンドでファイル内容を書き換えるのに慣れてないので・・・

%%bash #中身を書き換えたMakefileでコンパイルする。
cd darknet
make
wget https://pjreddie.com/media/files/yolov3.weights

%%bash #画像の読み込み
cd ./darknet/
./darknet detect cfg/yolov3.cfg yolov3.weights data/horses.jpg

#画像の表示
display_jpeg(Image('darknet/predictions.jpg'))



%%bashで複数行のシェルをかけるんですね。
google colabでは!cdで行ける範囲が限られているので、cdを伴うシェル作業の時に%%bashがすごく助かります。

colab環境での推論時間はGPUなしだと22秒ぐらい、GPUありだと0.7秒ぐらいでした。ものによっては0.2秒とかのスピードも。
SS 111



SS 113
ずうとるびは4名と認識。

SS 112
ぱくたそのガールもしっかり認識。スマホも認識。

th_yorov3.jpg

YOLOv3 からはロボットは何者にも分類されない。おもちゃとしても認識されない。テディとお人形タイプはOK。

テーマ : 自然科学
ジャンル : 学問・文化・芸術

プロフィール

二名川(ニナガワ)

Author:二名川(ニナガワ)
ホビーロボットをレトロゲームが発展したものと捉えて楽しく遊び倒します。
子供が夢を見ている時間帯に稼働します。

電子出版
「コンソロイド ガイドブック」
46107_CONSOLOID_GUID_FACE_200.jpg





■作成中の機体
汎用ヒト型決戦遊具 ~RX計画~
RX-7.5 ゼロタンク
RRf-0.6 ゼニィ
RXM-7.9 ゼムネス
RX-7.5R 量産型ゼロタンク
RX-7.5Fp ファミタンク仮設1号
RX-7.7 ゼロキャノン
RX-7.8 ゼログレイ
SMS-0.1 ゼロライナー
以下続く

RX整備計画(仮)

ブログ内検索
最近の記事
最近のコメント
カテゴリ
月別アーカイブ
リンク