C++によるRTCの実装
Simple Wiki Based Contents Management System
ソフトウェア関連 >> OpenRTM-aist のRTC開発システム(Yarbs) >> RTCの実装 >> C++によるRTCの実装

C++によるRTCの実装

RTCの仕様であるYAML形式のファイルからC++のプログラムを生成します。
このページでは、C++の実装コードを生成するための手順を説明します。この手順に従った具体的なサンプルコードは、下のリンクで説明していきます。

genRtcCppによるひな形作成

まず、YarbsではC++の実装コードを生成するために、このgenRtcCpp.exeというコマンドを使用します。このコマンドは、Python3で実装されていますので、起動時にエラーが出るようであれば、環境変数PYTHON_EXEに適切なpython.exeが設定されていないと思います。
では、ワークスペースに移動後、ひな形コードを作成します。RTCの仕様を記述したYAMLファイルを rtc_spec.yaml すると下記のコマンドを実行します。
 > genRtcCpp rtc_spec.yaml
これにより下のようなファイルが生成されます。(nameは sampleとします)
   sample
     +-idl
     +-include
       +-sample.h
     +-src
       +-sample.cpp
       +-sampleComp.cpp
     +-CMakeLists.txt
上記はサービスポートがない場合ですが、サービスポートが設定されると idl/service.idl, include/service_impl.h, src/service_impl.cpp が追加されます。

実装コードへロジックを追加

生成されたひな形は、このままでもVC++でコンパイル可能ですが、コアロジックをひな形に追加していきます。
ひな形に追加する部分は、.h, .cppのコードの場合は、
 //---< onInitialize

 //--->
のように ''コメントシンボル(// or #)'' + ''---'' + ''< '' + ''ID'' と ''コメントシンボル(// or #)'' + ''---'' + ''>'' に挟まれた部分に書き込んでください。
この部分は、RTCの仕様変更後にgenRtcCpp.exeを実行した後でもそのまま保持されます。
通常、データポートのみのRTCの場合には、sample.h, sample.cppの修正を行い、外部ライブラリを使用する場合には、CMakeLists.txtに追加してください。
CMakeLists.txtは、RtcBuilderで生成されるものと大きく異なります。CMakeLists.txtのテンプレートを下に示します。
#
#
#
cmake_minimum_required(VERSION 3.0.2)
cmake_policy(SET CMP0077 NEW)

project(@ProjectName@)

option(STATIC_LIBS "Build static libraries" OFF)
option(INSTALL_LOCAL "Install local directory" OFF)

string(TOLOWER ${PROJECT_NAME} PROJECT_NAME_LOWER)
set(PROJECT_VERSION 2.0.0 CACHE STRING "@ProjectName@ version")
set(PROJECT_TYPE "c++/@category@")

find_package(OpenRTM-aist REQUIRED)

# Add an "uninstall" target
AddUninstallTarget()

if (INSTALL_LOCAL)
  get_filename_component(CMAKE_INSTALL_PREFIX "${CMAKE_CURRENT_LIST_DIR}/../Components" ABSOLUTE)
endif()
RewriteBuildOptions()

##############
#  Build
##############
#
#  Addtional IDL files
add_idl_files(
@service_idl@
#---< idl_files
#--->
)
#  compile IDL file
compile_idl_files()

#
#
set(rtc_headers
@service_impl_h@
  include/@ProjectName@.h
#---< header_files
#--->
)

set(rtc_srcs
@service_impl_cpp@
  src/@ProjectName@.cpp
#---< src_files
#--->
)

set(rtc_exec_src src/@ProjectName@Comp.cpp)

include_directories(
  ${PROJECT_SOURCE_DIR}/include
  ${PROJECT_BINARY_DIR}
  ${OPENRTM_INCLUDE_DIRS}
)

add_definitions(${OPENRTM_CFLAGS})
link_directories(${OPENRTM_LIBRARY_DIRS})

#############
#  3rdPary Libs
#find_package(libsndfile REQUIRED)
#include_directories(${SNDFILE_INCLUDE_DIR})
#set(OPTION_LIBRARIES ${SNDFILE_LIBRARIES})
#---< third_party
#--->
set(OPTION_LIBRARIES)

#############
#  RTC
set(RTC_SOURCES ${rtc_srcs} ${rtc_headers} ${ALL_IDL_SRCS})
set(RTC_EXEC_SOURCES  ${rtc_exec_src} ${RTC_SOURCES})
#ste(UTF_8 True)

#
#  Dynamic local library
add_rtc_library(${PROJECT_NAME} ${RTC_SOURCES})

#
# Standalone executable
add_rtc_executable(${PROJECT_NAME}Comp ${RTC_EXEC_SOURCES})

#############
# Install
#############
message("--- INSTALL_PREFIX:${CMAKE_INSTALL_PREFIX}")
install(TARGETS ${PROJECT_NAME} ${PROJECT_NAME}Comp
    EXPORT ${PROJECT_NAME}
    RUNTIME DESTINATION ${PROJECT_NAME} COMPONENT componenet
#    LIBRARY DESTINATION lib COMPONENT componenet
#    ARCHIVE DESTINATION lib COMPONENT componenet
  )

gen_setup_bat()
install(FILES ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/setup.bat DESTINATION ${PROJECT_NAME})

#
#  install 3rdpary runtime libraries
#install(FILES ${SNDFILE_RUNTIME} DESTINATION bin)
####################
# Package creation
# By default, do not warn when built on machines using only VS Express:
#CreatePackageCPack()
genRtcCppコマンドで生成されるCMakeLists.txtは、1つに集約されており、 find_package(OpenRTM-aist) によって、VC++でビルドするための変数、マクロなどが読み込まれます。それぞれのマクロ定義の説明は省略しますが、個別の設定は、''#---< XXX''と''#--->''に挟まれた部分に記載することで十分だと思います。

RTCのビルド

RTCの実装が終了すれば、最後にVC++でのコンパイルを行います。OpenRTM-aistではcmakeを使っていますので、ソリューションの生成やコンパイラの起動などもcmake経由で行います。
Yarbsの場合には、rtc_make.batというバッチファイル経由で行うと簡単にビルド&インストールを行うことができます。rtc_make.batの書式は、下のようになっています。
  > rtc_make.bat [--vs2010|--vs2012|--vs2013|--vs2015|--vs2017] [--install] [--x86] [--nobuild] [--rtm_xxx] RTC名 [option]
Visual Studio 2019 64ビットでビルドする場合には、ほぼオプションは必要ありません。上記の書式でそれぞれのオプションの意味は以下の通りです。
[--vs2010,--vs2012,-vs2013,--vs2015,--vs2017]
ビルドに使用するVisual Studioのバージョンを指定
[--install]
バイナリをビルド後にインストールを行う。
[--x86]
32ビットバージョンでビルドする
[--nobuild]
ソリューションの生成のみを実行し、ビルドしない
[--rtm_xxx]
OpenRTM-aistのバージョンを指定する。デフォルトは、ver.1.2.1
生成されたRTCのインストール先は、RTC_PKG_PATHで指定したディレクトリまたはRTM_ROOT\Componentsの下のディレクトリ、または -DCMAKE_INSTALL_PREFIX=XXXX で指定したディレクトリになります。
Yarbsでは、C++のRTCのビルド時にsetup.batというファイルを生成します。このファイルは、ビルドしたときの環境変数を保存しますので、実行する前に読み込めば必要なPATHの設定を行うことができます。ただし、現在のバージョンでは、外部の動的リンクライブラリへのPATHはインストール後に修正する必要があります。