実装例
下記の例では,ROS2のパラメータ記述に関するクラス(ROS2 メッセージ)を,提供されているBuilderパターンを使って実装した例
#include <rclcpp/rclcpp.hpp>
#include <rcl_interfaces/msg/parameter_descriptor.hpp>
#include <rcl_interfaces/msg/floating_point_range.hpp>
#include <rcl_interfaces/msg/integer_range.hpp>
// ...
node->declare_parameter(
"sigma_x",
1.0,
rcl_interfaces::build<rcl_interfaces::msg::ParameterDescriptor>()
.name("sigma_x")
.type(rcl_interfaces::msg::ParameterType::PARAMETER_DOUBLE)
.description("The sigma of gaussian in x axis")
.additional_constraints("")
.read_only(false)
.dynamic_typing(true)
.floating_point_range(
rosidl_runtime_cpp::BoundedVector<rcl_interfaces::msg::FloatingPointRange, 1>(
{
rcl_interfaces::build<rcl_interfaces::msg::FloatingPointRange>()
.from_value(1.0)
.to_value(100.0)
.step(0.001)
}))
.integer_range(
rosidl_runtime_cpp::BoundedVector<rcl_interfaces::msg::IntegerRange, 1>()));
普通にやるときとの違い
普通とは? 下記のような感じ
rcl_interfaces::msg::ParameterDescriptor param_desc;
param_desc.name = "sigma_x";
param_desc.type = rcl_interfaces::msg::ParameterType::PARAMETER_DOUBLE;
param_desc.description = "The sigma of gaussian inn x axis";
param_desc.additional_constraints = "";
param_desc.read_only = false;
param_desc.dynamic_typoing = true;
rcl_interfaces::msg::FloatingPointRange fpr;
fpr.from_value = 1.0;
fpr.to_value = 100.0;
fpr.step = 0.001;
param_desc.floating_point_range = { fpr };
ROS2の...builder.hppで提供されるBuilderパターンを用いる場合は:
- すべてのプロパティの値を明示的に書かなければならない(すべてをコードで示す)
- 実装例にあるような,rcl_interfaces::msg::ParameterDescriptorにはデフォルト値があるため,普通のやり方で書く場合は,変更不要なプロパティには触らなくても良い
- param_descを宣言した時点で設定される値があるので,その値が求める値なら省略してもよい
- ROS2メッセージの...builder.hppでは,すべてのプロパティについて値を設定しながらメッセージを構築する仕様であるため,省略ができない
- 実装例にあるような,rcl_interfaces::msg::ParameterDescriptorにはデフォルト値があるため,普通のやり方で書く場合は,変更不要なプロパティには触らなくても良い
- Builderパターンを使うと,行数が多くなりがちではあるが,バージョン変更に伴うデフォルト値の変更の影響を受けなかったり,すべてが明示されるためプロパティの制約を把握しやすいなどのメリットはあると思う
- プロパティそのもの存在がなかったことになったり,追加されたりした場合はその限りではない
- 個人的には人に依るさじ加減が入る余地がないので好き
注意すべきこと
- 含まれるbuiltinではないメッセージ型のヘッダはincludeすること