Windows Python 環境おさらい 2017年9月編
メモ記事のメモというやつです。ポインタへのポインタ的な。
WindowsとUbuntuの環境がごっちゃになってきたので。
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
つまりこんなかんじのこと。
これスマホの写真でやりたい!という記事になります。
追記: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
よくみたら露光時間とかいう要素がありました。
なるほど携帯のカメラではまだそこまでやってくれませんね。
ゆくゆくは輝度値からうまく推定すべきでしょうが割りと適当でもそれなりにうまくいくようです。
やってみた
元画像はこちら。
どうしても空などと一緒に撮るとこういうことになっちゃいます。
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.
Get SSE-to-NEON file
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でモータ制御 + 複数のデバイスでデータ共有
それでは行ってみましょう.
システム例
ラズパイでコントロールできるような車をROSで制御するというのはなるほどなかなか面白そうです.
Smart Video Car kit購入しました - yayu_daemanのブログ
ROSとArduinoの通信
ということで,ROSとArduinoとをうまく通信させる必要があります.
rosserialのインストール
今のところメモでしか無いですが以下のようにrosserialパッケージをダウンロードすることで通信することが可能です.
ossyaritoori.hatenablog.com
異なるデバイスのROS同士の接続
もちろんROS同士の通信もサポートされています.
こいつはロボットを走行させている時に,他のPCから様子をリアルタイムで確認したりデータを逐次チェックしたりするのに使えます.もちろんリモート制御も可能.
普段はROSの公式ページを貼るところなんですがこれに限っては以下の日本語のサイトが非常にわかりやすいです.
ROS 使い方メモ -- ROS ネットワーキング
手順としては以下の3つになります.
ここでは例えば,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側の両方でやっておくことをおすすめします.
ROSの設定
ホスト側の設定
以下のような変数を定義します.
export ROS_MASTER_URI=http://host:11311 export ROS_HOSTNAME=host
上の定義は違う端末のROS同士がコミュニケーションする際に必須で,
下の定義は実際にデータをやり取りするときに必要になるようです.
これらはプログラムを実行するターミナル毎に必要ですのでbashrcに書いておくのがよいでしょう.
ハマった罠とか
とりあえず,ROS_MASTER_URIはきちんと設定しないと通信がまずできません.
その後,ROS_HOSTNAMEを持っていないとrostopic listは見れるのにechoができないとかいうことになります.
困った時はチュートリアルとGoogleで頑張って.
ROS/Tutorials/MultipleMachines - ROS Wiki
参考になりそうな書籍
ArduinoとMATLABで制御系設計をはじめよう!実験キット-Physical Computing Lab
- 出版社/メーカー: TechShare(テックシェア)
- メディア:
- この商品を含むブログを見る
- 作者: 牧野浩二
- 出版社/メーカー: 東京電機大学出版局
- 発売日: 2015/07/20
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
- 作者: 上田隆一
- 出版社/メーカー: 日経BP社
- 発売日: 2017/03/30
- メディア: 単行本
- この商品を含むブログ (1件) を見る
- 作者: 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 の消し方
まずは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.
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...
Sample Code?
Too long to explain. See the official tutorial.< source cord cannot be pasted...>