前回: 【smabo第2回:事前準備1】Raspberry Piの初期設定(ubuntu OSインストール,ssh接続)
次回: 【smabo第2回】smaboをROS2で通信してみよう
smaboトップページ: スマホが入るロボットの作り方【smabo】
お疲れ様です。秋並です。
今回は、smaboを通信する際にも使用するROS2について解説します。
- ROS2の概要
- ROS2とは
- ノード、トピック、メッセージ、パブリッシャー、サブスクライバー
- ROS2のインストール手順
目次
- 今回使用する機材、パーツなど
- 今回使用するソフトなど
- ubuntu 22.04
- ROS2とは
- ROSについて
- ROS2について
- ROS2のインストール
- ROS2の基礎知識
- ノード
- トピック、メッセージ、パブリッシャー、サブスクライバー
- メッセージの型
- テストノードを動かしてみる
- ノード、トピック、メッセージを確認する
- ros2 node
- ros2 topic
- ros2 interface
- 最後に
- 参考
今回使用する機材、パーツなど
パーツ名 | 商品url |
Raspberry Pi
(Raspberry Pi4以降、メモリは4GB以上をおすすめします) |
今回使用するソフトなど
ubuntu 22.04
ソフト名 | url |
ROS2 (humble) |
ROS2とは
ROSについて
ROS2について解説する前に、最初にROSについて解説したいと思います。
ROS (Robot Operating System)はロボット開発に必要なライブラリやツールなどが含んだ総合的なプラットフォームのことです。
これを、もっと大雑把に言うと
ロボット開発するのに便利なやつ
といったイメージです。
ROS2について
爆発的に普及したROSですが、もともと研究開発向けに生まれたということもあり、研究者以外が利用するケースが増えてきた近年ではいくつかの問題点が目立つようになってきました。
たとえば
- 複数台のロボットに対応していない
- リアルタイム制御に対応していない
- 理想的、安定的なネットワーク環境での動作を前提としている
などがあげられます
このような欠点を改善するために生まれたのがROS2になります。
なお、ROSは最新バージョンのNoetic(サポートは2025年まで)を最後に、開発が終了することが分かっているため、今回のsmaboでもROS2を使って実装を進めていきたいと思います。
ROS2のインストール
それでは、ここからは実際にROS2をインストールしていきましょう。
基本的には、公式サイトの通りにコマンドを実行していけばOKですが、ここではコマンドのみ載せておきます。それぞれのコマンドの詳しい解説については、下記の公式サイトをご確認下さい。
Ubuntu (Debian packages) — ROS 2 Documentation: Humble documentation
locale # check for UTF-8
sudo apt update && sudo apt install locales
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
export LANG=en_US.UTF-8
locale # verify settings
sudo apt install software-properties-common
sudo add-apt-repository universe
sudo apt update && sudo apt install curl -y
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
sudo apt update
sudo apt upgrade
sudo apt install ros-humble-desktop
sudo apt install ros-dev-tools
# Replace ".bash" with your shell if you're not using bash
# Possible values are: setup.bash, setup.sh, setup.zsh
source /opt/ros/humble/setup.bash
上記の source /opt/ros/humble/setup.bash
を実行すると、ros2コマンドを実行できるのですが、ターミナルを開くたびに入力するのは面倒なので、下記コマンドを実行しましょう。
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
ROS2の基礎知識
ここからは、ROS2で登場する基礎的な概念について解説していきたいと思います。
ノード
ノードとは、ロボットシステムにおける最小単位の機能モジュールを指します。
ノード間で通信することで、全体のシステムが構成されることになります。
言葉の説明だけでは分かりにくいと思うので、具体的な例を使って説明します。
例)ノード1→ノード2に情報を渡し、受け取った情報をもとにノード2が処理を行う
- ノード1:カメラから得た画像情報を他のノードに受け渡すノード
- ノード2:ノード1から取得した画像情報をもとにロボットアームを適切な位置に制御するノード
ノードのイメージとしては上記の通りですが、
ここで、「カメラから取得した情報をもとに物体認識をしたい」という別の機能を実装したい場合を考えてみましょう。
それぞれのノードは独立しているので
- ノード1はそのままで、ノード2のみを別のノードに取り換える
ことで、この機能を実装することが出来ます。
このように、ノードを上手く構成することで
- 他の機能を実装するときに、ノードを使いまわすことが出来る
ことがうれしいポイントです。
そのため、既存のノードと自作のノードを組み合わせることで
一からノードを作成するのと比較して、効率的に開発を進めることが可能になります。
トピック、メッセージ、パブリッシャー、サブスクライバー
ここまでで、「ノード間で情報の受け渡しを行う」ことでシステムが構成されることを説明しましたが、
次に、情報の受け渡しを行う際に必要になる
- トピック (topic)
- メッセージ (message)
について説明します。
先ほどの図でいうと、「情報の受け渡しを行うためのパイプ」がトピック、「受け渡される情報」がメッセージになります。
この際に、「メッセージを特定のトピックに配信する機能」と「特定のトピックから流れてきたメッセージを購読する機能」が必要になるのですが、この機能を持つのが
- パブリッシャー (publisher)
- サブスクライバー (subscriber)
になります。
メッセージの型
トピックで配信/購読するメッセージには変数と同様に型があります。
メッセージの型には、
- ROSで用意されているメッセージ
- 自身で型を定義するカスタムメッセージ
の2種類が存在します。
ここでは、ROSで標準で用意されているメッセージについて説明したいと思います。
std_msgs
最初に、最もシンプルなメッセージが用意されている std_msgs
について説明します(ドキュメントリンク)
例えば、 std_msgs/msg/Int16.msg
は以下のような構成になっています(ドキュメントリンク)
int16 data
メッセージの中身を確認すると、 int16
型の data
という名前の変数で構成されていることが分かります。
sensor_msgs
- メッセージの定義の中で、他のメッセージの型の変数を定義することが出来る
次に、センサー関連のメッセージが用意されている sensor_msgs
について説明します(ドキュメントリンク)
例えば、sensor_msgs/msg/Image.msg
は以下のような構成になっています(ドキュメントリンク)
std_msgs/msg/Header header
uint32 height
uint32 width
string encoding
uint8 is_bigendian
uint32 step
uint8[] data
メッセージの中身を確認すると、 画像の高さ height
、画像の幅 width
のような、画像に必要ないくつかのデータで構成されていることが分かります。
また、上記メッセージの std_msgs/msg/Header header
という箇所に着目してみると、型が std_msgs/msg/Header
というメッセージの型になっていることが分かります
このように、
ということも抑えておくとよいと思います。
- 配信する側の「トピックの名前」「メッセージの型」と、購読する側の「トピックの名前」「メッセージの型」が同じでないと、メッセージのやり取りができない
テストノードを動かしてみる
ここまでで、ROS2の基本的な概要について説明したきたので、ここからは実際にROS2を動かしてみましょう。
ターミナルにて以下のコマンドを実行して下さい。(テストコードはここで公開されています)
source /opt/ros/humble/setup.bash
ros2 run demo_nodes_py talker
ターミナルをもう一つ開き以下コマンドを実行して下さい。(テストコードはここで公開されています)
source /opt/ros/humble/setup.bash
ros2 run demo_nodes_py listener
listenerを起動したターミナルで以下のように表示されていたらOKです。
[INFO] [1704025540.482092194] [listener]: I heard: [Hello World: 0]
[INFO] [1704025541.449221536] [listener]: I heard: [Hello World: 1]
[INFO] [1704025542.448992738] [listener]: I heard: [Hello World: 2]
[INFO] [1704025543.453376645] [listener]: I heard: [Hello World: 3]
[INFO] [1704025544.449385635] [listener]: I heard: [Hello World: 4]
実行したノードの処理の流れは以下のようになります。
- talker(ノード1)側で、メッセージに「Hello World: %d」というデータを格納(%dには0からカウントされていく整数が代入される)
- talker(ノード1)がchatter(トピック)にメッセージを配信 (Publish)
- listener(ノード2)はchatter(トピック)から流れてきたメッセージを受信 (Subscribe)
- 受信したメッセージのデータをlistener(ノード2)側で表示
ノード、トピック、メッセージを確認する
ros2にはノードやトピックの状態を確認するために便利なコマンドが用意されています。
たくさんの種類のコマンドがありますが、ここでは頻繁に使用するコマンドを紹介したいと思います
ros2 node
ros2 node
はノードに関する情報を確認することが出来るコマンドです。
試しに、(2つのテストノードは起動したままの状態で)新しいターミナルを起動し以下のコマンドを実行してみてください。
ros2 node list
実行すると以下のように表示され、ros2 node listコマンドでは「現時点で存在しているノード」の一覧を確認することが出来ることが分かります。
/listener
/talker
ros2 node info
コマンドは、ノードがどのようなパブリッシャーやサブスクライバーを保有しているか等の「ノードの構成」について確認することが出来ます。
ros2 node info /talker
コマンドを実行すると、以下のようにtalkerノードの構成が表示されます。
Subscribers:
Publishers:
/chatter: std_msgs/msg/String
/parameter_events: rcl_interfaces/msg/ParameterEvent
/rosout: rcl_interfaces/msg/Log
Service Servers:
/talker/describe_parameters: rcl_interfaces/srv/DescribeParameters
/talker/get_parameter_types: rcl_interfaces/srv/GetParameterTypes
/talker/get_parameters: rcl_interfaces/srv/GetParameters
/talker/list_parameters: rcl_interfaces/srv/ListParameters
/talker/set_parameters: rcl_interfaces/srv/SetParameters
/talker/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
Service Clients:
Action Servers:
Action Clients:
ros2 topic
ros2 topic
は、トピックに関する情報を確認できるコマンドです。
ros2 topic list
コマンドは、「現時点で存在するトピックの一覧」を確認することが出来ます( /rosout
と /parameter_events
は常に存在するトピックになります)
ros2 topic list
/chatter
/parameter_events
/rosout
ros2 node info
コマンドは、「トピックに関する情報」を確認することが出来ます。
ros2 topic info /chatter
コマンドを実行すると以下のように表示されます。
Type: std_msgs/msg/String
Publisher count: 1
Subscription count: 1
std_msgs/msg/String
という型のメッセージが流れるトピックであるということが分かります。最後に、ros2 node echoコマンドについて解説します。以下のコマンドを実行してみてください。
ros2 topic echo /chatter
コマンドを実行すると、以下のような表示が続くと思います。
data: 'Hello World: 0'
---
data: 'Hello World: 1'
---
data: 'Hello World: 2'
---
data: 'Hello World: 3'
---
data: 'Hello World: 4'
これは、 /chatter
トピックから流れてきたメッセージをリアルタイムで表示しており、トピックからどのようなメッセージが流れてきているかを確認するときに使用できます。
逆に、 ros2 topic echo /トピック名
を実行しても何も表示されない場合は「指定したトピックにメッセージが上手く配信できていない」ということになります。
ros2 interface
ros2 interface
は、メッセージに関する情報を確認できるコマンドです。
ros2 interface show
コマンドは、メッセージの内容について確認することが出来ます。
ros2 interface show std_msgs/msg/String
コマンドを実行すると以下のように表示され、 std_msgs/msg/String
は string
という型の data
という変数で構成されていることが分かります。
# This was originally provided as an example message.
# It is deprecated as of Foxy
# It is recommended to create your own semantically meaningful message.
# However if you would like to continue using this please use the equivalent in example_msgs.
string data
これで、ROS2の基本的な使い方の解説は以上になります。
最後に
今回は
- ROS2の概要
- ROS2とは
- ノード、トピック、メッセージ、パブリッシャー、サブスクライバー
- ROS2のインストール手順
について解説しました。
これで、smaboを動かすための準備が完了しました。
次回は、本編に戻り
- ROS2を使ったsmaboの通信
について解説します。
前回: 【smabo第2回:事前準備1】Raspberry Piの初期設定(ubuntu OSインストール,ssh接続)
次回: 【smabo第2回】smaboをROS2で通信してみよう
smaboトップページ: スマホが入るロボットの作り方【smabo】
参考
smabo記事一覧