ComposableNodeとは

DDSをかえさないでNode間通信をする

実行時の効率が上がる

たくさんのノードをComposableノードにまとめすぎると重くなるので注意が必要

component_containerよりcomponent_container_mt(マルチスレッドで実行するComposableノード)のほうが重くなる(foxyでの動作検証)

検証

イメージ図

ComposableNode.png

ComposableNode作成例

ディレクトリ

composable_node

include

composable_node

composable_node_component.hpp

src

composable_node_component.cpp

main.cpp

CMakeLists.txt

package.xml

composable_node_component.hpp


#include <rclcpp/rclcpp.hpp>
#include <regex>
		︙

namespace abu2023 {
using std::placeholders::_1;
using namespace std::chrono_literals;
class ComposableNode : public rclcpp::Node {
		︙
public:
  ComposableNode(const rclcpp::NodeOptions &options) : ComposableNode("", options) {}
  ComposableNode(const std::string &name_space = "", const rclcpp::NodeOptions &options = rclcpp::NodeOptions()) : Node("composable_node", name_space, options) {
		︙
  }
};
} // namespace abu2023

composable_node_component.cpp

#include <rclcpp/rclcpp.hpp>
#include <rclcpp_components/register_node_macro.hpp>
#include "composable_node/composable_node_component.hpp"

RCLCPP_COMPONENTS_REGISTER_NODE(abu2023::ComposableNode)

main.cpp

#include <rclcpp/rclcpp.hpp>
#include "composable_node/composable_node_component.hpp"

int main(int argc, char *argv[]) {
  rclcpp::init(argc, argv);
  rclcpp::spin(std::make_shared<abu2023::ComposableNode>());
  rclcpp::shutdown();
  return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.5)
project(composable_node)

if(NOT CMAKE_CXX_STANDARD)
  set(CMAKE_CXX_STANDARD 17)
endif()

if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  add_compile_options(-Wall -Wextra -Wpedantic)
endif()

# find dependencies
find_package(ament_cmake_auto REQUIRED)
ament_auto_find_build_dependencies()

#composableノード設定部分
ament_auto_add_library(${PROJECT_NAME}_component SHARED
  src/${PROJECT_NAME}_component.cpp)

rclcpp_components_register_nodes(${PROJECT_NAME}_component "abu2023::ComposableNode")
target_compile_options(${PROJECT_NAME}_component PUBLIC -Wall)

#実行ファイル設定
ament_auto_add_executable(${PROJECT_NAME}
  src/main.cpp
)

if(BUILD_TESTING)
  find_package(ament_lint_auto REQUIRED)
  ament_lint_auto_find_test_dependencies()
endif()

ament_auto_package()

launchファイルでの起動方法