Translate

2020年2月27日木曜日

Raspberry Pi 4B(Raspbean buster lite) へ pyrealsense2 をインストールする

DonkeycarでIntel RealSense T265 トラッキングカメラを使おうと思ったのだけど、ドキュメントにUSB3.0推奨とある記述をみつけだ。

どうもUSB2.0でも動作するのだけど、イメージストリームを使う場合などは3.0のほうが良いのだろう。白黒の800X848イメージ2個を200MHzで送信するくらい2.0でもできそうだとは思うのだけど..

で Donkeycar のベースコンピュータは Raspberry Pi 3B+ を使うのが一般的なのだけど、librealsenseのGitHub Issueに4Bサポートしましたとの記述も発見した。

ただ..4BはRaspbean Liteイメージをstreachではなくbusterを使うように書かれている。ということで、busterでlibrealsenseとpython3ベースのpyrealsense2(librealsenseのpythonラッパ、Donkeycar上のT265用パーツクラスが使用している)をインストールしてみた。

以下、その手順(参照の際はAT YOUR OWN RISKでお願いします)。



  • 最新版のRaspbean Lite buster をSDカードへ書き込む
  • SDカードに対してSSH有効・WiFiを設定し、Raspberry Pi4Bへ刺して起動
  • sudo vi /etc/dphys-swapfile を実行しCONF_SWAPSIZE=2048と書き換え保存
  • sudo /etc/init.d/dphys-swapfile restart swapon -s
  • sudo raspi-config を実行
  • "7.Advanced Options" > "A7 GL Driver" > "Y" > "G2 GL (Fake KMS)" を選択
  • "7.Advanced Options" > "A1 Expand Filesystem"
  • 終了時rebootを選択し、リブート実行
  • sudo apt update && sudo apt upgrade -y
  • sudo apt install -y libdrm-amdgpu1 libdrm-dev libdrm-exynos1 libdrm-freedreno1 libdrm-nouveau2 libdrm-omap1 libdrm-radeon1 libdrm-tegra0 libdrm2 libglu1-mesa libglu1-mesa-dev glusterfs-common libglu1-mesa libglu1-mesa-dev libglui-dev libglui2c2 mesa-utils mesa-utils-extra xorg-dev libgtk-3-dev libusb-1.0-0-dev cmake libprotobuf-dev libtbb-dev build-essential i2c-tools avahi-utils joystick libopenjp2-7-dev libtiff5-dev gfortran libatlas-base-dev libopenblas-dev libhdf5-serial-dev git ntp libilmbase-dev libopenexr-dev libgstreamer1.0-dev libjasper-dev libwebp-dev libatlas-base-dev libavcodec-dev libavformat-dev libswscale-dev libqtgui4 libqt4-test
  • (python3 を使う場合) sudo apt install -y python3 python3-dev python3-opencv python3-pip python3-protobuf python3-opengl python3-virtualenv python3-numpy python3-picamera python3-pandas python3-rpi.gpio
  • sudo -H pip3 install pyopengl
  • sudo -H pip3 install pyopengl_accelerate
  • cd ~/ && mkdir -p projects && cd projects
  • git clone https://github.com/IntelRealSense/librealsense.git
  • cd librealsense
  • sudo cp config/99-realsense-libusb.rules /etc/udev/rules.d/
  • sudo udevadm control --reload-rules && sudo udevadm trigger
  • sudo reboot
  • vi ~/.bashrc を実行し以下の2行を末尾に追加、保存する
  • export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
  • export PYTHONPATH=$PYTHONPATH:/usr/local/lib
  • source ~/.bashrc
  • cd ~/projects/librealsense
  • mkdir build && cd build
  • (python3を使う場合) cmake .. -DBUILD_EXAMPLES=bool:true -DCMAKE_BUILD_TYPE=Release -DFORCE_LIBUVC=bool:true -DBUILD_PYTHON_BINDINGS=bool:true -DPYTHON_EXECUTABLE=$(which python3)
  • make -j4
  • sudo make install
  • sudo ldconfig


librealsense2 の Radspberry Pi 3へのインストールドキュメントをそのまま実行するとインストールできない。(執筆時点で)以下の点に注意が必要である。

  • busterパッケージリポジトリにはデバッガオプション付きライブラリ(末尾-dbg)がない
  • udevadm triggersudo をつけて実行(リブートすれば大丈夫?)
  • cmake、TBB、protobuf、OpenCV はbusterパッケージリポジトリのものを使っても動作する
  • make は時間がかかるので一度にpythonラッパpyrealsense2のインストールまで一気に行う

あと私の場合は make -j4 でも大丈夫だった。落ちた場合は、make cleanしてやりなおしになる。3B+よりは早いが時間がむちゃくちゃかかる



次にT265の動作確認をするのだけど、realsense-viewerが使えない(liteを使ってるのでそもそもXサーバが別途必要になる、あればDISPLAY環境変数を設定すれば動くはず)。なので、pythonのサンプルコード t265_example.py で行う。


  • lsusb ※接続前の状態を確認(接続後との比較用)
  • dmesg |grep -i usb ※接続前の状態を確認(接続後との比較用)
  • Raspberry Pi 4B の青い USB3.0 コネクタにT265を接続し、電源を接続して起動
  • lsusb
※私の環境の場合、接続後以下のメッセージが追加
Bus 001 Device 003: ID 03e7:21XX Intel Myriad VPU [Movidius Neural Compute Stick]
  • dmesg |grep -i usb
※私の環境の場合、接続後以下のメッセージが追加
[  133.058275] usb 1-1.2: new high-speed USB device number 3 using xhci_hcd
[  133.189229] usb 1-1.2: New USB device found, idVendor=03e7, idProduct=21XXX, bcdDevice= 0.01
[  133.189245] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[  133.189258] usb 1-1.2: Product: Movidius MA2X5X
[  133.189271] usb 1-1.2: Manufacturer: Movidius Ltd.
[  133.189283] usb 1-1.2: SerialNumber: 03e72XXX
  • cd ~/projects/librealsense/wrapper/python/example
  • python3 t265_example.py を実行しエラーがないことを確認


上記手順では/usr/bin/python3を使用している。Donkeycar用python3のvirtualenv環境は上記手順の後に作成すれば、再度env環境上でpyrealsense2をインストールしなくても使用可能になる。donkeycar及び関連パッケージとTensorFlowはenv環境下でインストールされるので、deactivateすればインストール前の状態の環境に戻ることができる。


  • cd ~/
  • python3 -m virtualenv -p python3 env --system-site-packages
  • echo "source ~/env/bin/activate" >> ~/.bashrc
  • source ~/.bashrc
  • cd ~/projects
  • git clone https://github.com/autorope/donkeycar
  • cd donkeycar
  • git checkout master
  • git pull
  • pip install -e .[pi]
  • pip install tensorflow==1.14.0
  • sudo shutdown -h now

この記事執筆時点ではまだPyPIに登録されていなかった。ので上記手順ではlibrealsenseからソースコードビルドしている。
PyPI登録されているかもしれないので pip3 search pyrealsense2 して確認のこと。



