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(おいしっくす)
らでぃっしゅぼーや
珈琲きゃろっと
エプソムソルト