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はインストール後に修正する必要があります。