ちなみに4BをUSBハブ経由で動かすと電力不足のメッセージが頻出した。PC直付けにしたらエラーが無くなったので、4Bって結構電源にシビアなのかもしれない..

..これまでRaspberry Pi3B+環境でつかっていたモバイルバッテリが、4B&T265の電力消費に対応できるか..だけど、これは実際に繋いで試してみるしか無いか..


2020年2月17日月曜日

Jetson Nano 上で RealSense T265 用 Donkeycar パーツを試す

Donekycar (v3.1.1マスタブランチ)コードには
RealSense T265用パーツクラス
donkeycar.parts.realsense2.pyRS_T265という名前のクラス)
がすでに用意されている。

realsense2.py は、pythonパッケージ pyrealsense2 を先に導入しておかなくてはならない。

通常のUbuntuなら pip install pyrealsense2 でインストールするのだが、Jetson Nano用のJetpack (v43)アーキテクチャ用whlモジュールがPyPIに登録されていないので、シェアードライブラリ含めてソースコードビルドを選択せざるを得ない。

Donkeycar環境を構築済みのJetson Nanoへ

GitHub: IntelRealSense/librealsense
https://github.com/IntelRealSense/librealsense

上記のリポジトリからソースコードビルドした。
#ビルド方法の概要は前記事のps以下を参照のこと

python -c "import pyrealsense2" を実行してエラーが出なければ、python ラッパパッケージ pyrealsense2 のインストールが成功しているかがわかる。

また、librealsense/wrapper/python/examplesにある t265_example.py を実行(JetsonにUSBケーブル経由でT265をつないで起動し、python t265_example.pyを実行)することで、実際に値が取れているかどうか疎通確認テストができる。

以下のコードは、Veichleフレームワークを使ってRS_T265パーツを動かすサンプルである。

    import donkeycar as dk
    V = dk.vehicle.Vehicle()

    from donkeycar.parts.realsense2 import RS_T265
    rs = RS_T265(image_output=False)
    V.add(rs, outputs=['pos', 'vel', 'acc', 'image_array'], threaded=False)
    class PrintIMU:
        def run(self, pos, vel, acc):
            print('pos:({:.5g}, {:.5g}, {:.5g}) vel:({:.5g}, {:.5g}, {:.5g}) acc:({:.5g}, {:.5g}, {:.5g})'.format(
                pos.x, pos.y, pos.z, vel.x, vel.y, vel.z, acc.x, acc.y, acc.z))
    V.add(PrintIMU(), inputs=['pos', 'vel', 'acc'])

    V.start(rate_hz=20, max_loop_count=20 * 60)


RS_T265run すると6軸IMUデータ+位置座標(位置座標(X, Y, Z)、速度(X, Y, Z)、加速度(X, Y, Z))とイメージが取得できる。

ただし、RS_T265クラスのコンストラクタ引数に何も指定しない場合(デフォルトの場合)は、イメージ配列が出力されない(Noneで出力される)。

T265カメラの画像のイメージ配列を取得したい場合は、RS_T265(image_output=True)と指定するとnd.array形式の配列として出力される。

ただし、2つあるカメラの片方(多分..左側かな..)のみでかつnd.array形式のshape(800, 848)となる(白黒画像なので2次元配列)。

Donkeycar のカメラの代替として使用する場合は、myconfig.pyIMAGE_HIMAGE_WIMAGE_DEPTHを書き換えるか、イメージ配列を加工して(120, 160, 3)reshapeするパーツクラスを作成すれば良い。


なお pyrealsense2 パッケージを直接使うと、四元数(qw, qx, qy, qz)が取得できる。
詳細は librealsense/wrapper/python/examples/t265_rpy.py を参照のこと。


RS_T265クラスのコンストラクタのデフォルト引数がイメージを使用しない仕様から、おそらくカメラは既存のデバイスを使って、IMU(MPU6050)がわりにT265を使い、機械学習モデル'imu'で動かすことを想定して作成されたものと推測できる。

それならMPU6050のほうが安上がりだ。位置情報もSLAMを使うにはDonkeycarの機械学習モデル自体の入力層をいじらなくてはならないし..


..やはりROSで使うのが、一般的なのかな..
シェアードライブラリのみ(Pythonラッパなし)や
ROS上で動作する T265モジュール(melodic)も
apt で入れられるし..

2020年2月12日水曜日

Jetson Nano 上で Realsense T265 を動かす


Intel Realsense トラッキングカメラ T265 をJetson Nanoにつないで使いたい。
Donkeycarで使用するには、Pythonライブラリをインストールする前に、シェアードライブラリをインストールシなくてはならない。なのでとりあえずシェアードライブラリとX上で動作する realsense-viewer を動してみた。



1. Jetson Nano のセットアップ


Getting Started With Jetson Nano Development KitをもとにJetpackをセットアップ(詳細略)。


2. librealsense 及びビューアなどのインストール


Jetson Nanoを起動し、ターミナルを開いたら、以下のコマンドを実行する。

sudo apt update && sudo apt upgrade -y
sudo apt-key adv --keyserver keys.gnupg.net --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE || sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE
sudo add-apt-repository "deb http://realsense-hw-public.s3.amazonaws.com/Debian/apt-repo bionic main" -u
sudo apt install -y librealsense2-dev librealsense2-utils  librealsense2-dbg

上記の手順でうまく行かない場合は、情報が更新されているかもしれません。

[GitHub] libsense Linux Distribusionに最新情報が掲載されるので、こちらを参照してください

3. ビューアの実行


  1. Jetson Nanoをシャットダウンする
  2. USBケーブルでRealsense T265 を接続する
  3. Jetson Nanoを起動する
  4. Xがあがったら、realsense-viewer を実行する


左やや上にある赤いトグルボタンを押し緑色にすると、画像が表示される
右上の2Dリンクを押すと、左右カメラ画像、位置、速度、加速度情報が表示される

 



右上の3Dリンクを押すと、動かしたカメラの軌跡を緑線で表示される



  • Ctrl+C で終了



ps 2020/02/12 追記

..とまあ、ここまではよかったのだけど..

Jetson Nano でPython ライブラリ pyrealsense2 を使用する場合は、pip install pyrealsense2 ではインストールできない。

このため、librealsenseをソースコードからコンパイルしていかないと駄目だ。

ということで

  1. cd ~/
  2. mkdir projects
  3. git clone https://github.com/IntelRealSense/librealsense.git
  4. cd libreamsense
  5. mkdir build
  6. cd build
  7. cmake ../ -DPYTHON_EXECUTABLE=~/env/bin/python -DBUILD_PYTHON_BINDINGS:bool=true
  8. make -j4
  9. sudo make install
  10. vi ~/.bashrc を実行して export PYTHONPATH=$PYTHONPATH:/usr/local/lib を最終行に追加
  11. source ~/.bashrc

を実行しpython 上で import pyrealsense2 がエラーなく動けばOKである。
注意:PYTHON実行バイナリのパスは環境に合わせて変更すること

