Help us understand the problem. What is going on with this article?

ROS2の単一ターゲット内での複数nodeの実行

ROS2関係トップページへ

ここでは単一ターゲット内で複数のノードを実行するプログラムの作成を行う.
Geoffrey BIGGS:ROS2のAPIの使い方にある図が分かりやすい.また公式のAPIのExecutorsの部分も参考に.

ここではROS2における共有ライブラリで作成した二つのノード(MinimalComp1とMinimalComp2)を用いてSingle threadおよびMulti threadのプログラムを作成する.

準備

terminal
$ 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

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

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.xml
<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

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が増えているが通常通り.

ビルド・実行

ビルド

terminal
$ cd ~/ros2_studies_ws/
$ colcon build --symlink-install --packages-select minimal_executor
$ . install/setup.bash

共有ライブラリがビルドしてあるものとする.まだしていなければ,--packages-selectに共有ライブラリのパッケージも一緒にしていしてやる.

実行

このプログラムでは,singleでもmultiでも結果は変わらないけど.

Single thread

terminal
$ cd ~/ros2_studies_ws/
$ . install/setup.bash
$ ros2 run minimal_executor minimal_exec_single

Multi thread

terminal
$ cd ~/ros2_studies_ws/
$ . install/setup.bash
$ ros2 run minimal_executor minimal_exec_multi
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした