ROS2プログラミング入門 #3 振り返り
この記事では、ここまで学んできたことを振り返りつつ、ROSの基礎知識をまとめます。
環境構築
趣味でやるにしても仕事でやるにしても、ロボットのアプリケーションを作るのは難しいです。
今は ROS というフレームワークがありますから、ロボットのアプリケーションを作る際はこれを利用させてもらい、楽に作れるものはなるべく楽に作りたいです。
そういうわけで ROS2プログラミング入門 #1 環境構築 では環境構築を行いました。
Hello world
私はプログラミング言語やフレームワークなどを学ぶとき Hello world
から始めるタイプです。
なので、ROS2に関しても同様にそこから始めることにしました。
詳細は ROS2プログラミング入門 #2 Hello world を見てもらえたらと思いますが、ざっと次のような流れでアプリケーションを作れば良さそうだとわかりました。
- パッケージの作成
- ソースファイルの作成
- Tutorials を見ると言語は C++ と Python が推奨のようです。今回は C++ を使います。
- ビルド設定ファイルの編集
- ビルド
- 実行
また、ROS2の環境を有効化するために ~/.bashrc
に次の行を追加しておく必要がありました。
source /opt/ros/foxy/setup.bash
さらに言うと自作パッケージのプログラムも実行できるようにしたいので、次の行も追加する必要があります。
source $HOME/dev_ws/install/setup.bash
基礎知識
次回以降のために、ここでいくつかROSの基礎知識をまとめておきます。
ノード
ROSでは、複数の ノード を協調させることでロボットのアプリケーションを実現します。
そして、ノードは例えばモータを制御するノード、センサを制御するノード、センサの値を処理して動作を決めるノードなど、できるだけ単一目的かつシンプルに作ります。
下図は Understanding ROS 2 nodes に掲載されているものですが
https://docs.ros.org/en/foxy/Tutorials/Understanding-ROS2-Nodes.html
より
3つのノードが協調している様子が見て取れますね。
トピックとメッセージ
あるノードが別のノードへデータを送るためのパスを トピック といいます。また、トピックを介して送られるデータを メッセージ といいます。
パブリッシャーとサブスクライバー
メッセージの送り手を パブリッシャー 、受け手を サブスクライバー といいます。
https://docs.ros.org/en/foxy/Tutorials/Topics/Understanding-ROS2-Topics.html
より
上図ではパブリッシャーからサブスクライバーへトピックを介してメッセージが送られている様子が見て取れます。
こういった送受信の形を「パブリッシュ・サブスクライブモデル」、略して「パブサブモデル」と言ったりします。
プログラミングスタイル
最後にROS2のプログラミングスタイルを紹介しておきます。
詳細は Code style and language versions にありますが、なるべくこれに沿ってプログラミングした方が良いでしょう。
というわけで、これに沿って hello.cpp
を書き直したものを次に示します。
#include "rclcpp/rclcpp.hpp"
int main(int argc, char **argv)
{
rclcpp::init(argc, argv);
auto node = rclcpp::Node::make_shared("hello");
RCLCPP_INFO(node->get_logger(), "Hello, ROS2 world!");
rclcpp::shutdown();
return 0;
}
変更内容は、引数のダブルポインタの位置、半角スペース2つのインデント、関数の波括弧の位置です。
おわりに
ここまで学んできたことを振り返りつつ、基礎知識をまとめました。どなたかのお役に立てば幸いです。
Discussion