Donkeycar をJetson Nanoへインストール中 pip install -e .[nano] したら、AttributeErrorが出た件

Donkeycar の公式ドキュメント通りJetson Nano上へDonkeycarをインストールしていたら、python donkeycar パッケージの pip install 中に以下のような Attribute Errorが発生した。


(env) hogehoge@fugafuga: ~/projects/donkeycar$ pip install -e .[nano]
Obtaining file:///home/hogehoge/projects/donkeycar
Requirement already satisfied: numpy in /usr/lib/python3/dist-packages (from donkeycar==3.1.1) (1.13.3)
Requirement already satisfied: pillow in /usr/lib/python3/dist-packages (from donkeycar==3.1.1) (5.1.0)
Collecting docopt
  Using cached docopt-0.6.2.tar.gz (25 kB)
Collecting tornado
  Using cached tornado-6.0.3.tar.gz (482 kB)
Requirement already satisfied: requests in /usr/lib/python3/dist-packages (from donkeycar==3.1.1) (2.18.4)
Collecting h5py
  Using cached h5py-2.10.0.tar.gz (301 kB)
Collecting moviepy
  Using cached moviepy-1.0.1.tar.gz (373 kB)
Collecting pandas
  Using cached pandas-1.0.1.tar.gz (4.9 MB)
  Installing build dependencies ... done
Getting requirements to build wheel ... error
ERROR: Command errored out with exit status 1:
   command: /home/hogehoge/env/bin/python /home/hori/env/lib/python3.6/site-packages/pip/_vendor/pep517/_in_process.py get_requires_for_build_wheel /tmp/tmpf4z2oxsg
       cwd: /tmp/pip-install-ycyri24h/pandas
  Complete output (10 lines):
  Traceback (most recent call last):
    File "/home/hogehoge/env/lib/python3.6/site-packages/pip/_vendor/pep517/_in_process.py", line 257, in
      main()
    File "/home/hogehoge/env/lib/python3.6/site-packages/pip/_vendor/pep517/_in_process.py", line 240, in main
      json_out['return_val'] = hook(**hook_input['kwargs'])
    File "/home/hogehoge/env/lib/python3.6/site-packages/pip/_vendor/pep517/_in_process.py", line 85, in get_requires_for_build_wheel
      backend = _build_backend()
    File "/home/hogehoge/env/lib/python3.6/site-packages/pip/_vendor/pep517/_in_process.py", line 76, in _build_backend
      obj = getattr(obj, path_part)
  AttributeError: module 'setuptools.build_meta' has no attribute '__legacy__'
  ----------------------------------------
ERROR: Command errored out with exit status 1: /home/hogehoge/env/bin/python /home/hogehoge/env/lib/python3.6/site-packages/pip/_vendor/pep517/_in_process.py get_requires_for_build_wheel /tmp/tmpf4z2oxsg Check the logs for full command output.
(env) hogehoge@fugafuga: ~/projects/donkeycar$

上記のpip install は何度もやり直しているので、すでにインストールしたパッケージはダウンロードゲージが出ていない。

調べると setuptools の Issue#1694 https://github.com/pypa/setuptools/issues/1694 に情報が乗っていた。

ああ、pip install する際に、 --no-use-pep517 をつければいいんだ..

とおもい、つけて実行してみると..

cannot cytonize without Cython installed.

..今度は Cythonパッケージ無しで cythonizeしようとしているとかいうエラーが出た..

しょうがないので

pip install cython を実行し、pip install -e .[nano] --no-use-pep517 を実行したら..


うまくいった。


----
cythonってpythonモジュールをCで開発したモジュール並みの速度で実行できるやーつだったっけ..




とりあえず、先に進んでみるか..

2020年1月30日木曜日

Donkeycar の lidar 実装を読み解く

DonkeycarにLidarを積んでみたいのだが、すでに donkeycar.parts.lidar.py にパーツクラスが用意されている。

用意されているのだけど..

とりあえず Veicleaddして動いているようにみえるのだけど..これであってるんだろうか..

ということでいつもどおりといえばいつもどおりなのだけど、 Donkeycar パッケージのソースコードをたどってみた(..でもコメント記述がぜんぜんないなあ..)。


donkeycar.parts.lidar.py の最初に RPLidar というパーツクラスが書かれているので動作しそうなレーザオブジェクトが Slamtec PRLidar であることはわかる。

run_threadedメソッドの引数がdistancesanglesか..

両方floatの配列になっていて、角度がangles[0]のときの壁までの距離が distances[0]、以下順番に..になってるらしい。おそらく配列数は同じで、スキャンした際の件数でこの配列サイズもことなりそうだ..



LidarPlot もパーツクラスで、runメソッドの引数がdistancesanglesで戻り値がframe、コンストラクタの引数 resolutionで指定した3色Imageオブジェクト..

つまり、点群データをもとにImageオブジェクト化したものを出力するパーツか..


で、BreezySLAMクラスは..runメソッドの引数がdistancesanglesに加えて、map_bytesか..引数は x, y, theta..ってことは平面座標系の(x, y)とDonkeycarの向きってことか..

SLAMのアルゴリズムはDonkeycarパッケージ本体には実装がなく、https://github.com/simondlevy/BreezySLAMRMHC_SLAM クラスを使っているらしい..

つまり、Donkeycarが提供するSLAMを使うには、まず BreezySLAMがどんなRMHC(Random-Mutation Hill-Climbing)探索アルゴリズムになっているか知らないといけないわけだ。

それはおいといて、先に次のパーツクラス BreezyMap は..初期化した配列を渡しているだけ?!

最後のMapToImgeは..バイト配列をnd.array化してるだけか..たぶんカメライメージのかわりにこの出力イメージでDonkeycarを動かせってってことか..


BreezySLAM https://github.com/simondlevy/BreezySLAMREADME.md もとりあえず翻訳してみたのが以下。

他の記事同様 at your own risk で参照のこと。

----
BreezySLAM

このリポジトリ https://github.com/simondlevy/BreezySLAM には 、Python で Lidar http://en.wikipedia.org/wiki/Lidar ベースのSLAM http://en.wikipedia.org/wiki/Simultaneous_localization_and_mapping の使用を開始するために必要なすべてのものが含まれています 。(Matlab、C ++、およびJavaのサポートもありますが、この種の作業ではPythonを使用する場合が多いため、これらの言語のコードを更新しなくなりました。)BreezySLAMはLinuxおよびMac OS X上のPython 3、LinuxおよびWindows上のC++で動作します。Python C 拡張を使用することにより、PythonおよびMatlabのバージョンをC ++と同じくらい高速に実行することができます。32ビットプラットフォームで最大の効率を実現するために、コードの計算集約的な部分でストリーミングSIMD 拡張機能(Intel)および NEON(ARMv7)を使用しています。

