Dashing Diademataからの初期化方法
公式のRoadmapにあるようにDashing Diademataからノードを初期化方法が変わった(まだ前の方法も使えるけど).
Crystal ClemmysでのROS2ではノードの初期化として以下の二種類のコンストラクタが用意されていた(公式apiより).
c++の場合
rclcpp::Node::Node(
const std::string & node_name,
const std::string & name_space="",
bool use_intra_process_comms = false)
rclcpp::Node::Node(
const std::string & node_name,
const std::string & name_space="",
rclcpp::Context::SharedPtr context,
const std::vector< std::string > & arguments,
const std::vector< Parameter > & initial_parameters,
bool use_global_arguments = true,
bool use_intra_process_comms = false,
bool start_parameter_services = true)
これがnode_name(ノードの名前)とname_space(ノードの名前空間)以外全部+αをもつNodeOptionsクラスで初期化できるようになった(公式apiより).
新方法
rclcpp::Node::Node(
const std::string & node_name,
const NodeOptions & options = NodeOptions())
rclcpp::Node::Node(
const std::string & node_name,
const std::string & name_space,
const NodeOptions & options = NodeOptions())
ちなみにNodeOptionsのところに引数を与えないとNodeOptions()によってデフォルト値を持ったものが自動的に渡される.
NodeOptionsの詳しい情報は公式のapiから.
推奨されるクラスのコンストラクタ
推奨されるコンストラクタは以下のようになる.
ちなみに,ここでの考え方としては
- ノードの名前は固定
- ここではhoge_nodeとしている
- 同一ノードを複数起動させる場合,名前空間(name_space)で区別
としている.
ノードの名前を都度変えたい場合は,node_nameに関してもコンストラクタに記載することになる.
- クラス名
- Hoge
hoge.hpp
class Hoge : public rclcpp::Node{
...
public:
Hoge(const rclcpp::NodeOptions & options = rclcpp::NodeOptions());
Hoge(const std::string & name_space, const rclcpp::NodeOptions & options = rclcpp::NodeOptions());
};
hoge.cpp
...
Hoge::Hoge(const rclcpp::NodeOptions & options = rclcpp::NodeOptions()) : Hoge("", options){}
Hoge::Hoge(const std::string & name_space, const rclcpp::NodeOptions & options = rclcpp::NodeOptions())
: Node("hoge_node", name_space, options){
// コンストラクタの処理
}
これを使う場合には以下のようになる(名前空間を使用していない場合).
NodeOptionsを使用しない場合
#include <rclcpp/rclcpp.hpp>
#include "hoge.hpp"
int main(int argc, char * argv[]){
...
auto node = std::make_shared<Hoge>();
...
}
NodeOptionsを使用する場合
#include <rclcpp/rclcpp.hpp>
#include "hoge.hpp"
int main(int argc, char * argv[]){
...
std::vector<rclcpp::Parameter> params = { rclcpp::Parameter("use_sim_time", true) };
rclcpp::NodeOptions node_options;
node_options.parameter_overrides(params);
auto node = std::make_shared<Hoge>(options);
...
}
参考
- NodeOptionsのAPI
-
公式のRoadmap
- 使い方の例が少し載っている
- 公式githubのNodeOptions