Arduino&MATLABでサーボモータ(とか)を制御する
ArduinoとMATLABを連携すると要はコンパイルなしにいろいろデバッグができて作業効率が良いということです。
Pythonでもできそうなもんだけど誰か代わりに調べてください。
この30分のビデオ見ればここにあることは全部わかります。
Using Arduino with MATLAB and Simulink - Video - MATLAB
パッケージのインストール
matlab2014以降から対応です。
Support Package InstallerからArduinoに関する追加のパッケージをインストールします。
Home画面のAdd-onから探せるそうですが
matlabコンソールから試しに
a = arduino();
とか入力してみて出たエラーからも簡単に飛ぶことが出来ます。
あとはひたすらポチポチするだけです。大体15分弱かかります。
Arduinoとの接続と試運転
Control Servo Motors - MATLAB & Simulink Example
を参考に進めていきます。
接続
ホーム画面から「コンピュータの管理」というのを探し当ててそこからデバイスマネージャーのポートという所を探してください。
こんな感じ。
ここから得た情報を元に次のように入力してみます。
2つ目の変数はボードの種類なのでunoを使っている人はunoを入れてください。
a = arduino('com4', 'Mega2560', 'Libraries', 'Servo');
サーボモータの制御
サーボモータのピンを調べます。私のはモータシールドの「OUT5」につながっているので以下のドキュメントからD5とわかります。
Arduino Motor Shield Rev3
s = servo(a, 'D5') s = Servo のプロパティ: Pins: D5 MinPulseDuration: 5.44e-04 (s) MaxPulseDuration: 2.40e-03 (s)
実際に遊んだ時のコードです。writePosition(s, angle);とcurrent_pos = readPosition(s);のようにして
位置の読み書きをします。
注意として0~180°が0~1に置き換わっているので180で割ったりしてください。
%% write value Base_angle = 90; Min_angle = -30; Max_angle = 30; for angle = Min_angle:10:Max_angle Wangle = (angle+Base_angle)/180; writePosition(s, Wangle); current_pos = readPosition(s); current_pos = current_pos*180; fprintf('Current motor position is %d degrees\n', current_pos); pause(1); end Wangle = (Base_angle)/180; writePosition(s, Wangle);
他のmethodの確認
methods(a)
とうつことで使用できる関数を確認できます。
私のはこんなのでした。最新バージョンではボタン等のUIも書けるようです。とビデオにはあったんですがね。
addon configurePin display readDigitalPin servo writePWMDutyCycle configureAnalogPin details i2cdev readVoltage spidev writePWMVoltage configureDigitalPin disp playTone scanI2CBus writeDigitalPin
連続的に制御するには?
時間を取得するticとtocというコマンドを使ってwhileループぶん回すことで擬似的にそれっぽい制御をすることが可能になります。
あとはdelayを適宜入れれば遅い周期の動作は可能です。
DCモータの制御
本当はシステム同定をしたかったのですが手持ちの環境ではちょっと難し目です。あとで別に書きます。
特定の部品を使っている場合は簡単
Adafruit社のモーターシールドV2を使っている場合はとても簡単にDCモータを制御可能です。
裏を返すとそうでないと割りと面倒という...
Control Motors Using Adafruit Motor Shield V2 - MATLAB & Simulink Example
安いので楽をしたい人は買ってどうぞ。
Adafruit Motor/Stepper/Servo Shield for Arduino v2 Kit [v2.3] ID: 1438 - $19.95 : Adafruit Industries, Unique & fun DIY electronics and kits
私は持ってなくて悔しいのでこれについては書きません(公式のドキュメントが十分わかりやすい為でもある)
Neural Network Console by Sony のセットアップと動かしかた
2017年8月にSonyが機械学習用のGUIコンソールを発表して話題になりましたね。
手が早い人はもう記事を書いているようですが、晩御飯食べてる間に試してみたので記しておきます。
Neural Network ConsoleでNVIDIAGPUの動作確認まで - Qiita
ダウンロードとセットアップ
以下のサイトからダウンロード、解凍しておしまい。
Neural Network Console
というわけにも行かず、Visual C++の再領付パッケージを入れる必要があるようです。
Download Microsoft Visual C++ 2015 再頒布可能パッケージ Update 3 RC from Official Microsoft Download Center
これもダウンロードしてポチポチしておしまい。
チュートリアル1:ロジスティック回帰による手書き文字認識
チュートリアルは手書き数字が4か9か判別する一層のニューラルネットワークモデルですね。
右上のTrainingという所で再生マークをクリックすると学習が始まります。
流石に早い。
その後Evaluateの下の再生マークから実行すると評価を始めます。
それぞれの入力に対する実際の出力の値、
タブを変えると学習の正答率を表す表が出てきます。
うんうん。なるほど。
所感、感想
Web上では敷居が低く、文系にも使いやすい等いろいろ書いてありましたが
「Pythonを覚えなくてもいい」というのが一番の進歩でしょうか。
このコンソールで出てくるネットワーク構造をきちんと理解し、正しい使い方を自力で収集できる人は、
数ヶ月プラスすればPythonだって普通に使いこなしそうな気がするので
「とても便利」だけど「革命的」とまでは行かないと思われます。
これからこういう風に、学習法や幾つかのネットワーク構造が徐々に確立されつつある中で、
データセットや適切な問題設定の重要性が爆上がりしていくんですかね。
データ収集には結局プログラム書かないといけないのでプログラミングフリーの機械学習はまだまだ先でしょうか。
jupyter notebookをmatlabで使う / Google Driveにnotebookを保存
ポ○ットモンスター 金/銀 みたいなタイトルですが、iPythonのセットアップについてです。
難易度はそこそこある気がします。「なみのり」を覚えてから来てください。
- 前提:Python環境
- jupyter notebookをmatlabで使う
- jupyter notebook を GoogleDrive上で扱う。
- Matlabが古いけど無理やりでもこの機能を試したい!
前提:Python環境
私の環境ではとりあえずWindowsでやるつもりでいます。
一連のパッケージ環境を整えるにはanacondaもしくはminicondaを使うのが良いでしょう。
あと、GitHubの一部コマンドが必要なので適当に調べて入れておきましょう。
例えばここを見るとか。
私家版 Git For Windowsのインストール手順 | OPC Diary
Anacondaを使う場合(簡単・ストレージを割りと食う)
Anacondaは一連のPython関連の便利パッケージを落としてくれるのでPythonに今後お世話になる気のある人はこちらを使いましょう。
デフォルトで2Gくらい容量持って行かれるので注意。
下の記事を参照。
ossyaritoori.hatenablog.com
画像関係に興味がある方はこちらの記事も踏んでおいたほうがいいですが、まぁ後からできるので無理にすることはないです。
ossyaritoori.hatenablog.com
Minicondaを使う(ストレージを沢山消費したくない人向け)
先ほどのAnacondaの機能絞った板がこちらです。
Miniconda — Conda
Pythonとcondaのパッケージ管理だけなので数百Mの容量で済むはず(試してない)
どのみちやることは同じです。
jupyter notebookをmatlabで使う
以下の参考サイトに準拠してすすめます。
Matlab-based IPython notebooks | Anne UraiGitHub - Calysto/matlab_kernel: Jupyter Kernel for Matlab
Install MATLAB Engine API for Python - MATLAB & Simulink
0.Python(仮想) 環境構築
MatlabのバージョンごとにPythonの対応するバージョンが違います。
現状2015a,bでPython2.7系とPython3.3,3.4
現状2017bではじめてPython3.5がサポートされます。
これは
「C:\Program Files\MATLAB\R20XXa\extern\engines\python」にあるsetup.pyというファイルを覗けばわかります。
バージョンとか何も考えずに次に行きたい!という方はAnacondaのダウンロードの際に2.7を選択すると良いです。
ただ,今後継続してPythonを使う人は3.X系のほうが良いかもしれないです(バージョンごとに微妙に文法が違う)
次に仮想環境の構築についてです。
私の2015bの場合はPython3.4までが対応ですのでAnacondaの現在の3.6と噛み合いません。
ということで仮想環境を立てます。
conda create -n matlab python=3.4
次に,デフォルトではipythonが入っていないので
activate matlab conda install jupyter notebook
とうちます。多分合ってると思うけどドチャクソ容量持って行かれますねこれ。
追跡したらAppdataの中を1Gくらい占拠していました。空き容量には余裕をもってください。
1.Matlab engineのインストール
anacondaから使いたい環境を選んでactivateしておいてください。(activateの単語に身に覚えのない人は気にせずanacondapromptを起動しましょう)
この際管理者権限でプログラムを実行したほうが良いです。
WindowsのHomeボタンで「AnacondaPrompt」とサーチして出てきたアイコンを右クリック&「管理者権限で実行」を選択しましょう。
以下を実行してください。2014以前のバージョンにはこのsetup.pyが含まれていません。中身書き換えて移せばなんとかなるんじゃね?なりませんでした。
cd "matlabroot\extern\engines\python" python setup.py install
matlabbootはmatlabがおいてあるPathです。
頑張って探してください。参考までに私のは以下のような感じです。(なおバージョンが古くてなかった模様)
C:\Program Files\MATLAB\R2007b\
上手くいったら2へとすすんでください。
エラーが出たら?
- Pythonのバージョン云々言われたら仮想環境の設定を確認してください。
きちんとactivate matlabってやって仮想環境入ってます?ダメなら先ほどの章を確認。
- その後厄介なのが管理者権限が無いことでおきるエラー
以下のようなエラーが出る事があると思います。
error: could not create 'build': アクセスが拒否されました。
Error Installing MATLAB engine API for Python - MATLAB Answers - MATLAB Central
ということでコマンドプロンプトを管理者権限で実行してください。
setup.pyがあるフォルダまで移動して,次のようにうちます。
"C:\Users\__USER__\AppData\Local\conda\conda\envs\matlab\python.exe" setup.py install
めっちゃ長いのはさっきの仮想環境のPythonのFullPathです。
__USER__には自分のユーザ名を入れてください。というか一度ちゃんと探すと良いでしょう。
- うまくいくとこんな感じ?
最後の行でエラーって出てなければ多分上手く行ってると思います。
なんだこれは戦後の教科書か。
2.必要パッケージのインストール
その後、自分の環境で以下のコマンドをうってください。
pip install matlab_kernel python -m matlab_kernel install
jupyter notebook を GoogleDrive上で扱う。
GitHubでソース管理するのもいいけどGoogleDriveにもおいておきたい!という方のために、拡張プラグインが開発されています。
github.com
日本語記事もこちらに。
jupyter-driveを使ってみる
インストール
これだけ。
git clone https://github.com/jupyter/jupyter-drive.git pip install -e jupyter-drive
起動
複数やり方はありますが、以下のように設定するのがおすすめ。
python -m jupyterdrive --mixed
下のような画面になりました。
localをクリックするとlocalのフォルダへ、gdriveを選択するとGoogleDriveへのアクセス許可を求められます。
Matlabが古いけど無理やりでもこの機能を試したい!
結論上手く行ってませんので諦めて新しいバージョンのmatlabに課金してください。
以上が「通常の手法」です。
matlabやpython,ipythonのバージョンが合わなかったりするととたんに闇のゲームへと突入します。
ちょっと調べただけでもうげぇとなるようなケースがちらほら。
anaconda3-4.2.0 (Python3.5.2) 環境で Jupyter Notebook 上で MATLAB R2017a API の使用ができないのはなぜですか? - MATLAB Answers - MATLAB Central
matlab live editorという逃げの1手
わりかし似たような事ができるものとしてLive editorというものがあるようですが...
www.mathworks.com
これで勘弁してくれないですかね。
さぁ、闇のゲームだ!
例えば強制的にengine以下のフォルダを持ってきてpythonスクリプトを修正して発動してしまうのはどうでしょう?
只今奮闘中...
追記:敗北しました。古いmatlabのバージョンでは騙せなさそう...
さらに追記:
setup.pyをいじってバージョン違いでもエラーを出さないように加工してもやはり最後に以下のようなエラーが出ます。
諦メロン
第二ラウンドだ!
Jupyter: Matlab Kernel Dies · Issue #22 · Calysto/matlab_kernel · GitHub
以下のコマンドを導入...
pip install metakernel pip install pymatbridge
追記:敗北しました。ていうかどこかしこを探しても無理って言ってますね。公式に楯突くのはやめておきましょう。
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
- メディア: ペーパーバック
- この商品を含むブログを見る