📖

ROS2プログラミング入門 #3 振り返り

2022/05/07に公開

この記事では、ここまで学んできたことを振り返りつつ、ROSの基礎知識をまとめます。

環境構築

趣味でやるにしても仕事でやるにしても、ロボットのアプリケーションを作るのは難しいです。

今は ROS というフレームワークがありますから、ロボットのアプリケーションを作る際はこれを利用させてもらい、楽に作れるものはなるべく楽に作りたいです。

そういうわけで ROS2プログラミング入門 #1 環境構築 では環境構築を行いました。

Hello world

私はプログラミング言語やフレームワークなどを学ぶとき Hello world から始めるタイプです。

なので、ROS2に関しても同様にそこから始めることにしました。

詳細は ROS2プログラミング入門 #2 Hello world を見てもらえたらと思いますが、ざっと次のような流れでアプリケーションを作れば良さそうだとわかりました。

  1. パッケージの作成
  2. ソースファイルの作成
    • Tutorials を見ると言語は C++Python が推奨のようです。今回は C++ を使います。
  3. ビルド設定ファイルの編集
  4. ビルド
  5. 実行

また、ROS2の環境を有効化するために ~/.bashrc に次の行を追加しておく必要がありました。

source /opt/ros/foxy/setup.bash

さらに言うと自作パッケージのプログラムも実行できるようにしたいので、次の行も追加する必要があります。

source $HOME/dev_ws/install/setup.bash

基礎知識

次回以降のために、ここでいくつかROSの基礎知識をまとめておきます。

ノード

ROSでは、複数の ノード を協調させることでロボットのアプリケーションを実現します。

そして、ノードは例えばモータを制御するノード、センサを制御するノード、センサの値を処理して動作を決めるノードなど、できるだけ単一目的かつシンプルに作ります。

下図は Understanding ROS 2 nodes に掲載されているものですが

ROS2のノード
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