Parameterの使い方 – Japanese ROS2 Tutorial
This tutorial is created by Robotics Ambassador Takumi
Robotics Ambassador: theconstruct.ai/robotics-ambassador/
何を学ぶか
このチュートリアルでは公式チュートリアルの内容を参考にROS Paramを動的に書き換える方法を試してみます。
なんで?
ROS 2になって、Parameterの動的な書き換えが可能になりました。
Parameterを初期値やファイルパスの設定とかに使ってる方割と多いと思うのですが、動的にいじれるとサーバの接続先変えたり、テスト中に設定間違えたパラメータ書き直したりできます。
かなり便利で多用しているので、紹介したいと思いました。
環境
ROS2 Humble
rosject link https://app.theconstruct.ai/l/61071157/
作業
パッケージ作成
以下のコマンドでパッケージを作ります。
ros2 pkg create --build-type ament_cmake --license Apache-2.0 cpp_param_exp --dependencies rclcpp
ソースコード記述
srcディレクトリに参考にc++のコードを書きましょう。
#include #include "rclcpp/rclcpp.hpp" class SampleNodeWithParameters : public rclcpp::Node { public: SampleNodeWithParameters() : Node("node_with_parameters") { this->declare_parameter("an_int_param", 0); param_subscriber_ = std::make_shared(this); auto cb = [this](const rclcpp::Parameter &p) { RCLCPP_INFO( this->get_logger(), "cb: Received an update to parameter \"%s\" of type %s: \"%ld\"", p.get_name().c_str(), p.get_type_name().c_str(), p.as_int()); }; cb_handle_ = param_subscriber_->add_parameter_callback("an_int_param", cb); } private: std::shared_ptr param_subscriber_; std::shared_ptr cb_handle_; }; int main(int argc, char **argv) { rclcpp::init(argc, argv); rclcpp::spin(std::make_shared()); rclcpp::shutdown(); return 0; }
コードの動作としては、an_int_paramパラメータの更新を受け取ったら、そのデータをログに吐くといういたって単純なモノです。
特徴的な所があるとしたら、コールバック関数の定義にラムダ式を使っている所でしょうか。
コンパイル
次はコンパイルします。
package.xmlとCMakeList.txtの記述が必要ですが、特に難しいことはやってないので、詳しくはRosjectを参照してください。
(sourceはしている前提とします。)
cd ~/ros2_ws/ colcon buildじ
実行
以下のコマンドで実行していきます。
[端末A]
cd ~/ros2_ws/ user:~/ros2_ws$ . install/setup.bash user:~/ros2_ws$ ros2 run cpp_param_exp parameter_event_handlerき
起動できたら、別の[端末B]を開いて以下のコマンドを実行します。”Set parameter successful”と出れば成功です。
cd ~/ros2_ws/ user:~$ ros2 param set /node_with_parameters an_int_param 10 Set parameter successful
端末Aを見ると以下のメッセージが表示され、parameterの更新に成功していることが分かります。
[INFO] [1714224724.898754729] [node_with_parameters]: cb: Received an update to parameter "an_int_param" of type integer: "10"
また,rqt_reconfigureを使ってguiでデータ設定をする事も出来ます。試しあれ。
[端末B]
. install/setup.bash ros2 run rqt_reconfigure rqt_reconfigure
Video Tutorial