粗大メモ置き場

個人用,たまーに来訪者を意識する雑記メモ

Windows Python 環境おさらい 2017年9月編

メモ記事のメモというやつです。ポインタへのポインタ的な。
WindowsUbuntuの環境がごっちゃになってきたので。

tf35環境とAnacondaの用法等

現在はanacondaでtf35と名付けた仮想環境を使ってパッケージ管理しています。

activate tf35

で起動。deactivateで環境を脱出。

基本的なパッケージのインストールはこちら。
ossyaritoori.hatenablog.com

エディタやパッケージの追加についてはこちらを参照。
ossyaritoori.hatenablog.com
ossyaritoori.hatenablog.com

iPythonについて

そういえばあまり書いてこなかったiPythonについても。

エディットしたいフォルダに行って

jupyter notebook

と打てばブラウザ上で画面が表示されます。右上のnewからPython3を選択して新規notebookを作成。
未だに使い勝手を測りかねています。

以下の記事が図付きでよいです。
はじめるJupyter Notebook - Qiita


GitHubについて

この時点ではまだGUI版をよく使います。

このサイトを見て時々コンソールから試す程度。
www.atmarkit.co.jp

余談ですがGitのシェルはコマンドプロンプトより幾分優秀です。デフォルトにしたいくらい。

OpenCV Python でHDR画像を合成してみよう

趣味全開です。趣味と実益とごっちゃになってきてます。
良いんだか悪いんだか。

Google PhotoのHDRレンダリング

Google PhotoにはHDRレンダリング機能があります。
feb29.org

つまりこんなかんじのこと。
f:id:ossyaritoori:20170918165509p:plain

これスマホの写真でやりたい!という記事になります。

追記:iPhoneを始め多くのカメラにはHDR機能が搭載されているそうな。知りませんでした…。
しかし以前手ブレの問題はあるのでかろうじて意義はあります。

以下説明

通常カメラが取る画像には明るさの幅に限界があって(ダイナミックレンジといいます)明るい所と暗い所を同時にきれいにとれないという問題が有ります。
結果、人間が見てきれいだと思う風景もカメラで取るとなんだか物足りない、ということになります。

そこで暗い画像と明るい画像を合成して人間が見た風景に近づけるのがこのHDRという技術です。

残念ながらGooglePhotoでは現状はスマホで取った画像ではHDR合成をしてくれないようです。
OpenCVにはHDR合成のサンプルコードがあるのでこれをうまく使って合成を試みてみようという試みになります。
OpenCV: High Dynamic Range (HDR)

レッツゴー!

1.手ぶれ補正

手で取るので必ずしも同じ画像とは限りませんね。このブレをなんとか補正したいです。
手ブレを微小回転と仮定し、SIFT特徴点を用いて回転を補正するコードを書けばいいんでなかろうか。

この論文とかそれっぽい。
A study on the compensation of image rotation for optical three-dimensional microscope - IEEE Conference Publication

追記1

OpenCV3ではSIFTが使えないのでAKAZEを使いました。
また,画像の変形はとりあえずホモグラフィー変換を用いましたがきちんとした式を建てると解くのが大変そうです。
これってちょっとした技術誌書けるんではないだろうか?

オプティカルフローからワープを推定してうまいこと処理する必要がありそうですがアイデアとしては既にどこかがやっているかと思われます。

追記2

訂正。並進要素のない微小回転とホモグラフィーワープは計算してみたら等価でした。

image stabilization(手ぶれ補正)で調べると結構関連記事が出てきます。
matlabの情報は古くAffineワープを使っていますが
Video Stabilization Using Point Feature Matching - MATLAB & Simulink
IEEEにもそれっぽい記事があります。うーん流石にちゃんと研究されていますね笑。
Video stabilization using classification-based homography estimation for consumer video camera - IEEE Conference Publication

ソース?

対応点から微小回転の射影変換行列を求めるmファイル。
三軸回転と焦点距離に関して式がでるので本当は4変数ですが線形方程式で解きたかったので5変数で解きます。ホモグラフィーの9変数より変数が少ないのでノイズには多少強いはず。ニッチなプログラムだなぁ。

