ROS2 (intra process communication 3)

ROS2のnodeのあいだの通信を無くします。

C++でintra process communicationを実現させる方法を一通りやります。

(Pythonでintra process communicationを実現させる計画もあるようです。)

既存のnodeをcomposableにする説明から学ぶ

Writing a Composable Node (C++)

package.xml

package.xmlに下記を追記しろ。

<depend>rclcpp_components</depend>

.cppの書き方

とにかく下記を参考にして書きましょう。
constructorとfile末尾の2行のおまじない。
file末尾の2行のおまじないはmain関数を無くしてただの関数の集まりを作るため。

demos/composition/src/talker_component.cpp

勿論.hppも見ておかないと。

demos/composition/include/composition/talker_component.hpp

下記でstructで書いてるけど上記は普通にclassで書いてる。public:すら書きたくなかったってこと ?

Setting up efficient intra-process communication

ここまでのまとめ

それぞれの記事のあいだで差分が多い。ぐちゃぐちゃだなあ。

constructorでrclcpp::NodeOptions().use_intra_process_comms(true)を指定しないでoptionsを渡すようにしているのは下記みたいなinterfaceにしておいた方が良いからだと思います。

でも実装例がintra process communication決め打ちなので価値が分かりにくい。

demos/composition/src/manual_composition.cpp

どこの国の人が書いたんだろう。出来る奴だけ出来ればいいという国もあると聞くし。

CMakeLists.txt

下記を追記。

find_package(rclcpp_components REQUIRED)

add_executableをadd_libraryに変更。SHAREDが無い。

add_library(vincent_driver_component src/vincent_driver.cpp)

before

ament_target_dependencies(vincent_driver ...)

after

ament_target_dependencies(vincent_driver_component ...)

下記を追記。

rclcpp_components_register_node(
  vincent_driver_component
  PLUGIN "palomino::VincentDriver"
  EXECUTABLE vincent_driver
)

下記を追記。

ament_export_targets(export_vincent_driver_component)
install(TARGETS vincent_driver_component
        EXPORT export_vincent_driver_component
        ARCHIVE DESTINATION lib
        LIBRARY DESTINATION lib
        RUNTIME DESTINATION bin
)

launch.py

before

from launch_ros.actions import Node

# ..

ld.add_action(Node(
    package='palomino',
    executable='vincent_driver',
    # ..
))

after

from launch_ros.actions import ComposableNodeContainer
from launch_ros.descriptions import ComposableNode

# ..
ld.add_action(ComposableNodeContainer(
    name='a_buncha_nodes',
    namespace='',
    package='rclcpp_components',
    executable='component_container',
    composable_node_descriptions=[
        ComposableNode(
            package='palomino',
            plugin='palomino::VincentDriver',
            name='vincent_driver',
            # ..
            extra_arguments=[{'use_intra_process_comms': True}],
        ),
    ]
))

component_containerをcomponent_container_mtとするとmulti-threadingになります。

広告

IT開発関連書とビジネス書が豊富な翔泳社の通販『SEshop』
さくらのレンタルサーバ
ムームードメイン
Oisix(おいしっくす)
らでぃっしゅぼーや
珈琲きゃろっと
エプソムソルト




«       »