BreezySLAMは 、同僚の Ken Lambert http://home.wlu.edu/%7Elambertk/ が開発したグラフィカルユーザーインターフェイスへの Breezy http://home.wlu.edu/%7Elambertk/#Software アプローチ に触発されました。右上の画像は、BreezySLAM ユーザ https://www.linkedin.com/pulse/slam-your-robot-drone-python-150-lidar-chris-fotache によって作成された家のフロア全体のマッピングのサンプルです。

以下のコードサンプルで示されたとおり(Lidarパラメータ、マップサイズ(ピクセル)およびマッピング領域(メートル)を引数とするコンストラクタ、現時点のスキャンをもとに更新を行う `update` メソッド、現在のロボット位置を返す `getpos` メソッド、現在のマップをバイト配列として取得する `getmap` メソッド)、基本的なAPIは非常に単純です。

from breezyslam.algorithms import RMHC_SLAM
lidar = MyLidarModel()
mapbytes = bytearray(800*800)
slam = RMHC_SLAM(lidar, 800, 35)

while True:
    scan = readLidar()
    slam.update(scan)
    x, y, theta = slam.getpos(scan)
    slam.getmap(mapbytes)

オドメトリが利用可能な場合は、update メソッドに渡すこともできます。

Python環境へのインストール


BreezySLAMのインストールでは、一般的な distutils http://docs.python.org/2/distutils/introduction.html アプローチを使用してPythonパッケージをインストールするため、ファイルをダウンロードして解凍し、BreezySLAM/python に  cd し、以下のコマンドを実行します。

sudo python3 setup.py install

簡単なデモを見るには、 BreezySLAM/examplescd して、以下のコマンドを実行します。

make pytest

実行すると、ログファイル exp2.datLidarスキャンおよび走行距離データのマップとロボットの軌跡を示すPGMファイルが生成・表示されます 。Pythonイメージングライブラリ http://www.pythonware.com/products/pil/ がインストールされている場合は、代わりにPNGファイルを生成するスクリプト log2png.py を試すことができます。

PyRoboViz https://github.com/simondlevy/PyRoboViz がインストールされている場合、次のコマンドによりライブアニメーションを表示する事ができます。

make movie

Makefile の上部にあるパラメータ USE_ODOMETRY0(ゼロ)に設定することにより、走行距離測定をオフにできます。パラメータ RANDOM_SEED をコメントアウトすることにより、パーティクルフィルタ(モンテカルロ位置推定)をオフにできます。

その他の機能については、以下のコマンドを実行して確認してください。

pydoc3 breezyslam

コンポーネントクラス MapScan、および Position 、そしてdistanceScanToMap() メソッドを使用することにより、独自の新しいアルゴリズムとパーティクルフィルタを開発できます。

北陽 URG04LX によるテスト


Linuxの場合、 BreezyLidar http://home.wlu.edu/~levys/software/breezylidar/ パッケージ、OpenCV Pythonパッケージをインストールし、examples フォルダーでサンプルコード urgslam.py を試して ください。

GetSurreal XV Lidar によるテスト


BreezySLAMには、GetSurrealの安価な XV Lidar https://www.getsurreal.com/product/xv-lidar-sensor-mount-package の Pythonサポートが含まれています。試行には xvlidar https://github.com/simondlevy/xvlidar Pythonパッケージも必要です。両方のパッケージをインストールしたら、 BreezySLAM/examples フォルダで xvslam.py サンプルを実行できます。

SLAMTEC RPLidar A1 によるテスト


BreezySLAMには、SLAMTECHの安価なRPLidar A1 http://www.slamtec.com/en/lidar/a1 の Pythonサポートも含まれています。試行には rplidar https://github.com/SkoltechRobotics/rplidar Pythonパッケージも必要です。パッケージをインストールしたら、 BreezySLAM/examples フォルダで rpslam.py サンプルを実行できます。

Matlab 用インストール


64ビットWindows、Linux、Mac OS X上のMatlabでBreezySLAMが実行できます。matlab のディレクトリには3つのすべてのオペレーティングシステム用のコンパイル済みのバイナリを含め、必要なすべてのコードが含まれています。Matlabでの試行には、このディレクトリをパスに追加し、 examples ディレクトリに移動して、以下のように実行してください。

  >> logdemo('exp2', 1)

ソースコード修正や別のOSでの実行のためのビルドを行う場合、 matlab ディレクトリへ移動し、以下のように実行してください。

  >> make

Windows用バイナリを作成する際にトラブルに遭遇した場合、 これらの手順 http://www.mathworks.com/matlabcentral/answers/95039-why-does-the-sdk-7-1-installation-fail-with-an-installation-failed-message-on-my-windows-system が役に立ちます。

C++ 用インストール


BreezySLAM/cppcd して、以下のように実行してください。

sudo make install

これにより、 libbreezyslam シェアードライブラリが /usr/local/lib ディレクトリにデプロイされます。シェアードライブラリを他の場所に保持する場合 は、 Makefile の上部にある変数 LIBDIR を変更するだけです。~/.bashrc ファイルに次の行を追加する必要がある場合もあります。

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

簡単なデモを見るには、 BreezySLAM/examplescd し、以下のように実行してください。

make cpptest

繰り返しになりますが、 /usr/local/lib を使用しない場合は、 Makefile の上部にある変数 LIBDIR を変更する必要があります。


Java用インストール


BreezySLAM/java/edu/wlu/cs/levy/breezyslam/algorithms および BreezySLAM/java/edu/wlu/cs/levy/breezyslam/components にある Makefile の変数 JDKINC にJDKインストール先を記述してくさだい。そしてそれらのディレクトリ内で make を実行してください。

簡単なデモを見るには、 BreezySLAM/examplescd し、以下のように実行してください。

make javatest


Windows用インストール時の注意


私や他の方々がWindows上でのインストールに苦労 http://stackoverflow.com/questions/2817869/error-unable-to-find-vcvarsall-bat したため、Windows上のPythonバージョンはサポートしなくなりました。もし試したい場合は、 ここ https://docs.python.org/2/extending/windows.html を参考にしてください。

Windows上のC++ライブラリを使ったビルドの際には、MinGWを使用しました。使用するC++コンパイラが何であれ、.dllファイルの場所を環境変数 PATH に追加する必要があります。

新規パーティクルフィルタの追加


