えいあーるれいの技術日記

ROS2やM5 Stack、Ubuntuについて書いています

ROS2 Galacticのインストール。変更点を確認

 ROS Galacticのリリースが2021年5月23日にありました。Ubuntu20.04 LTSで動作する新しいROSですが、どのような機能が追加されているのかを勉強がてらRollingディストリビューションを使って試してみました。

 かなり多くの機能が追加されているようで少し使いやすそうです。

 このブログでは次の環境を使用しています。

  • Ubuntu 20.04 LTS on WSL2(Windows 10)
  • ROS Rolling(新機能)・ROS Galactic(インストール)

 一応実際に実行したものを記述していますが、まだまだ勉強中なので、適宜修正予定です。

インストール

$ sudo apt update && sudo apt install curl gnupg lsb-release
$ 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 (lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

$ sudo apt update
$ sudo apt install ros-galactic-desktop

Galacticに移行すべき??Galacticの新機能まとめ

 以下、下記リンクの日本語訳です。Galacticで実装されているものはRollingでも同様に実装されているため、この記事ではRollingで説明しています。

docs.ros.org

rosrunのログレベル指定

 実行ごとにロガーレベルを任意の個数指定できるようになりました。例えば、下記のコマンドならWARNレベルとDEBUGレベルを変更できます。これによって、余計なログを消したり、ログを追加できたりします。  

$ ros2 run demo_nodes_cpp talker --ros-args --log-level WARN --log-level talker:=DEBUG

 上記のオプションを付けた場合とつけていない場合で比較してみました。「WARN」レベルを指定することでWARNに満たないレベルの出力をフィルタします。(Ctrl+Cの出力がフィルタされています)

f:id:Ray_ar:20210522121234p:plain

 例えば、すべてのレベルを「DEBUG」に設定した場合は次のようになります。

f:id:Ray_ar:20210522122022p:plain

 逆に、すべてのレベルを「ERROR」に設定した場合は何も出力されません。

rosidl

 CMakeを使用せずに、メッセージファイルからメッセージ用のファイル群(.hや.hppなど)を生成できるようになりました。どのような使い道があるのでしょうか…?プラグイン作成が楽になる(?)などのメリットがあるらしいですが…

 勉強がまだまだ足りないみたいです。

f:id:Ray_ar:20210522131731p:plain

QoSのオーバーライド

 Galactic以降はQoSをオーバーライドできるようになりました。以下のリンクをみる限りだと、Foxy以前で動いていたプログラムの実行時にQoSの上書きを行うyamlを当てることでQoSを行うみたいですね。QoS設定を外部から上書きできるのは便利ですね。

demos/quality_of_service_demo at a66f0e894841a5d751bce6ded4983acb780448cf · ros2/demos · GitHub

External configurability of QoS policies.

Python で point_cloud2 が使用可能

 point_cloud2がPythonで使えるようになったそうです。

Port of point_cloud2.py from ROS1 to ROS2. by SebastianGrans · Pull Request #128 · ros2/common_interfaces · GitHub

Rviz2タイムパネル

 ROS1のRvizの時間表示機能が移植されました。

f:id:Ray_ar:20210522122629p:plain
左がFoxy以前のRviz2、右がGalactic以降のRviz2

ros2 topic echo のオプションに "-raw" の追加

 デバッグ用らしいです。

[ros2topic] Add option to echo serialized messages by jacobperron · Pull Request #470 · ros2/ros2cli · GitHub

 f:id:Ray_ar:20210522152405p:plain

to_yaml関数(rclcpp)

 to_yamlで出力形式を変更できます。

 スクリーンショットでは、Twistをto_yamlで出力しています。分かりやすい。

#include <cstdio>

#include <std_msgs/msg/string.hpp>
#include <std_msgs/msg/int32.hpp>
#include <geometry_msgs/msg/twist.hpp>

#include <iostream>

int main()
{
  std_msgs::msg::String msg_string;
  std_msgs::msg::Int32 msg_int32;
  geometry_msgs::msg::Twist twist_data;

  msg_string.data = "hello world";
  msg_int32.data = 10;

  std::cout << rosidl_generator_traits::to_yaml(twist_data) << std::endl;

  printf("%s", rosidl_generator_traits::to_yaml(msg_string).c_str());
  printf("%s", rosidl_generator_traits::to_yaml(msg_int32).c_str());
  return 0;
}

f:id:Ray_ar:20210522163722p:plain

ros2コマンドを使用して実行時にパラメータファイルをロードする機能

Add rosparam verb load by v-lopez · Pull Request #590 · ros2/ros2cli · GitHub

 yamlファイルから実行時にパラメータをロードする機能が追加されているようです。(現在のFoxyでもできないことはないと思うのですが…?よくわかっていません。)

Terminal 1

$ ros2 run demo_nodes_cpp parameter_blackboard

Terminal 2

$ ros2 param set /parameter_blackboard foo bar
$ ros2 param dump /parameter_blackboard 
$ ros2 param set /parameter_blackboard foo different
$ ros2 param load /parameter_blackboard ./parameter_blackboard.yaml

QoS非互換性チェック機能

※ rollingでは確認できませんでした

 ros2doctorにQoS互換性をチェックするツールが追加されたそうです。

個人的な総評

 Galacticは主にログレベル系統のアップデートが充実しています。そのため、2022年以降(2024年メイン)のシステムも見据えている場合や単純に個人で開発している人には使いやすいのかなと感じました。

 ただし、ROS2 Foxyユーザが昨年から今年の3月にかけてROS2史のなかでもこれまでにないレベルで増えていることを考えると、パッケージはFoxyが主流になるのかなーと思います。

 しばらくはFoxyの開発が中心になるのかなーと思います。

 なにかGalacticの長所を生かした実装ができればまた投稿したいと思います。