【ROS2関係トップページへ】
【ROS2レクチャー:初級 -class style-】
【前:ROS2プロジェクトの作成】
【次:ROS2のpublisher/subscriber概要】
概要
クラス化したnode作成の第一歩として,何もしないnodeを使用したプログラムを作成する.ROS風nodeのレクチャーは終わっているものとする.
共有ライブラリの説明はもっと先に行うが,クラスの扱いに慣れているならば軽く「ROS2における共有ライブラリ」を読むと効率的かもしれない.
準備
パッケージの作成
$ cd ~/ros2_studies_ws/
$ ros2 pkg create --build-type ament_cmake minimal_class_node --dependencies rclcpp
プログラム作成
作成物:
- src/minimal_node.hpp
- nodeクラスの宣言
- src/minimal_node.cpp
- nodeクラスの定義
- src/main.cpp
- nodeを使用するtarget
何もしないnode(メッセージを出力くらいはする)なのでシンプル.
ROS2に関する基本的な情報:初級 -class style-で書いたように,nodeのコンストラクタが中心となる.
NodeOptionsについて
コンストラクタの中でNodeOptionsを使っているが,詳しくはずっと後で,今は分からなくても大丈夫.使わない時にはデフォルト値が勝手に入り,分からなくても使える.
プログラム
#include <rclcpp/rclcpp.hpp>
class MinimalNode : public rclcpp::Node{
public:
MinimalNode(
const std::string& name_space="",
const rclcpp::NodeOptions& options = rclcpp::NodeOptions()
);
};
2行目:rclcppのNodeから継承を行う.
4~7行目:コンストラクタで,一つ目の引数が名前空間の指定,二つ目の引数がオプション設定となる.
#include <rclcpp/rclcpp.hpp>
#include "minimal_node.hpp"
MinimalNode::MinimalNode(const std::string& name_space, const rclcpp::NodeOptions& options)
: Node("minimal_node_test", name_space, options){
RCLCPP_INFO(this->get_logger(),"minimal_node_test");
}
4~7行目:nodeの名前を"minimal_node_test",nodeの名前空間をname_spaceとして実体を作成.処理としてはRCLCPP_INFOで画面にメッセージを出力.この場合,自分自身(this)のget_loggerを使う形になる.
#include <rclcpp/rclcpp.hpp>
#include "minimal_node.hpp"
int main(int argc, char * argv[]){
rclcpp::init(argc, argv);
auto node = std::make_shared<MinimalNode>();
rclcpp::spin(node);
rclcpp::shutdown();
return 0;
}
6行目:nodeの作成.自分のクラスなので,Nodeのmake_sharedを使うのではなくstdのmake_sharedを使って実体化.
7行目:作ったnodeをspin関数に渡してnodeを実行.
6行目と7行目は一つにまとめて以下のように書いても良し.
rclcpp::spin(std::make_shared<MinimalNode>());
このように,クラスの宣言・定義でnodeの準備・設定を行い,rclcpp::spin()によってnodeの実行を行う.
package.xml
基本的には重要なところや追加したところのみを表示.
Foxy Fitzroyからの書き方.
<package format="3">
<depend>rclcpp</depend>
</package>
旧情報
Eloquent Elusorまでの書き方.
<package format="3">
<build_depend>rclcpp</build_depend>
<test_depend>rclcpp</test_depend>
<exec_depend>rclcpp</exec_depend>
</package>
CMakeLists.txt
基本的には重要なところや追加したところのみを表示.
target(target名:minimal_node_test)を作成するためには複数のソースファイルが必要となる.そのためadd_executableのソースコードのところが複数行になっている.改行区切りでなくてもスペース区切りにしてもよいが,視認性・拡張性から改行区切り推奨使用.
find_package(rclcpp REQUIRED)
add_executable(minimal_node_test
src/main.cpp
src/minimal_node.cpp
)
ament_target_dependencies(minimal_node_test
rclcpp
)
install(TARGETS
minimal_node_test
DESTINATION lib/${PROJECT_NAME}
)
ビルド・実行
$ cd ~/ros2_studies_ws/
$ colcon build --symlink-install
$ . install/local_setup.bash
$ ros2 run minimal_class_node minimal_node_test
ビルドはワークスペースのトップディレクトリでcolcon build.
3行目の. install/setup.bashはパッケージを新規で作成したとき以外は不必要.
4行目で実行しており,書式はros2 run [パッケージ名] [ターゲット名]