第4回 ROSアプリケーション開発のモデルケース
第4回 ROS【Robot Operating System】解説 コラム
このコラムでは数回に分けて、ROS(Robot Operating System)とは?についてご紹介します。連載4回目は「ROSアプリケーション開発のモデルケース」について解説します。
- 第1回 ROSとは?基本的概念とROS2が必要になった背景
- 第2回 ROSとROS2のプログラミング概念
- 第3回 ROSとは?ROSのパッケージ構成を分かりやすく解説
- 第4回 ROSアプリケーション開発のモデルケース ※本コラムで解説します
- ROS実践編、自作ロボットでROSを動かした様子とQ&A
※ROS技術が学べるオンライン学習 Eureka Box(ユーリカボックス)で公開中
想定する読者 |
|
想定する読者の 知識レベル |
|
本連載を読んだ後に得られる期待値 |
|
目次
1. ROSアプリケーション開発のモデルケース
アプリケーションサンプル
今回は、ROSを使って実際の開発をどう行っていくかを、例を示しながら説明していきます。例には、「TurtleBot3によるSLAMアルゴリズムの最適化」を取り上げてみたいと思います。
TurtleBot3は、ROS公式のプラットフォームロボットです。
SLAM(Simultaneous Localization and Mapping)は、自己位置推定と環境地図作成を同時に実行するアプリケーションです。ロボットを動かしながら、ロボットが見たデータを使って地図を作成していきます。
作成した地図は、ロボットのナビゲーション(自律走行)などに使われます。SLAMで地図を作成しながら、同時にナビゲーションで自律走行することも可能です。
TurtleBot3は、既にあるパッケージを組み合わせて簡単にSLAMを実現できるのですが、ここでは、TurtleBot3の手動遠隔操作が実現できているものとみなし、SLAMアルゴリズムを開発・最適化することを想定したワークフローをご紹介します。
TurtleBot3
対象とするロボットとシステムの構成について説明しておきましょう。
これがTurtleBot3です。一番上にLiDARがついていて、これが回転しながら自車周辺の障害物との距離をスキャンすることができます。ロボットのSingle Board ComputerにRaspberry Piが載っていて、そこにLinuxをインストールし、ロボット制御するROSのノードをデプロイします。
動く仕組みとしては、2つタイヤがついていて、回転の差で曲がったりその場で旋回したり、同じ回転でまっすぐ進んだり、という走行ができます。モーターの回転位置と速度によってロボットの移動した量を計算し、スタート地点からどこまで移動したかを推定することができます。オドメトリやデッドレコニングと呼ばれるものです。
このTurtleBot3と母艦のPCとが通信して、システムを実現します。母艦はLinuxが載った一般的なPCで、ROSがインストールしてあり、ここから「まっすぐ行け」「このぐらい曲がれ」といった遠隔操作の指令を出すことができます。また、このPCにはSLAMの計算を行うROSノードがデプロイされていて、TurtleBot3と通信しながら地図を作っていく、という構成になっています。
SLAMの処理過程とソフトウェア構造
次に、ソフトウェアとしてSLAMの処理をどう行っているかを説明します。図は、ノードとノード間で交わされるトピックの関係を表したものです。
SLAMの処理過程を簡単に言うと、「移動量から推定したロボットの位置・姿勢」(今どのあたりまで移動して、どっちを向いているか)と、「検出された障害物への距離」(そこからどの方向に何が見えるか)の情報を使って、地図を作成します。
右上に、遠隔操作のコマンドを発行する「turtlebot3_teleop_keyboard」というノードがあり、コントローラーやキーボードなどを使って、ロボットをその方向に進めるためのコマンド「cmd_vel」が発行されます。このトピックを「turtlebot3_core」というノードが受けて、ロボットの実際の制御をします。ここから、「joint_states」という(jointは関節/軸)、実際にその時にどれくらいの速さで車輪が回っているかを示す状態量を投げます。その車輪の速度を、「robot_state_publisher」が、ロボットの姿勢、つまり「ロボットはこっちを向いている」「ロボット全体としてここまで移動した」というような状態量に変換し、その現在の位置と姿勢を投げます。
一方、ロボットは360° LiDARでスキャンを行っていて、「どこそこの方向何メートルに障害物がある」といったスキャンデータをSLAMアルゴリズムのモジュール「turtlebot3_slam_***」に送ります。
このような仕組みによって、ロボットの位置と姿勢の情報(右側)と障害物への距離の情報(左側)が与えられて、「turtlebot3_slam_***」が地図を作成します。
Eureka Boxは厚生労働省が実施している助成金、人材開発支援助成金の適用対象となります。
シミュレーションによる開発
さて、この開発にあたっては、シミュレーションが大きな意味を持ちます。実世界で物理的に動くことを特徴とするロボットのソフトウェア開発を実際のハードウェアだけで行うのは、効率が悪く、時にはハードウェアの破壊や危険を伴うため、ソフトウェア開発作業の多くでシミュレーションが活用されます。
シミュレーションには、オープンループとクローズドループという種類があります。
- システムのすべての入力に関して定められたパターンを与えて、システムからの出力を評価する手法。システムからの出力は、入力に影響を及ぼさない(フィードバックがない)。
- 仕組みの構築が容易かつ何度も同じ条件の評価を行いやすい。
- システムに外部から制御可能な入力を与えて、システムと模擬された外部環境との相互作用の中でシステムの振る舞いを評価する手法。 システムからの出力が外部環境と相互作用し、入力に影響を及ぼす(フィードバックがある)。
- 仕組みの構築が難解であるが、さまざまな条件の評価を行いやすい。
※引用 Eureka Box(ユーリカボックス)【体験版】ROS=連載第3回https://member.eureka-box.com/products/4/categories/2148121491/posts/2153243404
オープンループのシミュレーションというのは、ある系に対して環境入力(センサの値など)や制御入力(自分が行った操作など)が入ってきて、対象のシステムが出力するものを評価する、というシュミレーションです。仕組みとしては非常に簡単であり、入力の部分は、実際にロボットを動かして記録しておけばいいわけです。制御入力やセンサ値を記録しておいて、それを流し込んで出てくる結果を見る、というシュミレーションです。
クローズドループのシュミレーションはもう少し複雑です。システムが動いた結果の出力が、外部環境シミュレータに入って、その結果、センサ値(環境入力)が変化するという、フィードバックを含む仕組みです。ロボットが動く世界を含めて作り込む必要があるため、仕組みの構築が困難なのですが、その代わりに、さまざまな条件でテストしやすい仕組みになっています。
今回は、この2種類のシミュレーションを活用して「turtlebot3_slam_***」のアルゴリズムを開発するときに、ROSがどう役立つかを詳しく見ていきます。
オープンループシミュレーション
「turtlebot3_slam_***」ノードの検証にオープンループシミュレーションを活用する場合、次の2ステップで行います。
- ロボットを手動走行させてセンサデータを「rosbag」に記録
- 「rosbag」を再生させてオフラインで地図作成アルゴリズムを開発
図の黄色と水色の部分は、「SLAMの処理過程とソフトウェア構造」のセクションで紹介した実機の場合の図とまったく同じです。
ステップ1では、実際にロボットをあれこれ動かして、センサ値「scan」やロボットがどう動いたかの位置情報「tf」を「rosbag」に記録します。「rosbag」には、これらのトピックがいつどういう状態だったかをすべて記録し、さらにそれを再生する仕組みが備わっています。つまり、一度記録しておけば、実際に動いたかのように再生することができるわけです。
ステップ2で「turtlebot3_slam_***」のアルゴリズムを開発する際は、「rosbag」を再生させれば、実際にロボットやセンサを動かさなくても試行錯誤が可能です。リアルタイムにロボットが動きセンサで値を取っているのか、それとも記録したものを再生しているのかには関係なく動作します。そして「turtlebot3_slam_***」を変更したら地図がどう変わるかを確認しながら、開発していくことができます。
クローズドループシミュレーション
次に、クローズドループシミュレーションを使った場合を見ていきます。この場合は、ロボットと環境を物理シミュレータに置き換えて、仮想環境内でロボットを動かします。
※引用 Eureka Box(ユーリカボックス)【体験版】ROS=連載第3回https://member.eureka-box.com/products/4/categories/2148121491/posts/2153243404
右の方の、先ほどは実際のロボット「turtlebot3_core」があったところが、「gazebo」という物理シミュレータに変わっています。それから、センサ「turtlebot3_lds」もなくなり、シミュレータからスキャンデータが送られるようになっています。
この「gazebo」の中でクローズドループが動きます。「turtlebot3_teleop_keyboard」からの指示に対して、シミュレータによって仮想的な世界(図の上部右側の画面イメージ)の中をロボットが動き、その結果、センサ値が変わって、それが「scan」から出てきます。オープンループのときは、ロボットの動きを記録したら、あとは決まった同じデータが使われたのですが、クローズドループでは、ロボットを仮想の世界で自由に動かしながら、「turtlebot3_slam_***」を動かして開発していくことができます。これがクローズドループのシュミレーションです。
ROSを使った開発の利点
ROSを使った場合の嬉しさには、大きく分けて次の2点があります。
- ツールが充実しており、必要な開発環境を速やかに構築できる
- ノード間が疎結合で、ノードの入れ替えによって様々な変更や移植に対応できる
ツールの充実
まず1点目ですが、一番大きいのは物理シミュレータです。仮想環境内でロボットを動かして、その結果、外界からどういうフィードバックがある、というのを作り込むのが比較的容易です。
それから、動いた結果、ロボットがどういう認識をしているか、センサ値がどうなっているか、というのを2Dや3Dで可視化する仕組みも備わっています。先ほどは触れなかったのですが、クローズドループシミュレーションの図の「rviz」がこれに該当します。これによって、ロボットが作った地図そのものや、今センサが検出している実際の障害物のセンサ値(クローズドループシミュレーションの図上部左側の画面イメージで赤くなっている部分)を可視化できます。
そして、入出力の記録や再生も可能です。先ほどの「rosbag」が該当します。自動車の開発でも、CANのデータやカメラのデータを撮りためたものを使って、アルゴリズムの検証や開発をしますが、それと同様の機能がデフォルトで備わっています。
ノード間が疎結合
次に、2点目のノード間の疎結合です。
オープンループシミュレーションの例で、「turtlebot3_slam_***」は、実際にロボットから出たトピックそのものでなく再生されたデータも利用でき、誰から投げられたデータかを知る必要がありませんでした。そのように疎結合にできているので、ノードを入れ替えることによって、様々な変更や移植に対応できます。
たとえば、TurtleBot3には360° LiDARが付いていましたが、自分のロボットにはLiDARが付いていないので他のセンサーを使いたいという場合に、同じ「scan」というトピックを流してくれさえすれば、「turtlebot3_lds」ノードを別のものに置き換えていいわけです。たとえば、ステレオカメラや赤外線パターン投射式深度センサ(Kinectなど)に変更する場合でも、このノードを置き換えるだけで、他はそのまま動かすことができます。
また、作成したSLAMのアルゴリズムを他のロボットで使用したい場合には、そのロボットに「turtlebot3_slam_***」を組み込めば、あとの仕組みはまったく変えずに動かすことができます。逆に、「頑張ってアルゴリズムを作成したけれども、公式でとてもよいものが公開された」ようなときも、ノードを置き換えるだけで利用できます(Gmapping、Hector SLAM、Google Cartographerなどが公開されています)。
ノードを入れ替える場合、入出力トピックのタイプが同じであることが制約になりますが、ROSで標準的に定義されているメッセージタイプは洗練されて汎用性が高くなっています。ここだけ揃えればノードを入れ替えて機能を変えたり移植したりすることができるというのは、やはり大きなメリットと言えます。
参考文献
入門編の最後に、参考にした情報を挙げておきます。
書籍
- 表允晳, 倉爪亮, 鄭黎蝹『ROSロボットプログラミングバイブル』, オーム社, 2018.3
- 西田健 [ほか] 『実用ロボット開発のためのROSプログラミング』, 森北出版, 2018.10
- 近藤豊『ROS2ではじめよう : 次世代ロボットプログラミング』, 技術評論社, 2019.8
- Morgan Quigley, Brian Gerkey, William D. Smart『プログラミングROS : Pythonによるロボットアプリケーション開発』, オライリー・ジャパン , オーム社 (発売), 2017.12
- Wyatt S. Newman. A systematic approach to learning robot programming with ROS, CRC Press, c2018
ウェブサイト
- ROS公式サイト:https://www.ros.org/
- TurtleBot3 Overview:https://emanual.robotis.com/docs/en/platform/turtlebot3/overview/
次回は実践編として、自作ロボットでROSを動かした様子を、ROS技術が学べるオンライン学習Eureka Boxで無料公開しています。
2.ROS(Robot Operating System)を実際に学んでみる
ROSの技術を実際に学んでみたいという方に、まずは無料でお試しいただけるオンライン学習プラットフォームを準備しています。
業務が多忙なエンジニアでも、スキマ時間で効率的に実践的な学習が出来るEureka Boxは、エンジニアの現場の声から生まれたツールです。
ROS(Robot Operating System)を正しく理解した上で、最大限の効果を得られるようスキルアップしたい方にもEureka Boxでの学習はお勧めで、無料会員登録だけでも以下の特典が受けられます。
- 各連載コラムの全容、未公開コラムも一気にまとめて読める(一部動画解説付!)
- USDM(要求記述)、MBD(モデルベース開発)、システムズエンジニアリング、AWS Greengrass(新世代エッジエンジニアのための技術講座)など、ソフトウェア開発に関わる知識がギュッと凝縮、困った時のお助けアイテムとしても長期で活用出来る
- ソフトウェア開発に関わる無料お試しコンテンツも充実
デジタル人材が不足している今の時代、特にソフトウェア開発の現場では「上流技術」のスキルを持つ人が必要とされています。
そのスキルが効率よく身につくように設計されたのが「オンライン学習のEureka Box(ユーリカボックス)」
Eureka Boxの運営企業であるエクスモーションは、日本を代表する大手自動車メーカー、医療機器メーカー等、ソフトウェア開発の支援を実際に行っている企業だからこそ、現場で活かせる学びに焦点をあてたプログラムに構成されています。
「Eureka Box(ユーリカボックス)」を是非ご活用ください。
トップ企業をサポートしてきた技術と知見を1冊に「ソリューションガイドブック」
私達エクスモーションが行った、日本を代表する企業へのコンサルティングやトレーニングとは?
オンライン学習 Eureka Box誕生のベースとなった技術や知見が満載!
実際に支援を行ったお客様からのメッセージも掲載し、読み応えある1冊に仕上げています。
関連コラム
- 第1回 ROSとは?基本的概念とROS2が必要になった背景
- 第2回 ROSとROS2のプログラミング概念
- 第3回 ROSとは?ROSのパッケージ構成を分かりやすく解説
- 第4回 ROSアプリケーション開発のモデルケース ※本コラムで解説します
- ROS実践編、自作ロボットでROSを動かした様子とQ&A
※ROS技術が学べるオンライン学習 Eureka Box(ユーリカボックス)で公開中