ここでは単一ターゲット内で複数のノードを実行するプログラムの作成を行う.
Geoffrey BIGGS:ROS2のAPIの使い方にある図が分かりやすい.また公式のAPIのExecutorsの部分も参考に.
ここではROS2における共有ライブラリで作成した二つのノード(MinimalComp1とMinimalComp2)を用いてSingle threadおよびMulti threadのプログラムを作成する.
準備
$ cd ~/ros2_studies_ws/
$ ros2 pkg create minimal_executor
Single/Multi threadのプロジェクト
作成物:github.com
- src/single_main.cpp
- src/multi_main.cpp
プログラム:single_main.cpp
#include <rclcpp/rclcpp.hpp>
#include "minimal_comp/minimal_comp_node1.hpp"
#include "minimal_comp/minimal_comp_node2.hpp"
int main(int argc, char * argv[]){
rclcpp::init(argc,argv);
rclcpp::executors::SingleThreadedExecutor exec;
auto node1 = std::make_shared<minimal_comp::MinimalCompNode1>();
exec.add_node(node1);
auto node2 = std::make_shared<minimal_comp::MinimalCompNode2>();
exec.add_node(node2);
exec.spin();
rclcpp::shutdown();
return 0;
}
概要
rclcpp::executorsが実行をコントロールするもの.今回はsingle threadなのでSingleThreadedExecutor型.
複数のノードを作成し,add_nodeで登録し,最後にspin関数を呼び出す.
プログラム:multi_main.cpp
#include <rclcpp/rclcpp.hpp>
#include "minimal_comp/minimal_comp_node1.hpp"
#include "minimal_comp/minimal_comp_node2.hpp"
int main(int argc, char * argv[]){
rclcpp::init(argc,argv);
rclcpp::executors::MultiThreadedExecutor exec;
auto node1 = std::make_shared<minimal_comp::MinimalCompNode1>();
exec.add_node(node1);
auto node2 = std::make_shared<minimal_comp::MinimalCompNode2>();
exec.add_node(node2);
exec.spin();
rclcpp::shutdown();
return 0;
}
概要
single threadと同じ.multi threadの場合,MultiThreadedExecutor型となる.
package.xmlとCMakeLists.txt
普通のROS2と同じ.
ここでは共有ライブラリを使用しているので,その記述部分が増えている.
追加部分のみ抜粋.
package.xml
ここでpackage format=3になっているが,編集した記憶なし.
dashingからros2 pkg createで作成する時のデフォルトが3になったのかな?
<package format="3">
<build_depend>rclcpp</build_depend>
<exec_depend>rclcpp</exec_depend>
<test_depend>rclcpp</test_depend>
<build_depend>minimal_comp</build_depend>
<exec_depend>minimal_comp</exec_depend>
<test_depend>minimal_comp</test_depend>
CMakeLists.txt
find_package(rclcpp REQUIRED)
find_package(minimal_comp REQUIRED)
add_executable(minimal_exec_single
src/single_main.cpp
)
ament_target_dependencies(minimal_exec_single
rclcpp
minimal_comp
)
target_include_directories(minimal_exec_single
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
add_executable(minimal_exec_multi
src/multi_main.cpp
)
ament_target_dependencies(minimal_exec_multi
rclcpp
minimal_comp
)
target_include_directories(minimal_exec_multi
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
install(TARGETS
minimal_exec_single
minimal_exec_multi
DESTINATION lib/${PROJECT_NAME}
)
概要
共有ライブラリ使用のためのtarget_include_directoriesが増えているが通常通り.
ビルド・実行
ビルド
$ cd ~/ros2_studies_ws/
$ colcon build --symlink-install --packages-select minimal_executor
$ . install/setup.bash
共有ライブラリがビルドしてあるものとする.まだしていなければ,--packages-selectに共有ライブラリのパッケージも一緒にしていしてやる.
実行
このプログラムでは,singleでもmultiでも結果は変わらないけど.
Single thread
$ cd ~/ros2_studies_ws/
$ . install/setup.bash
$ ros2 run minimal_executor minimal_exec_single
Multi thread
$ cd ~/ros2_studies_ws/
$ . install/setup.bash
$ ros2 run minimal_executor minimal_exec_multi