RTコンポーネント作成(VC++編)

データポートのあるコンポーネント

ここでは、データポートを2つ持つコンポーネント(MRCConvertor)をVC8にて作成します。

コンポーネントの概要

入力デバイスからのデータを車輪2つの速度に変換し、OutPortから出力するコ ンポーネント。

Joystick等の入力デバイスにて移動ロボット(前輪2,後輪1,前輪だけが駆動)を 操作する際に、使用する事ができる。

作成するRTCの仕様は以下のとおりです。

  • InPort
    • 移動ロボットに対する速度(TimedFloatSeq)
  • OutPort
    • 移動ロボットの車輪の速度(TimedFloatSeq)

MRCConvertorの雛型を生成

RtcTemplateにて雛型を生成します。

作業用フォルダの作成

適当な場所に作業用フォルダを作成します。

今回は、フォルダ名をコンポーネント名(MRCConvertor)と同じにします。

  1. "マイコンピュータ"をダブルクリック
  2. 作業用フォルダを作成したいフォルダへ移動
  3. 右クリック -> 新規作成(W) -> フォルダ(F) でフォルダを作成

CUI版rtc-template編(gen.bat)

rtc-templateの実行を簡単にするために下記のようなバッチファイルを先程作 成した作業用フォルダに作成します。

 rtc-template.py -bcxx^
  --module-name=MRCConvertor --module-desc="Convertor component for MobileRobot component"^
  --module-version=1.0.0 --module-vendor=AIST --module-category=Category^
  --module-comp-type=DataFlowComponent --module-act-type=PERIODIC^
  --module-max-inst=1^
  --inport=velFromInput:TimedFloatSeq^
  --outport=velToWheel:TimedFloatSeq

rtc-template(gen.bat)の実行

下記のようにgen.batファイルを実行します。

 >gen.bat
  rtc-template.py -bcxx
  --module-name=MRCConvertor
  --module-desc="Convertor component for MobileRobot component"
  --module-version=1.0.0 --module-vendor=AIST
  --module-category=Category
  --module-comp-type=DataFlowComponent --module-act-type=PERIODIC
  --module-max-inst=1
  --inport=velFromInput:TimedFloatSeq --outport=velToWheel:TimedFloatSeq
   File "MRCConvertor.h" was generated.
   File "MRCConvertor.cpp" was generated.
   File "MRCConvertorComp.cpp" was generated.
   File "Makefile.MRCConvertor" was generated.
   File "MRCConvertorComp_vc8.vcproj" was generated.
   File "MRCConvertor_vc8.vcproj" was generated.
   File "MRCConvertorComp_vc9.vcproj" was generated.
   File "MRCConvertor_vc9.vcproj" was generated.
   File "MRCConvertor_vc8.sln" was generated.
   File "MRCConvertor_vc9.sln" was generated.
   File "copyprops.bat" was generated.
   File "user_config.vsprops" was generated.
   File "README.MRCConvertor" was generated.
   File "MRCConvertor.yaml" was generated.

Eclipse版RtcTemplate編

Eclipse版RtcTemplateでの対応は下記のようになります。

  • Programing language selection: C++
  • Module definition
    • Module name: MRCConvertor
    • Module decription: Convertor component for MobileRobot component
    • Module version: 1.0.0
    • Module vender: AIST
    • Module category: Category
    • Component type: DataFlowComponent
    • Component's activity type: PERIODIC
    • Number of maximum instance: 1
  • InPort definition
    • Ports: Name:velFromInput Type:TimedFloatSeq
  • OutPort definition
    • Ports: Name:velToWheel, Type:TimedFloatSeq

copyprops.batの実行

RtcTemplate実行により、copyprops.batファイルが作業用フォルダに生成され ます。

このcopyprops.batファイルを用い、コンポーネントのビルドに必要な rtm_config.vspropsを作業フォルダにコピーします。

copyprops.batファイルをダブルクリックして下さい。

MRCConvertorの実装

Visual Studioの起動

MRCConvertorComp_vc8.vcprojをダブルクリックし、Visual Studioを起動します。

ヘッダファイルの編集

