本文
自分はC++とMATLABのプログラムを書く事ができます.
しかし,いつもどちらの言語でプログラムを書くのか悩んでしまいます.
基本的にロボットのプログラムはC++で書いています.
また,ニューラルネットの学習のように,
ループの回数が多くなるようなものもC++で書きます.
自分の感覚では,
forループ盛りだくさんのプログラムを
C++とMATLABで書くと,
MATLABの方が100倍ぐらい遅いです.
(まあ,書き方に大きく依存しますが)
また,時間管理やマルチスレッド処理,
オブジェクト指向的なプログラムはC++の方が
比較的簡単に行うことができる気がします.
また,C++の一番の利点としては,
結局ロボットに実装する時は
C++でシステムを構築する必要があるということです.
もし,MATLABであるプログラムを書いたとしても,
結局最終的にはC++に落とす必要があります.
(まぁ,realtime workshopを使えばいいのかもしれませんが)
しかし,一方,MATLABではグラフの描画など,
データの可視化を簡単に行う事ができるのが利点です.
シミュレーションの結果をリアルタイムで描画したい時などは,
断然MATLABの方が楽です.
つまり,あるシミュレーションを行いたい場合
C++ :利点 計算が早い,完成すればそのまま実装できる,プログラミングし易い(自分的には)
MATLAB :結果の描画が簡単,いろんな形式で結果を描画できる.
なので,自分はこのように考えました.
C++で作成したシミュレーションの結果を
MATLABでリアルタイムで描画できないか?
つまり,このように言い換えることができます.
C++のデータをリアルタイムでMATLABに投げることができないか?
ということです.
昔,といっても1年ぐらい前ですが,
これをやろうと思って,いろいろ調べたところ,
C++とMATLABの通信として,
TCP−IPの通信コマンドがあることや
mexファイルの存在を知りましたが,
基本的には研究とは別の部分なので,
あまりやる気も出ず,途中であきらめました.
結局その後,gnuplotやopenGLを使用して,
C++のシミュレーション結果をリアルタイムで描画していました.
(これはこれでいい勉強になりましたが)
しかし,最近,不意にこの問題の解決方法を思いついてしまい,
今日,やってみたところ,なんと成功してしまいました.
しかもプログラム作成時間15分...
今日はこの方法について述べます.
方法はものすごく簡単です.(なんで思いつかなかったのかというぐらい)
1. C++のシミュレーションの結果をループの中でファイルに出力.
(自分の場合,普通のtxtファイルに出力しました)
2. C++は動かしっぱなしで,結果がどんどんファイルに書き出されている
3. 同時にMATLABの描画専用のプログラムを回す.
その中で毎回C++の結果のファイルをロードする.
4. そのデータを描画する.
つまり,C++とMATLABのデータのやり取りを,
一つのファイルを介して行うということです.
簡単ですね.
以下が自分の書いたプログラムです.
% Sample for visualization with C++ module % % Designer(s) : A.sakai(AMSL) % Author(s) : A.sakai(AMSL) % % Latest Update: 2009/06/06 % CopyRight : 2009, Autonomous Mobile Systems Laboratory, Meiji Univ. clear all; while 1 %% Data load x=load('目標のファイルへのパス'); %% Plot plot(x); drawnow pause(1); end
プログラムの実質的な行は5行ぐらい(笑)
簡単すぎます.
しかし,注意点があります.
当然ですが,同じファイルに二つのアプリケーションが操作を行うので,
プロセスがかち合って,MATLABの処理にエラーが出る事があります.
当然ですが(笑)
自分も最初はエラーが出ました.
自分の場合,C++のシミュレーションは10Hzで回してて,
MATLABのループに制限をかけずに回していたら,かち合いました.
そこで,プログラム内のpauseを使用して
MATLABのループを遅くすると,なんと怒られなくなりました.
つまりC++のシミュレーションに比べて
MATLABのリードを遅くすればなんとかなるということです.
まぁ,基本的にはこれはデバックの際に使用するものなので,
多少は,描画の感覚が遅くても問題はないと思います.
本格的にアニメーションを作る場合は,
データセットをあらかじめ作っておいて,
それをMATLABに流しますからね.
とりあえずプログラムの挙動が視覚的に解ればよいのです.
できてよかったです.
これで,少しはデバックが楽になります.
グラフ
今回のプログラムのMATLABの出力結果.
今回はC++のプログラムの方でプログラムの経過時間を渡すだけなので,
このグラフの線がうにょーとのびて行くだけです.
それでも,初めて動いた時は感動でした.