【前:ROS2における共有ライブラリ】
【次:ROS2におけるコンポーネント】
ROS2における共有ライブラリで作成した共有ライブラリを使用する方法について.
他のROS2プログラムとの違いは,CMakeLists.txtでtarget_include_directoriesを使うことのみ.
準備
$ cd ~/ros2_studies_ws/
$ ros2 pkg create minimal_comp_user --build-type ament_cmake --dependencies rclcpp minimal_comp
ROS2における共有ライブラリで作成したパッケージ:minimal_compを使用するため,dependenciesに追加.
共有ライブラリを使用したプログラム
- src/minimal_comp_user_main.cpp
プログラム
#include <rclcpp/rclcpp.hpp>
#include "minimal_comp/minimal_comp_node2.hpp"
int main(int argc, char * argv[]){
rclcpp::init(argc,argv);
rclcpp::spin(std::make_shared<minimal_comp::MinimalCompNode2>());
rclcpp::shutdown();
return 0;
}
概要
共有ライブラリのMinimalCompNode2を呼び出している.
パッケージ名をnamespaceにしていたので呼び出しは6行目のようにminimal_comp::MinimalCompNode2となる.
package.xmlとCMakeLists.txt
関係する部分のみ抜粋.
package.xml
<package format="3">
<depend>rclcpp</depend>
<depend>minimal_comp</depend>
説明
rclcppパッケージとともに共有ライブラリのパッケージ(minimal_comp)を記述.
CMakeLists.txt
find_package(rclcpp REQUIRED)
find_package(minimal_comp REQUIRED)
add_executable(minimal_comp_user
src/minimal_comp_user_main.cpp
)
ament_target_dependencies(minimal_comp_user
rclcpp
minimal_comp
)
target_include_directories(minimal_comp_user
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
install(TARGETS
minimal_comp_user
DESTINATION lib/${PROJECT_NAME}
)
概要
他のROS2と基本的に同じで,パッケージを見つけるfind_packageやターゲットと必要となるソースファイルの指定,インストール先などを記述.
共有ライブラリを使用する上で必要となるものがtarget_include_directoriesとなる.
説明
共有ライブラリなど自分のパッケージディレクトリにない外部のヘッダファイルにアクセスするために12~16行目が必要となる.
12行目に今回作成するターゲット名を書く.13~16行目は他でも同じ書き方になるのでコピペ.
ビルド・実行
ビルド
$ cd ~/ros2_studies_ws/
$ colcon build --symlink-install --packages-up-to minimal_comp_user
$ . install/setup.bash
共有ライブラリがビルドしてあるものとする.まだしていなければ,--packages-up-toに共有ライブラリのパッケージも一緒にしていしてやる.
実行
$ cd ~/ros2_studies_ws/
$ . install/setup.bash
$ ros2 run minimal_comp_user minimal_comp_user
共有ライブラリと作成プログラムが同一パッケージの場合
ここでは共有ライブラリとROS2プログラムが異なるパッケージの場合を作成した.
この時,共有ライブラリのパッケージ(minimal_comp)をfind_packageで指定し,ament_target_dependenciesでminimal_compを指定した.
共有ライブラリとROS2プログラムが同一パッケージの場合は,find_packageを書く必要がなく(自身のパッケージ名だから書けない),ament_target_dependenciesではライブラリ名(add_libraryの名前)を指定すればよい. 共有ライブラリ分だけtarget_link_librariesに書く(その他のrclcppなどはament_target_dependenciesに書く).例えば以下の通り.
target_link_libraries(hoge
fuge # 同一パッケージの共有ライブラリ名(add_libraryの名前)
)
ament_target_dependencies(hoge
rclcpp
)
公式githubの共有ライブラリにかかわるexmapleのCMakeLists.txtが参考になる.