ROS2のトピック通信、サービス通信、アクションのテンプレートプログラム
- ROS2のトピック通信、サービス通信、アクションのテンプレートプログラム
- Launchファイル
- カスタムメッセージやサービス
※ 同じCMakeプロジェクトでrosidl_generate_interfaces
とament_python_install_package
を呼び出すとうまくいきません。
※ メッセージの生成は別のパッケージに分離するのがベストプラクティスです。
std_msgs/String型のmessageをtopic通信
$ ros2 launch ros2_template_programs topic_template_launch.xml
ros2_template_programs/launch/topic_template_launch.xml
ros2_template_programs/include/ros2_template_programs/topic_publisher_template.hpp
ros2_template_programs/src/topic_publisher_template.cpp
ros2_template_programs/include/ros2_template_programs/topic_subscriber_template.hpp
ros2_template_programs/src/topic_subscriber_template.cpp
$ ros2 launch ros2_template_programs topic_template_py_launch.xml
ros2_template_programs/launch/topic_template_py_launch.xml
ros2_template_programs/scripts/topic_publisher_template.py
ros2_template_programs/scripts/topic_subscriber_template.py
計算式を送り,計算結果を返すサービス通信
$ ros2 launch ros2_template_programs service_template_launch.xml
ros2_template_programs/launch/service_template_launch.xml
ros2_template_programs/include/ros2_template_programs/service_client_template.hpp
ros2_template_programs/src/service_client_template.cpp
ros2_template_programs/include/ros2_template_programs/service_server_template.hpp
ros2_template_programs/src/service_server_template.cpp
- コールバック関数からサービスを呼び出そうとすると,
rclcpp::spin_until_future_complete(this->get_node_base_interface(), future)
でスタックします - これは,サービスの処理よりも早くコールバック関数が呼ばれる可能性があるからです
- そこで新たに
callbackRresponse関数
を用意して,そこで結果を読み取ることで解決します
$ ros2 launch ros2_template_programs service_client_from_callback_template_launch.xml
ros2_template_programs/launch/service_client_from_callback_template_launch.xml
ros2_template_programs/include/ros2_template_programs/service_client_from_callback_template.hpp
ros2_template_programs/src/service_client_from_callback_template.cpp
- この問題は,Callback Groupsでも解決できます
$ ros2 launch ros2_template_programs service_client_callback_group_template_launch.xml
ros2_template_programs/launch/service_client_callback_group_template_launch.xml
ros2_template_programs/include/ros2_template_programs/service_client_callback_group_template.hpp
ros2_template_programs/src/service_client_callback_group_template.cpp
$ ros2 launch ros2_template_programs service_template_py_launch.xml
ros2_template_programs/launch/service_template_py_launch.xml
ros2_template_programs/scripts/service_client_template.py
ros2_template_programs/scripts/service_server_template.py
- コールバック関数からサービスを呼び出そうとすると,
rclpy.spin_until_future_complete(self, future)
でスタックします - これは,サービスの処理よりも早くコールバック関数が呼ばれる可能性があるからです
- そこで新たに
spin関数
を用意して,そこで結果を読み取ることで解決します
$ ros2 launch ros2_template_programs service_client_from_callback_template_py_launch.xml
ros2_template_programs/launch/service_client_from_callback_template_py_launch.xml
ros2_template_programs/scripts/service_client_from_callback_template.py
- Callback Groupsでも解決できるそう
$ ros2 launch ros2_template_programs service_client_callback_group_template_py_launch.xml
ros2_template_programs/launch/service_client_callback_group_template_py_launch.xml
ros2_template_programs/scripts/service_client_callback_group_template.py
指定した時間だけ待機するアクション
$ ros2 launch ros2_template_programs action_template_launch.xml
ros2_template_programs/launch/action_template_launch.xml
ros2_template_programs/src/action_client_template.cpp
ros2_template_programs/src/action_server_template.cpp
$ ros2 launch ros2_template_programs action_template_py_launch.xml
ros2_template_programs/launch/action_template_py_launch.xml
ros2_template_programs/scripts/action_client_template.py
ros2_template_programs/scripts/action_server_template.py
std_msgs/String型のmessageをゼロコピーでtopic通信
ros2_template_programs/launch/topic_component_template_launch.xml
ros2_template_programs/launch/topic_component_template.launch.py
ros2_template_programs/include/ros2_template_programs/topic_publisher_component_template.hpp
ros2_template_programs/src/topic_publisher_component_template.cpp
ros2_template_programs/include/ros2_template_programs/topic_subscriber_component_template.hpp
ros2_template_programs/src/topic_subscriber_component_template.cpp
$ ros2 launch ros2_template_programs topic_component_template_launch.xml
or
$ ros2 launch ros2_template_programs topic_component_template.launch.py
動的パラメータ設定機能
ros2_template_programs\launch\dynamic_reconfigure_template_launch.xml
ros2_template_programs\include\ros2_template_programs\dynamic_reconfigure_template.hpp
ros2_template_programs\src\dynamic_reconfigure_template.cpp
ros2_template_programs\config\param\dynamic_reconfigure_template_params.yaml
$ ros2 launch ros2_template_programs dynamic_reconfigure_template_launch.xml
※rqt_reconfigureでパラメータが表示されない場合は、Refreshボタンをクリック
# ament_cmake
$ ros2 pkg create package_name --build-type ament_cmake --dependencies rclcpp rclpy std_msgs
# ament_python
$ ros2 pkg create package_name --build-type ament_python --dependencies rclcpp rclpy std_msgs
# 全パッケージのビルド
$ colcon build
# 指定パッケージのビルド
$ colcon build --symlink-install --packages-up-to package_name
--symlink-install
- 可能な限りリンクを使用して2重にファイルをつくらない?
--packages-up-to [package1 package2 ...]
- 指定されたパッケージとそれに依存関係のあるパッケージのみをビルドする.
- 複数指定する場合にはスペース区切りとする.
- Writing a simple publisher and subscriber (C++)
- Writing a simple publisher and subscriber (Python)
- ROS2プログラミング入門 #8 ノードをクラスにする
- Writing a simple service and client (C++)
- Writing a simple service and client (Python)
- ROS2の最小構成service/client:初級 -class style-
- Using parameters in a class (Python)
- ROS2でyamlファイルからパラメータを設定する。
- ROS のDynamic Reconfigureの機能をROS 2に移行する
- ROS2でyamlファイルからパラメータを設定する。
- ROS2講座17 parameterを使う2
- YAMLファイルによるROS2のパラメータ設定
- https://roboticsbackend.com/ros2-yaml-params/
- Creating a launch file
- ROS 2 EloquentのXML記法を使ったLaunchシステム
- ROS 2のcomposable nodeを含むlaunchをPythonからXMLに置き換える(Humble)