ROS2のparameter概要

【[ROS2関係トップページへ](https://qiita.com/NeK/items/7ac0f4ec10d51dbca084)】
【[ROS2レクチャー:初級 -ROS1 style-](https://qiita.com/NeK/items/74e4bb9d1530e22a63fc)】
【[ROS2レクチャー:初級 -class style-](https://qiita.com/NeK/items/14db31ff784a0bfafe3d)】

【前:[ROS2の最小構成service/client:初級 -ROS1 style-]】
【前:[ROS2の最小構成service/client:初級 -class style-]】
【次:[ROS2の最小構成parameter:初級 -ROS1 style-]】
【次:[ROS2の最小構成parameter:初級 -class type-]】

[ROS2の最小構成service/client:初級 -ROS1 style-]:https://qiita.com/NeK/items/bcc938a05a871afe17b0
[ROS2の最小構成service/client:初級 -class style-]:https://qiita.com/NeK/items/9d15487d4853638394a3
[ROS2の最小構成parameter:初級 -ROS1 style-]:https://qiita.com/NeK/items/8206a39a7a2077ef8e4a
[ROS2の最小構成parameter:初級 -class type-]:https://qiita.com/NeK/items/c7710827c1676487473a

ROS2ではあまり変動しない変数をparameterとして持つことができる．ROSでは中心的なパラメータサーバが存在したが，ROS2では各ノードが各自parameterを持つことになる．

# service側とclient側
各ノードが各自parameterを持つことになるので，他のノードから自分のparameterにアクセスされることも頻繁におこる．serviceとはなにか機能を提供する側であり，clientはserviceにお願い(リクエスト)して提供される機能を享受する側である．よって他のノード=client(あるノードのパラメータの値を享受するので)となるが，実は自分=service(自分のノードのパラメータを提供する側)になるとは限らない．というのは，自分のparameterにclientとしてアクセスすることも考えらるからである．お店をservice(品物を提供する側)，お客さんをclient(品物を提供してもらう側・買う側)とすると，店主は自分のお店のものをお店の一員として扱うこともできる(店主=service)が，自分のお店のものであっても自分で使うからお客として購入することもできる(店主=client)．
ROS2の機能で説明するために，以下ではget_parameters関数を例にとる．

* get_parameters({"foo","bar"});
    * 引数として，パラメータの名前の動的配列(vector)を渡すと値の動的配列が返ってくる

## service側
パラメータを宣言し，自身のパラメータを使用するモノである．
その「モノ」はノードであるのでノードが持つパラメータアクセス関数を使用する．

### 例1

```c++
auto node = rclcpp::Node::make_shared("param_service_node");
...
auto res = node->get_parameters({"foo","bar"});
```

### 例2

```c++
class ParamServiceNode : public rclcpp::Node{
public:
  ParamServiceNode(...):Node("param_service_node",...){
    auto = this->get_parameters({"foo","bar"});
  }
};

```

## client側
service側のノードに接続し，パラメータを使用するモノである．
その「モノ」はROS2が提供する機能としての「client」である．
以下の例はservice側のノード名を"param_service_node"としているが，その部分を自分の名前(例では"test")にすると『自分のパラメータにclientとしてアクセスしている」ことになる．

### 例1

```c++
auto node = rclcpp::Node::make_shared("test");
auto param_client = std::make_shared<rclcpp::SyncParametersClient>(node, "param_service_node");
...
auto res = param_client->get_parameters({"foo","bar");
```

### 例2

```c++
class Test : public rclcpp::Node{
public:
  ParamServiceNode(...):Node("test",...){
    _param_client = std::make_shared<rclcpp::SyncParametersClient>(node, "param_service_node");
    auto = _param_client->get_parameters({"foo","bar"});
private:
  rclcpp::SyncParametersClient::SharedPtr _param_client;
}
```

## serviceとclientの違い
以上見てきたように，serviceはノードとしてパラメータにアクセスし，clientはclient機能を通してアクセスする．重要な点は，<font color="Red">同じ関数名であっても微妙に動作や引数が異なる点</font>である．
[公式のAPI]のうち，ノードとしてアクセスするための関数は当該ページの"Parameters:"にある<font color="Red">rclcpp::Node::パラメータに関する関数</font>もしくは<font color="Red">[rclcpp::Node](http://docs.ros2.org/foxy/api/rclcpp/classrclcpp_1_1Node.html)の中から探す</font>必要がある(どちらも同じもの)．
一方で，client機能を通してアクセスする場合は[公式のAPI]の<font color="Red">[rclcpp::AsyncParametersClient](http://docs.ros2.org/foxy/api/rclcpp/classrclcpp_1_1AsyncParametersClient.html)や[rclcpp::SyncParametersClient](http://docs.ros2.org/foxy/api/rclcpp/classrclcpp_1_1SyncParametersClient.html)</font>の中から探す必要がある．


[公式のAPI]:http://docs.ros2.org/foxy/api/rclcpp/index.html

【前:[ROS2の最小構成service/client:初級 -ROS1 style-]】
【前:[ROS2の最小構成service/client:初級 -class style-]】
【次:[ROS2の最小構成parameter:初級 -ROS1 style-]】
【次:[ROS2の最小構成parameter:初級 -class type-]】