忍者ブログ
ロボット、千葉ロッテマリーンズについていいかげんなことを書きます。
[64]  [65]  [66]  [67]  [68]  [69]  [70]  [71]  [72]  [73]  [74
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

実は記事のタイトルはでたらめで,僕の腐敗神話を延々と書くのが今日の記事の内容です.


・・・まあ,そんな誰が得するか分からない嘘は置いといて,今回は前回作成した実行コンテキストをいぢってみます.


今回のサンプルはここからダウンロード出来ます.


サンプルでは,OpenMPを使って複数のRTCを並列かつ同期的に処理するようにしています.

複合コンポーネントでは,ひとつのECで複数のRTCが駆動できるようになってます.

普通に複合コンポーネントを作成したら,直列実行になるみたいですね,多分,

でも,論文読んでみた感じ,同期的かつ並列実行もできるみたいに書いてますけど,今その機能があるのか,あってもどこで設定するのかを僕は知らないのでOpenMPで自作しました.

駆動するRTCの処理をするスレッドの開始時刻は同じになるので,同期的かつ並列になるはずです.

・・・・RTCの数が少ないときはですけど.

おそらく,複合するRTCが多すぎると同一スレッドで複数のRTCを処理すると思います.


VC2008EEでOpenMPを使用したプログラムを作成するにはWindows SDK for Windows Server 2008 and .NET Framework 3.5が必要です.Proffesionalとかなら要らないみたいです.

プロジェクトの作成の際は,プロパティ→C/C++→言語のOpenMPサポートをはいに変更してください.




今回作成したサンプルの使用方法を説明します.

まず,MPExecutionContextManagerのReleaseフォルダに入っているMPExecutionContextManager.exeを起動してください.

すると,マネージャが登録されます.


そして,今回はTest1とTest2のフォルダのcomponentsフォルダにテスト用RTCを用意したので,Test1CompとTest2Compを起動してください.

そして,複合コンポーネント作成時に出てくるダイアログのManagerを先ほど起動したマネージャに設定して複合コンポーネントを作ってください.

これで完了です.複合コンポーネントを作成すると,マネージャのコンソール画面に処理時間が表示されます.

非アクティブの時は0.00となるはずです.


ここで,アクティブにしてみます.

すると,経過時間が変化するはずです.

ちなみに,僕の環境では0.3秒ぐらいかかります.




これでは比較ができないので,一旦マネージャとRTCを終了させてから「並列処理無し」という名前のフォルダに入ってるMPExecutionContext.dllというDLLをマネージャのフォルダにコピーしてから実行してください.


・・・・としようと思ったのですが,複合コンポーネントを解除しようとするとバグりますね.

あまりよろしくないですが,コンソールの×を押して消しましょう.

一体,どこがおかしいんでしょうね?
実行コンテキストではないようですが.



それで実行するとさっきより遅くなると思います.

ちなみに僕の環境では0.6秒近くかかります.

元に戻すときはMPExecutionContextのフォルダのReleaseにあるMPExecutionContext.dllをさらに上書きしてください.


さて,今回のソースを見てみます.

以下はMPExcutionContextのMPExecutionContext.cppのソースの一部です.



#include <omp.h>  //OpenMPを使うためのヘッダー


int MPExecutionContext::svc(void)
{
     
      do{
            clock_t start,end;  //時間測定のための変数
            start = clock();  //開始時間

            #pragma omp parallel  //この指示文以降のブロックをマルチスレッドで実行
            #pragma omp for   //forループをスレッド間に分割
            for(int i=0;i < m_comps.size();i++)
            {
                invoke_worker()(m_comps[i]);  //i番目のRTCの処理実行
            }

            end = clock();  //終了時間
            printf("%.2f秒かかりました\n",(double)(end-start)/CLOCKS_PER_SEC);  //時間表示
           
      }while (m_running);

   
    return 0;
}



といった感じです.

今回のサンプルでは実行周期を指定できないので,できるようにすべきがどうかは考え中です.

需要があればやろうと思いますけど,僕が見逃してるだけで実は並列にも設定できるとかだったら怖い.





あ,そうそう.

卒論発表の終わる25日まで更新できません.

1日1回更新すると言っといて無責任ですが,25日からは更新するつもりなので勘弁してください.










にほんブログ村 科学ブログ ロボットへ
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・

人気ブログランキングへ

PR
OpenRTM-aist検定なるものがあるらしいですが,正解以外の選択肢を一度も聞いたことがないような気がするのは一体・・・・

マニアックすぎるだろ.




それはさておき,今回は実行コンテキストを作成します.

サンプルはここから.



サンプルの使用方法を説明します.

まず,解凍したフォルダのrtc.confとReleaseかDebugフォルダのTestExecutionContext.dllをRTCの実行ディレクトリにコピーします.

この時に選ぶRTCは何でもかまいません.

ただし,ReleaseでビルドしたRTCはReleaseフォルダ,DebugでビルドしたRTCはDebugフォルダのDLLを使ってください.


ちなみに,rtc.confの中身では,


exec_cxt.periodic.type: TestExecutionContext
manager.modules.load_path: ./
manager.modules.abs_path_allowed: no
manager.modules.preload: TestExecutionContext.dll


のようにコンテキストのタイプの設定とTestExecutionContext.dllのロードをするようにしています.



プログラムのソースを見てみます.




int TestExecutionContext::svc(void)
{
     
      static int i = 0;
     
      do{
            i++;
            std::cout << i << std::endl;
            std::for_each(m_comps.begin(), m_comps.end(), invoke_worker());
      }
     
      while (m_running);

   
    return 0;
}




今回のサンプルでは実行した回数を表示します.

あとはコンストラクタ,デストラクタしかないです.




あと,TestExecutionContextInitという関数を記述してます.

managerがTestExecutionContext.dllを読み込むと~Initという関数を探すようです.

~の部分はDLLの名前でしょうか?

ログを見た感じそうだと思ったんですが,よくわかりません.

あと,~Init関数の先頭にDLL_EXPORTを記述してください.


今回作成したサンプルは単純ですが,ExtTrigExecutionContextやArtExecutionContextもこれとほとんど同じであることがソースを読めばわかると思います.




次回は今回作成したサンプルをいぢくっていきたいと思います.


もしかしたら,RTMコンテストは実行コンテキスト出すかも.

アイデアがあればですけど.








にほんブログ村 科学ブログ ロボットへ
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・

人気ブログランキングへ
Yahoo!コミックでバキSAGAが50ページ立ち読みできるみたいですよ.

・・・うん,これはある意味18禁ですね.






いつもの記事の本筋とは一切関係ない前置きはおいといて,今回はTimedWString型を使ってみます.

これも使ってるRTCを見たことないんだよな.


今回のサンプルはここからダウンロードできます.

今回作ったサンプルはTestWStringOutコンポーネントとTestWStringコンポーネントです.


まずTestWStringOutですが,1つのアウトポート(TimedWString型)を持っており,適当な文字列を出力します.

TestWStringは1つのインポート(TimedWString型)と4つのアウトポート(TimedString型)を持っています.


前回のサンプルと同じく,インポートから入力された文字列を名詞,動詞,形容詞,形容動詞に分けます.

そして,名詞なら名詞のなかからランダムで選択した名詞をアウトポートからTimedString型で出力します.

他も同じです.

・・・まあ,サンプルなので役に立つかどうかは考えてません.

なぜTimedString型かというと,OpenHRIの音声合成コンポーネントと接続するためです.

OpenHRIを解説してるサイトもあるようです.



以下のように接続できます.

Wstring.PNG





TestWStringコンポーネントのアウトポートを繋ぎかえることで名詞か動詞か形容詞か形容動詞を発声させるかを決めれます.



今回作成したRTCのコードを見ていきます.


TestWStringOutコンポーネントのonExecute関数は以下のようになってます.


m_out.data = L"(省略)"  //データを書き込む
m_outOut.write();  //出力
return RTC::RTC_OK;


かなり簡単になりましたね.


続いてTestWStringコンポーネントのonExecute関数です.


setlocale( LC_ALL, "Japanese" );
   
if (m_inIn.isNew())
{
        m_inIn.read(); //データ読み込み
        std::wstring text = m_in.data; //データを取り出す
        std::wstring noun;
        std::wstring verb;
        std::wstring adjective;
        std::wstring na_adjective;

        getnoun(text,text.length(),&noun,&verb,&adjective,&na_adjective); //名詞,動詞,形容詞,形容動詞に分けてランダムで選択したものをそれぞれnoun,verb,adjective,na_adjectiveに格納
        std::wcout << text << std::endl; //入力データの表示

        BYTE* nounUtf8; //8ビットに変換した名詞の文字列
        UTF16utf8((BYTE*)noun.c_str(), &nounUtf8); //16ビットから8ビットに変換
        m_noun.data = (char*)nounUtf8; //データを書き込む
        m_nounOut.write(); //出力




以下略


となってます.

WStringを表示するときはstd::coutではなく,std::wcoutを使います.

OpenHRIはUTF-8でしか受け付けてくれないので,UTF-16から変換します.

コンフィグレーション・パラメータとかでUTF-8かShift-JISか選べたら便利だと思ったり思わなかったりですね.





今日はこのぐらいにしときます.

次回何やるかは未定です.

ExtendedDataTypes.idlとかInterfaceDataTypes.idl見ても,面白いデータ型はあるけど「これ絶対使わないだろ」ってのは見た感じないしなぁ.

コネクタの設定をいぢくってみるか,それともソースをいぢくってみるか,はたまたOpenRTM.NETに手を伸ばすか考え中です.








にほんブログ村 科学ブログ ロボットへ
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・

人気ブログランキングへ
グリーンピースは食べ物じゃないと思うんだ・・・・



それはさておき,今回はTimedWChar型を使ってみたいと思います.

この型を使ってるRTCを僕は見たことないんですけど,探したらあるんでしょうかね?



まず,C++のプログラミングでワイド文字は,

wchar_t ch[] = L"あいうえおabcd";

といった感じで使えます.

ワイド文字は1文字表現するのに2バイト使うので,全角文字も扱えるのが利点ですかね.

文字数を取り出すのも容易で,


wcslen(ch);


とするだけですし,ch[2]のように配列の番号を指定するだけで全角でも半角でも文字を取り出せます.



今回はTimedWChar型の可変長配列TimedWCharSeq型を使って,簡単な言語処理をするRTCを作成します.


サンプルはここからダウンロード出来ます.


今回作成したRTCはWcharTestOutとWcharTestInです.

WcharTestOutは1つのアウトポート(TimedWCharSeq)を持っており,適当な文字列を出力します.

WcharTestInは1つのインポート(TimedWCharSeq)を持っており,受け取った文字列を名詞,形容詞,動詞,形容動詞に分けて表示します.


はじめてのAIプログラミング―C言語で作る人工知能と人工無能(小高知宏著)では,簡単な方法として


名詞 → 漢字の並び
形容詞 → 漢字の並び + 「い」
動詞 → 漢字の並び + 「う」
形容動詞 → 漢字の並び + 「だ」


として取り出しています.


WcharTestOutのデータ出力をする部分は,


size_t len = wcslen(text); //文字数取得
m_out.data.length(len); //文字数文の長さを指定
for(int i=0;i < len;i++)
{
        m_out.data[i] = text[i]; //データを書き込む
}
m_outOut.write(); //出力


となっており,他のデータ型と同じです.


WcharTestInの入力データを処理する部分は,


RTC::ReturnCode_t WcharTestIn::onExecute(RTC::UniqueId ec_id)
{
    setlocale( LC_ALL, "Japanese" );
   
    if (m_inIn.isNew()) //データの入力があった場合
    {
        m_inIn.read(); //データ読み込み
        wchar_t *text = new wchar_t[m_in.data.length()];
        for(int i=0;i < m_in.data.length();i++)
        {
            text[i] = m_in.data[i]; //データを取り出す
        }
        getnoun(text,m_in.data.length()); //文字列textを読み込んで名詞,形容詞,動詞,形容動詞に分けて表示する関数
        printf("%S\n",text); //受信した文字列の表示
        delete text;
    }
  return RTC::RTC_OK;
}



となっています.

UTF-16についてはこのサイトに一覧表があるみたいです.






今日はここまでにしときます.

次回はTimedWString型で遊んでみます.











にほんブログ村 科学ブログ ロボットへ
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・

人気ブログランキングへ
俺,ブログ更新したら卒論発表のスライド作るんだ・・・・

と,死亡フラグに見せかけた現実逃避をしている今日この頃です.

昨日と今日で4回も更新したのはそのせいですからね.




それはさておき,今回はrtshellを使ってみます.

・・・とは言っても,OpenRTM-aistの公式HPにマニュアルがあるので,今回は僕の勉強です.

正直,youtubeのrtshellの解説動画を見た方が良いかも.
動画のパクリに近いし.



実はrtshellは一度も使ったことがないのですが,先日Ver.3.0.0が公開されたらしいので,ちょっと触ってみようかと思っただけですからね.


インストールされてない場合は,Python2.6,OpenRTM-aist-Python-1.0.0,rtctree,rtsprofile,rtcshellをインストールしてください.


あと,僕は環境変数のPathにC:\Python26とC:\Python26\Scriptsを設定したら動作しましたけど,実際どうやるのが正しいかは知りません.





それでは,rtshellを使ってみます.

その前にSeqOutCompとSeqInCompを起ち上げておきます.


そして,コマンドプロンプトから,


rtcwd localhost


と入力します.


ここで,


rtact SequenceInComponent0.rtc
rtact SequenceOutComponent0.rtc


と入力しただけでアクティブになりました.

簡単ですね.


ポートの接続も,


rtcon SequenceInComponent0.rtc:Short SequenceOutComponent0.rtc:Short


と入力するだけ.

切るのはrtdisでできるようです.


あと,


rtinject SequenceInComponent0.rtc:Short -c 'RTC::TimedShort({time},1)' -n 1


とかするだけでインポートにデータを入力できるみたいです.

RTSEにデータ入力のRTCが出てくるはずです.

後ろの -n 1 とかいうのは入力する回数みたいですかね,多分.


アウトポートのデータの表示は,


rtprint SequenceOutComponent0.rtc:Short -n 1


とするだけみたいですね.

これも,読み取りのRTCが生成されるみたいです.

これは普通に便利そうですね.

思ったよりrtshellは使い勝手が良さそうです.






今回はこのぐらいにしときます.

次回はRTCBuilderのリポジトリビューに触れておくか,それともあまり使わなそうなデータ型で遊んでみるか,はたまたコネクタの設定をいぢくってみるか迷ってる所です.











にほんブログ村 科学ブログ ロボットへ
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・

人気ブログランキングへ
&lt;&lt; 前のページ 次のページ &gt;&gt;
カレンダー
10 2024/11 12
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
フリーエリア
最新CM
[08/31 ysuga]
[08/31 Nobu]
[08/31 ysuga]
[12/11 Nobu]
[12/11 Kanamura]
最新TB
プロフィール
HN:
Nobu
年齢:
36
性別:
男性
誕生日:
1988/09/22
職業:
あれ
趣味:
妄想、自堕落
バーコード
ブログ内検索
P R
カウンター
忍者ブログ [PR]