ここでは、データポートを2つ持つコンポーネント (MRCConvertor) を VC8 にて作成します。
入力デバイスからのデータを車輪2つの速度に変換し、OutPort から出力するコンポーネント。
Joystick等の入力デバイスにて移動ロボット(前輪2、後輪1、前輪だけが駆動)を操作する際に、使用することができる。
作成する RTC の仕様は以下のとおりです。
RtcTemplate にて雛型を生成します。
適当な場所に作業用フォルダーを作成します。
今回は、フォルダー名をコンポーネント名 (MRCConvertor) と同じにします。
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
下記のように 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 での対応は下記のようになります。
RtcTemplate 実行により、copyprops.bat ファイルが作業用フォルダーに生成されます。
この copyprops.bat ファイルを用い、コンポーネントのビルドに必要な rtm_config.vsprops を作業フォルダーにコピーします。
copyprops.bat ファイルをダブルクリックしてください。
MRCConvertorComp_vc8.vcproj をダブルクリックし、Visual Studio を起動します。
Visual Studio のソリューションエクスプローラーにて、MRCConvertorComp > Header Files の順にクリックし、 MRCConvertor.h をダブルクリックします。
#include <vector> // VC8 にて Math::M_PI を使用するため #define _USE_MATH_DEFINES #include <math.h>
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 をダブルクリックします。
/*! * @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; }
ここで行われていることは、
Visual Studio のメニューから [ビルド] > [ソリューションのビルド] をクリックしコンポーネントのビルドを行います。
エディタにて以下の内容を記述し、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ネームサーバーを起動します。
Debug あるいは Release フォルダーに移動し、MRCConvertorComp.exe を実行します。