Visual Studioのソリューションエクスプローラーにて、MRCConvertorComp -> Header Files の順にクリックし、 MRCConvertor.h をダブルクリックします。

  • ヘッダファイルのインクルード
    今回は、std::vectorとmathライブラリを使用しますので、2つのヘッダファイルをインクルードします。

 #include <vector>
 // VC8にてMath::M_PIを使用するため
 #define _USE_MATH_DEFINES
 #include <math.h>

  • "virtual RTC::ReturnCode_t onExecute(RTC::UniqueId ec_id);"関数のコメントをはずします。
  • メンバー変数とメソッドの宣言
    今回は、MobileRobot(前輪2,後輪1、前輪だけが駆動)の移動ベクトルを車輪速度に変換するためのメソッドconvert()、変換に必要な係数m_kを宣言します。

 private:  float m_k;
 
  /*!
   * @brief InPortからのデータ(X,Y)をMobileRobot用の車輪速度データに変換する。
   *        m_velFromInput.data[0]とm_velFromInput.data[1]だけを使用する。
   */
  std::vector<float> convert(float x, float y) {
    float th = atan2(y,x);
    float v  = m_k * hypot(x,y);
    std::vector<float> ret_val;
    ret_val.push_back(v * cos(th - (M_PI/4.0))); // left vel
    ret_val.push_back(v * sin(th - (M_PI/4.0))); // right vel
    return ret_val;
  }

ソースファイルの編集

Visual Studioのソリューションエクスプローラーにて、MRCConvertorComp -> Source Files の順にクリックし、 MRCConvertor.cpp をダブルクリックしま す。

  • onExecute()の実装
    onExecute()のコメントをはずし、以下のように実装します。

 /*!
  * @brief InPortからのデータ(X,Y)をMobileRobot用の車輪速度データに変換し、
  *        OutPortから出力する。
  */
 RTC::ReturnCode_t MRCConvertor::onExecute(RTC::UniqueId ec_id)
 {
   if (m_velFromInputIn.isNew()) {
     m_velFromInputIn.read();
     if (m_velFromInput.data.length() > 2) {
       std::vector<float>  con_val = this->convert(m_velFromInput.data[0],m_velFromInput.data[1]);
       for (int i = 0; i < 2; i++)
         m_velToWheel.data[i] = con_val[i];
       m_velToWheelOut.write();
     }
   }
   return RTC::RTC_OK;
 }

ここで行われていることは、

  1. m_velFromInputIn.isNew()にてInPortにデータが届いているかをチェックす る。
  2. 新しいデータが届いていたら、m_velFromInputIn.read()で変数にデータを 読み込む。
  3. 読み込んだデータをconvert()にて車輪速度に変換する。
  4. 変換したデータをOutPortの変数にセットし、OutPortのバッファに書き込む。

ビルド

Visual Studioのメニューから"ビルド(B)" -> "ソリューションのビルド(B)" をクリックしコンポーネントのビルドを行います。

rtc.confの作成

エディタにて以下の内容を記述し、rtc.confというファイル名でDebugあるい はReleaseフォルダに保存します。

 corba.nameservers: localhost
 naming.formats: %n.rtc

実行

ビルドにてエラーが無かった場合、DebugあるいはReleaseフォルダにrtc.conf を作成し、MRCConvertorComp.exeを実行します。

MRCConvertorComp.exeを実行する前にNamingServiceを起動してください。

ネームサーバーの起動

<OpenRTM-aistインストールフォルダ>\bin\rtm-naming.batをダブルクリック しCORBAネームサーバーを起動します。

MRCConvertorComp.exeの実行

DebugあるいはReleaseフォルダに移動し、MRCConvertorComp.exeを実行します。

最新バージョン

初めての方へ

Windows msi(インストーラ) パッケージ (サンプルの実行ができます。)

C++,Python,Java,
Toolsを含む
1.1.2-RELEASE

RTコンポーネントを開発するためには開発環境のインストールが必要です。詳細はダウンロードページ

統計

Webサイト統計
ユーザ数:1604
プロジェクト統計
RTコンポーネント286
RTミドルウエア21
ツール20
文書・仕様書1

OpenHRP3

動力学シミュレータ

Choreonoid

モーションエディタ/シミュレータ

OpenHRI

対話制御コンポーネント群

OpenRTP

統合開発プラットフォーム

産総研RTC集

産総研が提供するRTC集

TORK

東京オープンソースロボティクス協会

DAQ-Middleware

ネットワーク分散環境でデータ収集用ソフトウェアを容易に構築するためのソフトウェア・フレームワーク

VirCA

遠隔空間同士を接続し、実験を行うことが可能な仮想空間プラットホーム