BreezySLAMはCoreSLAM( tinySLAM https://openslam.org/tinyslam.html )コードベースで構築されているため、SLAMのマップ構築コンポーネントとパーティクルフィルタリング(モンテカルロ位置推定)コンポーネントを明確に分離しています。新規のパーティクルフィルターを追加するには、 breezyslam.algorithms.CoreSLAM クラスまたは  breezyslam.algorithms.SinglePositionSLAM クラスをサブクラス化し、関連メソッドを実装します。

著作権、ライセンス、質問


著作権やライセンス( Gnu LGPL https://www.gnu.org/licenses/lgpl.html ) に関する情報は、各ソースコードのヘッダに記載されています。

関係者


Suraj Bajracharya、Simon D. Levy、Matt Lubas、Alfredo Rwagaju

謝辞


この研究は、革新技術センタ(CRCF#MF14F-011-MS)からのCommonwealth Research Commercialization Fund助成金によって一部サポートされていました。このパッケージのデバッグとテストに協力してくれたOlin CollegeのMichael Searingに感謝いたします。

-----

ここでわかった重要なことは、動きそうなレータが北陽  URG04LXRPLidar A1、そしてGetSurreal XV Lidar
GetSurreal XV Lidarは実際どれが本体なのかわからないけど、まえの2つはてにはいりそうだ。

BreezySLAMのレーダ実装のちがいはどこで確定させているかをみるには breezyslam.algorithms.py を読めばいいってことらしい..

で、 breezyslam.algorithms.py のクラスと主要なメソッドの機能コメントを翻訳したのが、以下である。

----
breezyslam.algorithms パッケージ

CoreSLAM クラス

CoreSLAM クラスは、PositionMapScan、およびLaserクラスを使用する抽象クラス。

単純なCoreSLAM(tinySLAM)アルゴリズムの多様な具現実装を実行するために使用する。

  • 著者:Bruno Steux 、 Oussama El Hamzaoui
  • タイトル:CoreSLAM: Cコード200行以下のSLAMアルゴリズム
  • 書籍タイトル:11th International Conference on Control, Automation, Robotics and Vision, ICARCV 2010, Singapore, 7-10 December 2010, Proceedings
  • ページ:1975-1979
  • 出版元:IEEE
  • 年:2010
具現クラスでは、点群(パーティクルクラウド)とマップ(should_update_maptrueの場合)を更新するメソッド _updateMapAndPointcloud(scan_mm, dxy_mm, dtheta_degrees, should_update_map) の実装が必要となる。

メソッド init(self, laser, map_size_pixels, map_size_meters, map_quality=_DEFAULT_MAP_QUALITY , hole_width_mm=_DEFAULT_HOLE_WIDTH_MM)

新しいLidarおよび走行距離データでの更新に適したCoreSLAMオブジェクトを作成する。

  • laser : Lidarユニットの仕様を表すレーザーオブジェクト
  • map_size_pixels :ピクセル単位の正方形マップのサイズ
  • map_size_meters :メートル単位の正方形マップのサイズ
  • map_quality : マップへのスキャンの統合速度を0〜255の値で指定
  • hole_width_mm : 障害物(壁)の幅を決定する

メソッド update(self, scans_mm, pose_change, scan_angles_degrees=None, should_update_map=True)

スキャン情報と走行距離を更新し、具現クラス側で独自実装された _updateMapAndPointcloud メソッドを呼び出して独自変更処理を行う。
  • scan_mm : Lidarスキャン値のリスト、そのカウントはCoreSlamコンストラクタに渡されるLaserオブジェクトの属性 scan_size で指定される
  • pose_change : オドメトリから計算されたタプル (dxy_mm, dtheta_degrees, dt_seconds)
  • scan_angles_degrees : scans_mm の距離に対応する角度のオプションリスト
  • should_update_map :マップを更新するかどうか(真偽値)

メソッド getmap(self, mapbytes)

bytearray(バイト配列) mapbytes を現在のマップピクセルで埋める。bytearray 長は、CoreSLAM .__ init __() に渡される引数 map_size_pixels の2乗となる。

  • mapbytes : 現在のマップピクセル(バイト配列)

メソッド setmap(self, mapbytes)

現在のマップピクセルを引数で指定したbytearray(バイト配列)の値に設定する。bytearray長は、 CoreSLAM .__ init __() に渡される引数 map_size_pixels の2乗となる
  • mapbytes : セットするマップピクセル(バイト配列)

クラス SinglePositionSLAM(CoreSLAM)

SinglePositionSLAMは、単一のポイント(位置)を持つポイントクラウドを使用して CoreSLAM を実装する抽象クラス。 具現クラスでは、_getNewPosition(self、start_position) メソッドを提供して、開始位置からの検索に基づいて新しい位置を計算する実装を行う必要がある。

メソッド _updateMapAndPointcloud(self, dxy_mm, dtheta_degrees, should_update_map)

マップとポイントクラウド(パーティクルクラウド)を更新する。 CoreSLAM.update() によって自動的に呼び出される。

速度は、タプル (dxy_mm, dtheta_degrees, dt_seconds) 形式(引数として指定する)。

メソッド getpos(self)

現在の位置をタプル(x_mm, y_mm, theta_degrees) として返却する。

クラス RMHC_SLAM(SinglePositionSLAM)

クラス RMHC_SLAM は、ランダム突然変異ヒルクライミング(RMHC:Random-Mutation Hill-Climbing)検索を使った、(親でもある)抽象クラスSinglePositionSLAM_getNewPosition() メソッド実装を提供する。なお効率化のために、独自の内部擬似乱数ジェネレータを使用している。

メソッド init(self, laser, map_size_pixels, map_size_meters, map_quality=_DEFAULT_MAP_QUALITY, hole_width_mm=_DEFAULT_HOLE_WIDTH_MM, random_seed=None, sigma_xy_mm=_DEFAULT_SIGMA_XY_MM, sigma_theta_degrees=_DEFAULT_SIGMA_THETA_DEGREES, max_search_iter=_DEFAULT_MAX_SEARCH_ITER)

新しい Lidar および走行距離データによる更新に適した RMHCSlam オブジェクトを作成します。

  • laser : Lidarの仕様を表す Lidar オブジェクト
  • map_size_pixels :ピクセル単位の正方形マップのサイズ
  • map_size_meters :正方形マップのサイズ(メートル単位)
  • map_quality : 0〜255の値を指定して、マップへのスキャンの統合速度を決める
  • hole_width_mm :障害物(壁)の幅を決定する
  • random_seed :再現可能な結果をサポートするための引数。 指定されていない場合のデフォルトはシステム時間となる
  • sigma_xy_mm :RMHC検索の位置の (X, Y) コンポーネントの正規分布の標準偏差をミリメートル単位で指定
  • sigma_theta_degrees :RMHC検索の位置の回転成分の正規分布の標準偏差を度数で指定する
  • max_search_iter :RMHC検索の最大反復回数を指定

メソッド _getNewPosition(self, start_position)

親クラス SinglePositionSLAM が使用する _getNewPosition() メソッドの実装を提供する。 ランダム突然変異ヒルクライミング(RMHC)検索を使用して、開始位置に基づいてより適切な位置を探索する。

クラス Deterministic_SLAM(SinglePositionSLAM)

クラス SinglePositionSLAMが使用する _getNewPosition() メソッドを、検索開始位置をコピーするだけの実装で提供する具現クラス。

メソッド init(self, laser, map_size_pixels, map_size_meters, map_quality=_DEFAULT_MAP_QUALITY, hole_width_mm=_DEFAULT_HOLE_WIDTH_MM)

新しいLidarおよび走行距離データでの更新に適した Deterministic_Slamオブジェクトを作成する。

  • laser :レーザ仕様を表す Lidar オブジェクト
  • map_size_pixels :ピクセル単位の正方形マップのサイズ
  • map_size_meters :正方形マップのサイズ(メートル単位)
  • map_quality : 0〜255の値で、マップへのスキャンの統合速度を指定
  • hole_width_mm :障害物(壁)の幅を決める

メソッド _getNewPosition(self, start_position)

開始位置のコピーを返却する。
----

DonkeycarのRPLidarクラスをそのままつかえばA1M8が動きそうだな..
Amazonで調べると去年5万円弱だったのが1万円台にまで下がってる..

..ちょっと、ためしてみるか..


2020年1月22日水曜日

GPUなしProxy環境下のWindows10マシン上でAutoware/ROS Kineticを動かす手順

Windows10 の WSL で動かす場合、systemd や VOLUME マウントする UNIXドメインソケットなどの問題がありWSL内でDockerを動かすことがめんどくさい。

ので、ホストOS側でXサーバを立ち上げ、ソースコードビルドを行ってAutowareを動かしてみた。手順はそこらへんの記事があるだろうと、見てみたのだけど、GitHubからGitLabへ移動したことなどもあり、そのまま動作するものを見つけることができず、試行錯誤の結果以下の手順でようやく動作した。

【注意】以下の手順は2020年1月21日時点のもので、バージョン更新などにより動作しなくなる可能性があるため、参考にする場合は at your own risk でお願いします。

■インストール


  • https://sourceforge.net/projects/vcxsrv/ からVcXrv をダウンロードしてインストール
  • Microsoft StoreからUbuntu 16.04 LTS をダウンロードして起動
  • パスワードを設定
  • vi ~/.bashrc を実行して、以下の5行を追加
export HTTP_PROXY=http://proxy.server:8080/
export HTTPS_PROXY=http://proxy.server:8080/
export http_proxy=$HTTP_PROXY
export https_proxy=$HTTPS_PROXY
export DISPLAY=localhost:0.0
  • source ~/.bashrc
  • vi /etc/apt/apt.conf を実行して以下の2行を追加
Acquire::http::proxy "http://proxy.server:8080/";
Acquire::http::proxy "http://proxy.server:8080/";
  • sudo apt update && sudo apt upgrade -y
  • sudo apt install -y lxde
  • /mnt/c/Program\ Files/VcXsrv/vcxsrv.exe :0 -rootless -clipboard   -noprimary -wgl -xkblayout jp -xkbmodel jp106 &
  • startlxde
  • Xが起動したら、左下のツバメ(?)アイコンをクリック
  • AccessoriesのByobu Terminal を起動
  • sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
  • wget http://packages.ros.org/ros.key -O - | sudo apt-key add -
  • sudo apt update
  • sudo apt upgrade -y
  • sudo apt install -y ros-kinetic-desktop-full
  • sudo rosdep init
  • rosdep update
  • echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
  • source ~/.bashrc
  • sudo apt install -y python-rosinstall
  • sudo apt install -y qt5-default
  • sudo apt-get install -y python-catkin-pkg python-rosdep python-wstool ros-$ROS_DISTRO-catkin libmosquitto-dev gksu
  • mkdir -p autoware.ai/src
  • cd autoware.ai
  • wget -O autoware.ai.repos "https://gitlab.com/autowarefoundation/autoware.ai/autoware/raw/1.12.0/autoware.ai.repos?inline=false"
  • vcs import src < autoware.ai.repos
  • rosdep update
  • rosdep install -y --from-paths src --ignore-src --rosdistro $ROS_DISTRO
  • pip3 install -U setuptools
  • colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release

make -j2 もかかったが、最後のコマンドだけでも合計2時間半かかった(1回目の途中でXが固まって実行し直した)。

AutowareのDockerコンテナのサイズは異常にでかい。ので、3GB上限のSIMルータとかではすぐにギガが枯渇する。可能な限り光や企業LAN内でのインストールをすすめる。

AWS Greengrass を使ったあと、ROSをインストールすると、AWS Greengrass を設計した人がROS(というか分散ROSかな)を模倣していることに気づく。

DonkeycarアプリケーションがAwtowareに類似していることもわかる。Pub-Subモデルをベースにせず、1つのコンピュータ完結にするため通信をやめてViechleフレームワークという簡略化した実装に替えているのだ。Donkeycarを構成するソフトウェアスタックもAutoware/ROSに似ている。catkin関連がdonkeyコマンドだったり、rosbagがtubデータだったり、トピック名がV.memのキー名だったり..

複数の実装を学習すると、AWSやAWF、Donkeycarコミッタの思想の違いが俯瞰できて実に興味深い。

2020年1月9日木曜日

Jetson Nano へ Donkeycar アプリケーションをインストール方法のメモ(2019/01/09時点)

■必要なもの

  • Jetson Nano Developent Kit(Jetson開発ボード)+USBケーブル
  • 5V2A以上を出力するUSB ACアダプタ
  • インターネット接続可能なAterm MR05LN+USBケーブル
  • HDMIモニタ+HDMIケーブル
  • USB日本語キーボード
  • USBマウス
  • SDカード

■セットアップ手順

  • https://developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit#write にある「Jetson Nano Development Kit SD Card Image」のリンクを選択して圧縮ファイルをダウンロード
  • ダウンロードしたファイルからisoイメージファイルを展開
  • SDカードをフォーマット
  • Echer https://www.balena.io/etcher をダウンロード
  • Echerを実行し、isoイメージファイルをSDカードへ書き込み(書き込み完了すると大量のダイアログが出るが、すべて閉じる)
  • SDカードを取り出し
  • Jetson NanoにUSBキーボード(日本語)、モニタ(HDMI)、USBマウスを接続
  • Jetson Nanoのmicro-USBコネクタとACアダプタ(5V2A)をつなぐ
  • ライセンスを了承する場合、チェックボックスにチェックを入れContinueボタン押下
  • 日本語を選択し次へ
  • キーボードは日本語・日本を選択し次へ
  • ユーザ情報sudo可能アカウント情報を入力し次へ
  • 変更せず次へ
  • セットアップを実行
  • 完了したらウィザードの右上ボタンを押し、ウィザードを終了させる
  • 左上のUbuntuボタンを押し、検索フィールドに「term」といれ、最初のアイコンを選択
  • sudo fallocate -l 4G /var/swapfile
  • sudo chmod 600 /var/swapfile
  • sudo mkswap /var/swapfile
  • sudo swapon /var/swapfile
  • sudo bash -c 'echo "/var/swapfile swap swap defaults 0 0" >> /etc/fstab'
  • sudo shutdown -h now
  • ACアダプタを抜く
  • Aterm MR05LNの電源を入れる
  • Aterm MR05LNをJetson NanoのUSBコネクタに接続
  • ACアダプタをコンセントに接続
  • 起動したら先程のユーザ情報を入れログイン
  • 左上のUbuntuボタンを押し、最初のアイコンを選択
  • sudo apt update
  • sudo apt upgrade -y
  • sudo apt install build-essential python3 python3-dev python3-pip libhdf5-serial-dev hdf5-tools nano ntp -y
  • sudo apt install cmake unzip pkg-config -y
  • sudo apt install libjpeg-dev libpng-dev libtiff-dev -y
  • sudo apt install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev -y
  • sudo apt install libxvidcore-dev libx264-dev -y
  • sudo apt install libgtk-3-dev -y
  • sudo apt install libatlas-base-dev gfortran -y
  • sudo apt install python3-numpy -y
  • cd ~/
  • pip3 install virtualenv
  • python3 -m virtualenv -p python3 env --system-site-packages && echo "source env/bin/activate" >> ~/.bashrc
     && source ~/.bashrc 
  • mkdir projects/cv2
  • cd ~/projects/cv2
  • wget -O opencv.zip https://github.com/opencv/opencv/archive/4.1.0.zip
  • wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.1.0.zip
  • unzip opencv.zip
  • unzip opencv_contrib.zip
  • mv opencv-4.1.0 opencv
  • mv opencv_contrib-4.1.0 opencv_contrib
  • cd opencv
  • mkdir build
  • cd build
  • cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D INSTALL_PYTHON_EXAMPLES=ON -D INSTALL_C_EXAMPLES=OFF -D OPENCV_ENABLE_NONFREE=ON -D OPENCV_EXTRA_MODULES_PATH=~/projects/cv2/opencv_contrib/modules  -D PYTHON_EXECUTABLE=~/env/bin/python -D BUILD_EXAMPLES=ON ../
  • make -j2
  • sudo make install
  • sudo ldconfig
  • cd /usr/local/lib/python3.6/site-packages/cv2/python-3.6
  • ls cv2.cpython-36m-* (ファイル名の確認)
  • mv cv2.cpython-36m-xxx-linux-gnu.so cv2.so (xxxは環境によってかわる)
  • cd ~/env/lib/python3.6/site-packages/
  • ln -s /usr/local/lib/python3.6/site-packages/cv2/python-3.6/cv2.so cv2.so
  • cd ~/projects
  • git clone https://github.com/autorope/donkeycar
  • cd donkeycar
  • git checkout master
  • pip install -e .[nano]
  • pip install --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v42 tensorflow-gpu==1.13.1+nv19.3
  • donkey createcar --path ~/mycar
  • cp /usr/lib/python3.6/dist-packages/cv2.cpython-36m-aarch64-linux-gnu.so ~/mycar/


numpyはエラーになるので、pipではなくapt管理のパッケージをインストールする 
make -js は思っている以上に時間がかかる

2020年1月8日水曜日

Jetson Nano をWiFiでつなぐ方法を考える

年明けに、Jetson Nanoを手に入れた。

厳密には、Raspberry PiインターフェイスとしてブレイクアウトするJetson Nano 開発ボードを手に入れた。

この開発ボードにはEtherコネクタはついているがWiFiは装備されていない。

ためしに手持ちのBuffalo製WiFi/BLEドングル BSBT 4D200BK をつないでみたが、なぜかSSIDが表示されない..
#ちなみに使用しているUbuntuはJetpackをそのまま使った

厳密にはsudo nmcli device wifi list しても、SSIDを隠しているWiFiルータだけしか表示されない..

どうも調べてみると、Jetpackが正式サポートされているのは
  • Intel 8265NGW Dualband Wireless AC M.2 2230 Device
  • Edimax EW-7811Un USB Wireless Networking Adapter
だけらしい..

JetpackはUbuntuベースだから、比較的新しめなデバイスでもつながるかなと思っていたが、アテが外れてしまった..

上記後者はUSBドングルのようだが、前者はPCIeだ。
一体どこにつなげるのか..とおもっていたら、Jetson Nano本体と開発ボードの間に刺すらしい..しかもサイズがそれほどないのでPCIeでも8265NGWでないと入らないのか..

上記のいずれかを入手すればつながるが、上記以外は独自デバイスドライバをGitHubなりで探し出すか、自分で作るかしなくてはならない..

もっと手近にあるもので..とおもって手元にあるAterm MR05LN をUSBケーブル経由で有線接続したら..つながった..

USB経由でWiFiが使えるようになった。

注意:JetpackをSDカードへ書き込み、最初に起動する際にAterm MR05LNを接続するとブートしない
注意:最初にログインした際の画面ウィザードを終了させないとsudo apt updateしてもエラーになる
注意:クレードル経由(ルータモード)でEtherケーブルを使ってつないだがNGだった。どうもUSBテザリングONだけしか動作しないらしい..

もしやとおもい、HUAWEI-13EAもつないでみたが、こっちはだめだった..

Aterm MR05LNなら最近宣伝している楽天モバイルでも買えるから、この方法なら手っ取り早そうだ..

でも..IoTデバイスとしては、USBコネクタを一つ消費するし(ドングルもそうだけど)、ルータ自体は独自給電だけど、USBデバイスとしてつなぐとおそらくUSB給電になるとおもうので、電源への負担が大きい..ただでさえJetson Nanoの5V電源の動作アンペアがRaspberry Piより大きいので、正直負担だ..

それなら、Buffalo製ホテルルータ(ざっくりいうと有線Etherの口をモバイルルータ化する) WMR-433W2-BK とかでEtherコネクタを消費させたほうがマシかも知れない..さて、どうするかな..





p.s.

ちなみに楽天モバイルで購入したAterm MR05LNだが、初期設定ではAPN設定があやまっていて、自分でAPN設定し直さないとつながらなかった..

 SIMカードがへばりついている紙に「rmobile.jp」にしろって書いているのに、デフォルト設定では「rakuten.jp」になっていた..

カード審査に30分かけるくせに、疎通動作すらしてないで渡すかね、楽天モバイルグランツリー武蔵小○店は..

しかも、オプション品のクレードルおいてなかったし..




p.s. その2

その後、正常動作リストにあったIntel 8256NGW PCIeボードを入手。
つないでみたら、SSIDが全部見えるようになり、すなおにWiFi接続できてしまった..




..やっぱドキュメントを先に読むべきだな..

2019年12月10日火曜日

AWS Greengrass チュートリアル「機械学習の推論を実行する」を試したが何の反応もなかった件

AWS Greengrassのチュートリアルを試している。

チュートリアルの一つ

機械学習の推論を実行する
https://docs.aws.amazon.com/ja_jp/greengrass/latest/developerguide/ml-inference.html

は、
S3上にあるmxnetモデルファイルをロードしてAWS Greengrass Core(デバイス側)上のLambdaで実行してデバイスに装備したカメラで撮影した対象物を予測しその結果を"hello/world"というトピックに返却するというもの。

下の図のSage Maker部分は、チュートリアルでは体験できないが、S3に学習済みモデルファイルをおいてそれをCore上のLambdaが使用するとことは体験できる。



AWS Greengrass Coreは最近買ってきたRaspberry Pi 4B(3B+でも可)にインストールして、上記リンクのとおりに実行してみた...が、動かない..

AWS Greengrass Core 上のログ(エラー)は /greengrass/ggc/var/log/user/<リージョン名>/NNNNNNNNNN/.log というテキストファイルに書き出される。

のぞいてみると

[2019-12-09T07:45:30.002Z][FATAL]-lambda_runtime.py:140,Failed to import handler function "greengrassObjectClassification.function_handler" due to exception: libgfortran.so.3: cannot open shared object file: No such file or directory
[2019-12-09T07:45:30.004Z][FATAL]-lambda_runtime.py:380,Failed to initialize Lambda runtime due to exception: libgfortran.so.3: cannot open shared object file: No such file or directory


というエラーが出ていた。

どうも libgfortran.so.3 というファイルがない、findで探してみると libgfortran.so.5 はあるけど 3 はなかった。

..で、apt install でインストールしようとすると..

pi@gateway:~ $ sudo apt install libgfortran3
Reading package lists... Done
Building dependency tree
Reading state information... Done
You might want to run 'apt --fix-broken install' to correct these.
The following packages have unmet dependencies:
 python-opencv : Depends: python-numpy (>= 1:1.16.0~rc1) but it is not going to be installed
                 Depends: python-numpy-abi9
 python-picamera : Depends: python-numpy but it is not going to be installed
 python-scipy : Depends: python-numpy (>= 1:1.16.0~rc1) but it is not going to be installed
                Depends: python-numpy-abi9
E: Unmet dependencies. Try 'apt --fix-broken install' with no packages (or specify a solution).
pi@gateway:~ $

..どうもnumpyが悪さしている様子..

ここはpipでなくaptnumpyをいれてみようということで sudo apt install python-numpy を実行して動かしてみたら、今度はログに


:
[2019-12-10T01:51:58.67Z][ERROR]-[01:51:58] /work/mxnet/src/engine/engine.cc:55: MXNet start using engine: NaiveEngine
[2019-12-10T01:51:59.829Z][ERROR]-csr.py:15,ImportError
[2019-12-10T01:51:59.836Z][ERROR]-csr.py:15,:
[2019-12-10T01:51:59.843Z][ERROR]-csr.py:15,No module named _multiarray_umath
[2019-12-10T01:52:01.69Z][FATAL]-lambda_runtime.py:140,Failed to import handler function "greengrassObjectClassification.function_handler" due to exception: numpy.ufunc size changed, may indicate binary incompatibility. Expected 124 from C header, got 112 from PyObject
[2019-12-10T01:52:01.691Z][FATAL]-lambda_runtime.py:380,Failed to initialize Lambda runtime due to exception: numpy.ufunc size changed, may indicate binary incompatibility. Expected 124 from C header, got 112 from PyObject

  • _multiarray_umath がないよというERROR
  • numpy.ufunc サイズが違うよというFATAL

という2つの問題が発生..


そうか、mxnetがtensorflowを使ってるけど、まだインストールされてなかった。

あわてて sudo pip install tensorflow を実行。


:
  copying h5py/tests/test_vds/test_highlevel_vds.py -> build/lib.linux-armv7l-2.7/h5py/tests/test_vds
  running build_ext
  ('Loading library to get version:', 'libhdf5.so')
  error: libhdf5.so: cannot open shared object file: No such file or directory
  ----------------------------------------
  ERROR: Failed building wheel for h5py
  Running setup.py clean for h5py
Successfully built absl-py wrapt keras-applications termcolor gast
Failed to build h5py
Installing collected packages: funcsigs, mock, absl-py, keras-preprocessing, futures, setuptools, protobuf, grpcio, markdown, werkzeug, tensorboard, wrapt, backports.weakref, h5py, keras-applications, astor, termcolor, gast, google-pasta, tensorflow-estimator, tensorflow

今度は libhdf5.so がないよ..だと..

イライラしつつ sudo apt install libhdf5-dev を実行して、再度hello/worldをサブスクライブしても反応なし..

ログには、

:
[2019-12-10T04:58:46.477Z][FATAL]-lambda_runtime.py:140,Failed to import handler function "greengrassObjectClassification.function_handler" due to exception: numpy.ufunc size changed, may indicate binary incompatibility. Expected 124 from C header, got 112 from PyObject
[2019-12-10T04:58:46.478Z][FATAL]-lambda_runtime.py:380,Failed to initialize Lambda runtime due to exception: numpy.ufunc size changed, may indicate binary incompatibility. Expected 124 from C header, got 112 from PyObject
[2019-12-10T04:58:46.479Z][ERROR]-[04:58:46] /work/mxnet/src/engine/engine.cc:55: MXNet start using engine: NaiveEngine
[2019-12-10T04:58:48.045Z][ERROR]-csr.py:15,ImportError
[2019-12-10T04:58:48.052Z][ERROR]-csr.py:15,:
[2019-12-10T04:58:48.059Z][ERROR]-csr.py:15,No module named _multiarray_umath

..そうか _multiarray_umath の問題を解決できてなかった..

しらべると numpy を最新版にしないといけないらしい。

が、numpy は mxnet の制約上限バージョンでインストールされている..

ままよ、と sudo pip install numpy -U して最新版に更新、Coreデバイスをリブートして、hello/worldをサブスクライブしてみたら..やっと動いた...


うーむ、
AWS Greengrass Core上で動かす Lambda は
AWS上で動かすLambdaと違って
自前で環境を整えないといけない。

現時点のGreengrass CoreはPython2.7なのが厄介だ。

来年には切れる2のサポート問題から、最近のコードは基本 Python3.xで書かれている。

実行ユーザが ggc_user/ggc_group なので、
このユーザにvirtualenvを切ればおそらくPython3.xでも動かせるだろうが、デフォルトの状態ではvirtualenvなしのOSインストール状態のPythonバージョンが適用される。

Raspberry PiのTensorflowも現時点pipできるバージョンは1.14.0

おまけにエラーは、 /greengrass/ggc/var/log/user/<リージョン名>/NNNNNNNNNN/.log を覗かないとわからない..




そしてもっとも厄介なのが、この情報がいま時点では、ということ。
明日には変わっているかもしれない..

AWS Greengras Core 環境整備がとても大変だ..

本番だとCoreを複数立てるわけだろうし..

かなり厄介だな、IoT ゲートウェイって..



ps 2020/02/18追記

ROSのインストールをはじめて
最新バージョンであるmelodicですらいまだpython2.7を使っていることに気づいてから..
ずっともやもやしてたけど..

やっぱりAWS Greengrass は ROS のソースコードをパクっているんだろうなあ..

いや、ROSのライセンスはBSDだったはずなので、駄目というわけではないのだけど..

ROS モジュールをAWSコンソールからインストールできるからいいのだけどね..

Raspberry Pi 4B(Raspbean buster lite) へ pyrealsense2 をインストールする

DonkeycarでIntel RealSense T265 トラッキングカメラを使おうと思ったのだけど、ドキュメントにUSB3.0推奨とある記述をみつけだ。 どうもUSB2.0でも動作するのだけど、イメージストリームを使う場合などは3.0のほうが良いのだろう。白黒の800...