MyEnigma

とあるエンジニアのブログです。#Robotics #Programing #C++ #Python #MATLAB #Vim #Mathematics #Book #Movie #Traveling #Mac #iPhone

他の言語(C++,Javaなど)のシミュレーション結果をMATLABでリアルタイムで描画する.

自分は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ファイルの存在を知りましたが,

基本的には研究とは別の部分なので,

あまりやる気も出ず,途中であきらめました.

結局その後,gnuplotopenGLを使用して,

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++のプログラムの方でプログラムの経過時間を渡すだけなので,

このグラフの線がうにょーとのびて行くだけです.

それでも,初めて動いた時は感動でした.