function H = solveHomo_2(pts1,pts2)
%	H is 3*3, H*[pts1(:,i);1] ~ [pts2(:,i);1], H(3,3) = 1
%	the solving method see "projective-Seitz-UWCSE.ppt"

n = size(pts1,2);
x1 = pts1(1,:)';
x2 = pts2(1,:)';
y1 = pts1(2,:)';
y2 = pts2(2,:)';
zero = zeros(n,1);
one = ones(n,1);

A = [zero,-one, y1, x2.*y1, -x2.*x1, x2-x1;
    one, zero, -x1, y2.*y1, -y2.*x1, y2-y1];

%[evec,fuga] = eig(A'*A);
[U W V] = svd(A);
evec = V(:,6);

evec = evec/evec(end);
H = [1 -evec(3) evec(2); evec(3) 1 -evec(1); -evec(5) evec(4) 1];

end


でもよく考えたら中心点がわからないから正規化もできないし、その分も未知変数にすると結局8変数を推定することになるので普通に射影変換を求めれば良いという結論になりうる…

2.レンダリング

これはOpenCVのソースみれば書けそうな気がします。あとで書く。
OpenCV: High Dynamic Range (HDR)

やるよ。

追記1

よくみたら露光時間とかいう要素がありました。
なるほど携帯のカメラではまだそこまでやってくれませんね。

ゆくゆくは輝度値からうまく推定すべきでしょうが割りと適当でもそれなりにうまくいくようです。

やってみた

元画像はこちら。

暗い画像

明るい画像

どうしても空などと一緒に撮るとこういうことになっちゃいます。

位置ズレ補正

三脚ではなく手で連写するのでそのまま重ねると位置があわずに死にます。

ダブるでしょ。これを補正したいわけです。

AKAZEのマッチング結果と補正結果
f:id:ossyaritoori:20170918163755p:plain
遅くて今まで使ってなかったけど結構出来るやつですね。
重いので小さい画像で勘弁。

ちょっと回転とかが補正された後です。
f:id:ossyaritoori:20170918163807p:plain
わりと綺麗に補正されていますがより複雑なシーンだとホモグラフィーワープでは綺麗にいかないでしょう。
追記:極端な近景やカメラの並進がない限りはホモグラフィーで平気そうです。

重ねた結果

なんか複数手法があるらしく,よくわからないけど一番それっぽいのを一個見せます。


波とか動く部分があると粗はでますがわりと綺麗になったのではないでしょうか。

なるほど,意外といろいろ気を遣う部分があって製品?として公開してくれないというのはそういうことなのかなぁと思いました。

コード

現在修正中。来週の休みにでもGitにあげておきます。

今のところこんな感じ。
github.com

改善点

  • ワープ推定の数式の改良。
  • 露光時間比推定アルゴリズム実装
  • 色鮮やかにするフィルタの適用

がメインの課題でしょうか。3つ目はおまけですが。

viso2_ros installation in arm processor (Kinetic)

There is strong packages to get odometry from stereo and monocular cameras.
viso2_ros - ROS Wiki

It somehow causes compilation error with arm processor such as jetson TX series.
github.com

Brief overview

  • -msse3 compiler option is not supported for arm processor.

You should comment out that.

  • replace #include with #include "SSE-to-NEON/sse_to_neon.hpp"

Get SSE-to-NEON file

github.com

save this hpp file in your include library

cd /usr/include
git clone https://github.com/otim/SSE-to-NEON.git

Then you can include using #include "SSE-to-NEON/sse_to_neon.hpp".

change some part of SSE-to-NEON.hpp

in line 14 and line 46 like below

//#if defined(__MM_MALLOC_H)
// copied from mm_malloc.h {

~~~

// } copied from mm_malloc.h
//#endif

Change CmakeList and package.xml

comment out -msse3 description in every CMAKELIST file.

in viso2/viso2_ros ,viso2/viso2, viso2/libviso2

change package.xml in viso2/libviso2

change from

    <cpp lflags="-L${prefix}/lib -Wl,-rpath,${prefix}/lib -lviso2" cflags="-msse3 -I${prefix}/libviso2/src/"/>

to

    <cpp lflags="-L${prefix}/lib -Wl,-rpath,${prefix}/lib -lviso2" cflags="-I${prefix}/libviso2/src/"/>

Change source cord

You should change filter.h and matcher.h in libviso2/src.

comment out some emmintrin.h and pmmintrin.h and replace with SSE-to-NEON.hpp like below

//#include <emmintrin.h>
//#include <pmmintrin.h>
#include "SSE-to-NEON/sse_to_neon.hpp"

memo

This error is around _mm_malloc function.
Why do they use this package?

ROS aruduinoでモータ制御 + 複数のデバイスでデータ共有

それでは行ってみましょう.

システム例

なんでもSmartCarKitというのが有るそうな.

ラズパイでコントロールできるような車をROSで制御するというのはなるほどなかなか面白そうです.
Smart Video Car kit購入しました - yayu_daemanのブログ

Arduinoを用いたシステム例

一方でArduinoはちょっとしたモータ制御を簡単に行うのにもってこいな教材として広く知られています.
専用のモータシールドもそれなりに安くてにはいりますしね.



ROSとArduinoの通信

ということで,ROSとArduinoとをうまく通信させる必要があります.

rosserialのインストール

今のところメモでしか無いですが以下のようにrosserialパッケージをダウンロードすることで通信することが可能です.
ossyaritoori.hatenablog.com

実行方法

実行時に ls コマンドで/dev/以下を見ます.
そこでArduinoと接続しているUSBポートを見つけます.
頑張ってください.大体tty〜という名前になっています.MiniUSBに挿すとttyAMC0とかになります.

そしてそのデバイス名を仮にttyAMC0とすると

rosrun rosserial_python serial_node.py ttyAMC0

を実行することで接続することができます.


異なるデバイスのROS同士の接続

もちろんROS同士の通信もサポートされています.
こいつはロボットを走行させている時に,他のPCから様子をリアルタイムで確認したりデータを逐次チェックしたりするのに使えます.もちろんリモート制御も可能.


普段はROSの公式ページを貼るところなんですがこれに限っては以下の日本語のサイトが非常にわかりやすいです.
ROS 使い方メモ -- ROS ネットワーキング

手順としては以下の3つになります.

  • お互いにpingを通せるようにする.(ネットワーク設定)
  • ファイヤウォールの無効化(こわい)
  • ROS_MASTER_URIとROS_HOSTNAMEの設定

ここでは例えば,roscoreを走らせる側をhost,そうでない側をclientと定義します.
以下の設定は基本的には両方の側で設定する必要があります.

ネットワークの設定と確認

まずifconfigなどで同じローカル回線にいるか確認します.

次に/etc/hosts というファイルの設定を変更して例えば

sudo gedit /etc/hosts

としてファイルを開いた後,

<host ip address> host
<client ip address> client

のような一文を書き加えます.
これで192.168.12.xxと入力する代わりにhostとclientとうつことができます.

これは必須ではないのですがいちいち192.168.12.xxみたいなのを打ち込むよりよっぽど間違いが少ないです.
できることならDHCPでアドレスが変わることのないようmanualでipを設定できるようにすると良いでしょう.

なお,この設定はhost側とclient側の両方でやっておくことをおすすめします.

firewallの無効化

以下のコマンドでfirewallを無効化

$ sudo ufw disable

ファイアウォールの有効化は

$ sudo ufw enable

ROSの設定

ホスト側の設定

以下のような変数を定義します.

export ROS_MASTER_URI=http://host:11311
export ROS_HOSTNAME=host

上の定義は違う端末のROS同士がコミュニケーションする際に必須で,
下の定義は実際にデータをやり取りするときに必要になるようです.
これらはプログラムを実行するターミナル毎に必要ですのでbashrcに書いておくのがよいでしょう.

クライアント側の設定

同様に以下のような変数を定義します.

export ROS_MASTER_URI=http://host:11311
export ROS_HOSTNAME=client

ここで,これらをbashrcに書くかというと書かないほうがいいのかなと思っています.
どうしても必要ならroslaunchに書くか,シェルスクリプトとして書いたほうがいい気がします.

なぜならこれを実行するとデバイス外のroscoreにしかアクセスできなくなるからです.もっというとroscoreがちゃんと働かないはずです.楽をする良い方法を考えておきます.


ハマった罠とか

とりあえず,ROS_MASTER_URIはきちんと設定しないと通信がまずできません.
その後,ROS_HOSTNAMEを持っていないとrostopic listは見れるのにechoができないとかいうことになります.

困った時はチュートリアルGoogleで頑張って.
ROS/Tutorials/MultipleMachines - ROS Wiki

参考になりそうな書籍

たのしくできるArduino電子制御

たのしくできるArduino電子制御

Raspberry Piで学ぶ ROSロボット入門

Raspberry Piで学ぶ ROSロボット入門

Programming Robots With ROS

Programming Robots With ROS

  • 作者: Morgan Quigley,Brian Gerkey,William D. Smart
  • 出版社/メーカー: Oreilly & Associates Inc
  • 発売日: 2015/12/25
  • メディア: ペーパーバック
  • この商品を含むブログを見る

ROS 最低限のセットアップ

出先でROSを入れまくっているのでそろそろその度に公式documentをたどるのを辞めたいところ.

ROSのインストール

anacondaなどで自前のpython環境をつくっているひとは,その環境とは別にROSの環境を立てるのをおすすめします.
ユーザ変えるとかしていいかも?

自分の過去記事見てもいいですし,普通に公式Document見てもいいです.
ossyaritoori.hatenablog.com

dockerの上にROSを立てるというのもあったりするので猛者はぜひ挑戦してください.
docker/Tutorials/Docker - ROS Wiki


catkin_wsの作成

公式の手順をかいつまんでいきます.
ROS/Tutorials/InstallingandConfiguringROSEnvironment - ROS Wiki

次にはワークスペースを作成します.

$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/
$ catkin_make
$ source devel/setup.bash

例のごとくsetup.bashは面倒ならbashrcに書いておきましょう.
(catkin_wsを複数作る予定が有るなら別)

ここまできたら正直準備は完了です.

Tutorialを導入

大して意義は無いですが,大方のROSのパッケージ説明などにおいてTutorialがこなされていることを前提に話が進む場合が多いです.やっぱりドキュメントは読んでおきましょう.

また,チュートリアル用のファイルも一応持っておいて損はないです.

$ sudo apt-get install ros-<distro>-ros-tutorials

ROSを新しくインストールする (含 Anacondaとの競合解決)

ROSのバージョンが古くなったり,ある程度いじった後いろいろとセットアップが面倒になった際に綺麗サッパリ掃除して最初からやり直したいという時にこの手順を踏みました.

アンインストール

以下のガイドに従って,
Uninstall and reinstall ROS - ROS Answers: Open Source Q&A Forum

sudo apt-get purge ros-<distribution>-*

この後,sudo apt autoremove を要求されたので実行して関連パッケージを削除しました.

インストール

ROS のサーバからのデータの受信を許可

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 421C365BD9FF1F717815A3895523BAEEB01FA116

この後一度,sudo apt-get update をかまします.

kineticのインストール<2017年9月現在>
ディストリビューションのおすすめは年度が進むごとに変わります.
また,そろそろROS2が出るのでその頃にはこの記事は時代遅れになっているかもしれません.

sudo apt-get install ros-kinetic-desktop-full

rosdepの設定です(私はここでエラーが発生しました(後述))

sudo rosdep init   
rosdep update

setupをします.

source /opt/ros/kinetic/setup.bash

このコードは毎回必要になるのでbashrcに記述しておくのが良いでしょう.

その後,pythonのパッケージをインストールします.

sudo apt-get install python-rosinstall  

ここまでなんの問題もなければ順調でしょう.後はチュートリアルやってね.

エラーが起きる場合:AnacondaとROSのコンフリクト

さて,AnacondaとROSが共存している私の環境では非常にこれは辛い問題です.
ROSは近々2になるしTensorflowを使わない限りROSのPythonパッケージを使えば十分な気もしますが,果たしてどうしのいだものか.

どうやら似たようなことをStackOverflowにて発見.
Conflict with ROS Python and Conda - ROS Answers: Open Source Q&A Forum

Try1: Remove Conda from PATH

上の参考記事において最も簡単と書いてあったこの手法を試してみるとします.

Path の消し方

stackoverflow.com

まずはanacondaのPathを調べます.

echo $PATH

私の場合は以下にありました.は自分のユーザ名です.多分晒しても平気だと思われます.

/opt/ros/kinetic/bin:/home/<user>/anaconda3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

一応中身を確認すると,condaのコマンドやpython3,ipythonなどがありまして...
Pathを削除したらこれらに絶対Pathを与えてアクセスする必要があります.うーんこれは良い解決策か?

次にこのPathを削除するにはescape sequenceを交えて以下のように書きます.(ちなみにうまく行かなかった)

PATH=`echo $PATH | sed -e 's/:\/home\/<user>\/anaconda3\/bin\/$//'`

確認してみるとん?消えてない.ということでより確実な方法を使います.先ほどのPATHから該当箇所をぬいて

export PATH=/opt/ros/kinetic/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

これで完了です.さようならanaconda

.bashrcの中身を無効化

以下の部分をコメントアウト

# added by Anaconda3 4.2.0 installer
#export PATH="/home/<user>/anaconda3/bin:$PATH"
# added by user 
#export PYTHONPATH="/home/<user>/anaconda3/lib/python3.5/site-packages:$PYTHONPATH"

これを忘れると次回起動時に同じ感じになります.

Try1の続き:ワークスペースを一度綺麗にする

未だにPythonのPathが残っている模様...?

Pythonのパッケージの確認

>> which python
/usr/bin/python

一応pythonがシステム標準のものになっているということを確認.

この時点でうまく行くと思われるので以下の解説に従い,一度catkin_ws以下をお掃除.
https://groups.google.com/forum/#!topic/ros-japan-users/DwmvcM9X5jU

rm -fr ~/catkin_ws/devel ~/catkin_ws/build

この後,もう一度catkin_makeを行うことで成功.

余談:anacondaは動くのか?

試しにfullpathを与えてpythonを駆動してみました.

user:~/catkin_ws⟫ /home/<user>/anaconda3/bin/python
Python 3.5.2 |Anaconda 4.2.0 (64-bit)| (default, Jul  2 2016, 17:53:06) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so: undefined symbol: PyCObject_Type
>>> import numpy

ふぅ〜.cvやtensorflowへはアクセスできないみたい?ですね.これはおそらくバージョンや参照先の違いとかのせいでしょう.numpyとかは正しくimportできているように見えます.見えるだけかも.
Python2系なのは不満ですがros2が出るまでの辛抱です.

一応メモとして残しておきました.

ROS and Arduino serial communication setup

Supposed to use ros kinetic on ubuntu 16.04LTS.
And currently it is just a memo.

Download Arduino IDE

Install Software (Linux) | Ladyada's Learn Arduino - Lesson #0 | Adafruit Learning System

Ancient (Un reccomended)

Following step you do not need to do, but I mistaken done that.

Arduino Playground - Ubuntu

sudo apt-get update && sudo apt-get install arduino arduino-core 

Download from HP and Install

Choose your OS. I use Ubuntu 16 on jetson TX1 (arm64) so choose "Linux ARM".
Arduino - Software

after you unzip it,
I got many warning but I could see that.

touch: cannot touch '/home/ubuntu/.local/share/icons/hicolor/.xdg-icon-resource-dummy': No such file or directory

And my desktop icon do not work...

Checking if it works

ls /dev/ttyUSB*

rosserial_arduino/Tutorials/Arduino IDE Setup - ROS Wiki


Sample Code?

Too long to explain. See the official tutorial.< source cord cannot be pasted...>