Help us understand the problem. What is going on with this article?

NodeOptionsによるROS2ノードの初期化について

ROS2関係トップページへ

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);
...
}

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした