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를 실행합니다.

ダウンロード

最新バージョン : 2.1.0-RELESE

統計

Webサイト統計
ユーザ数:3399
プロジェクト統計
RTコンポーネント309
RTミドルウエア35
ツール25
文書・仕様書2

OpenRTM@Github

OpenRTM-aist GitHubサイト

ROS

Robot Operating System

Choreonoid

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

DAQ-Middleware

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

産総研が提供するRTC集

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