2021年12⽉18⽇(⼟)
NEDO特別講座 講習会

第１部︓NEDO特別講座
およびROSの概要

国⽴研究開発法⼈産業技術総合研究所
インダストリアルCPS研究センター
ソフトウェアプラットフォーム研究チーム⻑

安藤慶昭

1

はじめに

• NEDO特別講座について• ROS概要• ROSの基礎

2

NEDO特別講座について3

ロボット活⽤型市場化適⽤技術開発プロジェクト
未活⽤領域へのロボット導⼊拡⼤

ロボット数・システム数

社内SIer

ロボットのプラットフォーム化により需要を束ねることでコスト的に⾒合うビジネスに転換

保守要員

⼤企業
社内SIerを擁する企業

伝統
的
市場

既活⽤領域
||
少数の⼤規模な需要

⼩品種⼤量⽣産

未活⽤領域||
多様で⼩規模な需要

本プロジェクト

中⼩・中堅企業
社外SIerが開発

中⼩・中堅企業
現場作業者が操作

プラットフォーム化
Easy to develop化

プラットフォーム化
Easy to use化

ロングテール

モノづくり・三品産業

対物サービス

⽣活⽀援…

需要種別

4

市場化プロジェクト実施体制
RRI（ロボット⾰命イニシア
ティブ協議会）WG3における議論を経て2017年度から開始

ハードウェアコンソーシアム
カワダロボティクス

富⼠ソフト
⽇本電産

川崎重⼯

YOODS

東芝

セック・THK
名城⼤事業期間• 2017〜2019年度
2017年度公募・採択
ハード開発事業者（7事業者）• カワダロボティクス• 富⼠ソフト・⽇本電産• 東芝• セック・THK・名城⼤• 川崎重⼯• YOODS• パナソニック
ソフト開発事業者（5事業者）
• 産総研
• 東⼤
• TORK• イーソル• JQA

パナソニックライフ
ロボティクス

ソフトウェアコンソーシアム

5

ロボットのプラットフォーム化とは
東芝 パナソニック

SI部分

共通基本機能を活⽤し個別アプリ部分を開発

店舗在庫監視

パーソナル
モビリティ

POS
連携

安全機能

移動系
基本機能

ハード事業者が開発（競争領域）

プラットフォーム
共通基本機能層＝共通利⽤が可能な基盤ソフトウェア層

ソフト事業者が開発（協調領域）

配⾞
管理

富⼠ソフト
⽇本電産

移動・腕連携

移動系
基本機
能移動系
基本機能

移動系基本機能群
障害物回避

⾷品
ハンドリング

組⽴作業

配⾞
管理

持ち替
制御
アーム系
基本機
能

アーム系基本機能

位置
推定

経路⽣成

ティー
チング

プラン
ニング

地図
作成

経路追
共通部分はPF化 ジョグ
従制御（ソフト事業者が開発）制御

指定経
路追従

川崎重⼯

衝突
回避

移動・腕連携
アーム系
基本機
能持ち替
制御
ビジョン系
基本機
能

ｱﾌﾟﾘｹｰｼｮﾝ実証
試験⽤検証SW
適合性検証
共通基本機能群から組み込みビジョン系基本機能
画像
処理

物体
認識

3次元
点群

ソフトウェアコンソーシアムにて新規開発または既存モジュールを拡張

ソフト・ハードともに「ベース機能」＋「オプション機能」＋「個別開発」でアプリケーション開発可能にすることで、SIコスト削減、分業促進

6ソフトウェアコンソーシアムの取り組み

プラットフォーム領域

機能要件

アプリケーション
マニピュレーション

ナビゲーション

品質保証済みパッケージ

品質保証済み
パッケージ

ビジョン

運⽤
ﾒﾝﾃﾅﾝｽ機能

品質保証済みパッケージ

ミドルウェア
品質保証済み
パッケージ

ROS1

組込み対応
ROS1/ROS2

・テスト・検証に関するエビデンス
・モジュールの性能指標
・ドキュメンテーション
・共通インターフェース仕様ROSコード解析・品質改善
保守・維持管理体制検討

•••••
•

構成管理機能

安全監視
機能
（未実現）

ｾｷｭﾘﾃｨ
機能（未実現）

分野⾮依存の共通機能

OS

⾮機能要件

AIクラウド連携機能

ROS2

ツールチェーン機能
安全

eMCOS POSIX

・教育・コミュニティー
・安全規格とのマッチングに関するガイドライン
・ライセンス・特許に関するガイドライン
・⻑期的な保守・運⽤体制

ロボット安全設計開発
ロボットソフトウェア特許・ライセンス
ロボットソフトウェアアーキテクチャ
ロボットシステム開発プロセス・品質管理
次世代ロボット実装⼿法
移動ロボット評価指標ｓ

安全対策⽀援調査検討6委員会
7

（成果物）詳細ドキュメント
MoveIt! 詳細ドキュメント
https://robo-marc.github.io/moveit_documents/
Navigation Stack 詳細ドキュメント
https://robo-marc.github.io/navigation_documents/
システム・ノードの仕様レベルまで解説することで、詳細を知らないソフトエンジニアでも利⽤可能に。
ROSコード改善プロジェクト
https://github.com/robo-marc /ros_comm
ROS、MoveIt!, NavigationStack等のコードを静的解析
ツールで解析、バグ、記述上の問題点を調査し、改善、本家へフィードバック
RobotWebTool拡張
https://github.com/robo-marc /visualization_rwt
ブラウザからROSシステムの操作・モニタなどを⾏う
RobotWebToolsを拡張、GUI部品等を追加。Webベースでのシステム構築効率を向上させた。

https://github.com/robo-marc
をぜひご覧ください。
8

（成果物）簡単に試せる NEDO講座 ROS セット

USBメモリROS Kinetic ＋川崎重⼯、富⼠ソフト、カワダロボティクス、THKのロボットモデルを動かせます︕︕
Melodicへアップデート
9

iRex2019成果デモンストレーション

多数のロボットをROSおよび共通IFで制御
10

ROS概要11

ロボットミドルウエアについて• ロボットシステム構築を効率化するための共通機能を提供する基盤ソフトウエア– 「ロボットOS」と呼ばれることもある– インターフェース・プロトコルの共通化、標準化– 例として• モジュール化・コンポーネント化フレームワークを提供• モジュール間の通信をサポート• パラメータの設定、配置、起動、モジュールの複合化（結合）機能を提供• 抽象化により、OSや⾔語間連携・相互運⽤を実現• 2000年ごろから開発が活発化– 世界各国で様々なミドルウエアが開発・公開されている
12

ROS(Robot Operating System)

13

Willow Garage• Willow Garage– 2007年設⽴のロボットベンチャー（⽶、Menlo Park）– 2014年事業停⽌– Scott Hassanが出資• googleの初期エンジンの作者の⼀⼈– ビジネスモデル• ソフト︓ROS（無償）＋ハード︓PR2 を販売• PR2を10台無償で⼤学などに配布• スピンアウト創出を狙う

Industrial Perception, Inc.

14

ROS（Robot Operating System）
概要︓
Ø ⽶国ベンチャー Willow Garageが開発したロボット⽤OS。
Ø 2007年から開発開始。
Ø オープンソースとして広くソースコードを公開。
Ø 現在はOpen Roboticsが管理。
Ø ロボット機能要素（センサ、モータ、アーム、移動機能）をモジュール化。個別に動くプ
ログラムを連携する通信部分を提供。（RTMとコンセプトは同じだが、リアルタイム・密結合機能はない）
Ø Linuxのソフトウェア管理機構を活⽤し（Linuxに慣れた⼈なら）インストールが容易。
ユーザ︓
Ø Savioke、Fetchロボティクス、Clearpath Robotics、トヨタなどがロボット⽤OSとして採⽤。
Ø学術分野ではデファクトスタンダードとなっている

特徴︓
Ø Ubuntu Linux†上で動作（コマンド⼊⼒による操作が基本）。

rviz

Ø 他のOSは公式にはサポートしていない

Ø キラーアプリケーションにより⼈気獲得Ø rviz:ロボットの様々な状態を3Dで表⽰
Ø MoveIT!: アームの軌道計画
Ø Navigation Stack: 地図作成・経路計画

Ø 現在次バージョン︓ROS2に移⾏中

Ø RTM同様の密結合・リアルタイム機能含む
Ø 通信はOMGのDDS標準を利⽤（RTMと互換性有）MoveIT!

15

aiboにおける利⽤• aibo– 新AiboではOpen-RではなくROSを利⽤している模様• ROS kinetic（バージョン） を利⽤– 約500以上のオープンソースソフトウェア（ROS含む）を利⽤している• ライセンスをWebサイト上で明記• ROSに対して⼿を加えている– 通信効率化の追加モジュール開発• SDK（ソフトウェア開発キット）– 将来的にユーザに提供– ROSベースSDKの予定

http://oss.sony.net/License/ERS-1000/
16

ROSの情報を得るには︖
ROSに関連する情報は以下の場所にまとまっています。
• ROS Wiki: http://wiki.ros.org/ja– 様々な情報がwiki上に集約されている• ROS Discourse: https://discourse.ros.org/– 掲⽰板、メールでも読むことができる• Qiita: https://qiita.com/search?q=ROS– 様々な⼈が解説、導⼊記録等をあげている。体系的ではないが、⾃分と同じトラブルの場合にはたいへん役に⽴つ。

• Slack: ROS Community, ROS Japan UG などがあります。
• その他、検索すると様々な情報がでてきます。特に、エラーが起こった場合は、まず エラーメッセージ をそのまま検索窓に⼊れて検索してみましょう。
17ROS リリース履歴• DISTRO (=Distribution)– 配布パッケージのこと– バージョンごとに名前がついている。(⻲に関係がある)– DISTRO nameは覚えておいた⽅がよい。

現⾏Distro: http://wiki.ros.org/Distributions• Kinetic (Kinetic-Kame)– Ubuntu 16.04対応版– 現⾏で⼀番古いが、まだユーザが多い– 2021年4⽉まで• (Lunar Loggerhead)– 2019年5⽉サポート終了• Melodic (Melodic Morenia (ビルマメダマガメ))– Ubuntu 18.04対応版– 次第にこちらに移りつつある– 2023年5⽉まで• Noetic (Noetic Ninjemys (メイオラン科のカメ))– 推奨版– Ubuntu 20.04対応版– 2025年3⽉まで

カメにまつわるコードネーム
頭⽂字はアルファベット順
18

ROS2
【ユースケースの変化】• 複数のロボット• 組込みCPU• リアルタイム• 理想的でない通信環境• 製品向け使⽤• あらかじめ規定されたパターンにのっとった構造化したシステム構成【ROS1では】• 単体のロボット• 強⼒なCPU• ⾮リアルタイム• 途切れない通信環境• 研究向け• ⾃由な枠組み（main関数）【新たな技術】• Zeroconf (avahi, bonjour, UPnP等)• Protocol Buffers• ZeroMQ (and the other MQs)
• Redis(次世代⾼速key-valueデータストア)
ROSを⼤幅に改良したROS2への移⾏を発表• WebSockets（ROSとの互換性はない）• DDS (Data DistributionService).
http://design.ros2.org/articles/why_ros2.html
19

ROS2
• 通信︓DDS(OMG標準のpub/sub通信ミドルウエア）– ミドルウェア層を作製し複数のDDS実装（製品も含む）を使えるように– 単⼀障害点がない（ROS1ではmasterが落ちると×）– QoS制御が可能に(History, Depth, Reliability, Durability)• コンポーネントモデルを導⼊• 複数のOSに対応（Windows、MacOS）• ROS1とはブリッジで通信– 直接は通信できない、互換性なし• セキュリティ対応（DDSセキュリティを利⽤）• リアルタイム実⾏可能（Linuxのみ）• 組込み対応

http://design.ros2.org/articles/ros_middleware_interface.html
20

ROS1→ROS2へ• NASAの仕事を請け負った時に、独⾃形式のROSmessageはNASAでは使えないから、プロトタイプをROSで実装後にすべて作り直した• NASAでは何らかの標準に準拠したものでないと使えない。その時は結局DDSを使⽤した。
• それ以外にもROS1では、1ノード1プロセス、コンポーネントモデルがないので、モデルベース開発にならない、ROS masterがSPOFになっているなど不都合な点が多々ある• それ故、ROS2ではこれらの問題点を克服するため全く新しい実装にする予定。

21

DDS (Data Distribution Service)• OMG(Object ManagementGroup)で標準化されたpubsub型データバスミドルウェア• Pub/sub型通信– トピックが同じ送受信者間でデータが配信される仕組み• SPOF（単⼀障害点）がない
discoveryメカニズム• OMGのミドルウェアTF(MARS)
で最もアクティブに活動しているTFで策定– 関連標準仕様は10程度

22

ROS2ノードライフサイクル

初期状態

onConfigure:[FAILURE]

Configuringconfigure()create()do / onConfigure()

onConfigure:[SUCCESS]

onActivate:[FAILURE]

Inactive

Error Raised

Unconfigured

待機状態

cleanup()
onCleanup:[SUCCESS]

do / onCleanup()
Error RaisedonError:[SUCCESS]

shutdown()

onDeactivate:[SUCCESS]

shutdown()

ErrorProcessing
do / onError()onError:[FAILURE]

activate()

CleaningUp

Deactivating

Activating

do / onDeactivate()

do / onActivate()

Error Raised

Error Raised

Error Raised

onActivate:[SUCCESS]

ShuttingDown
do / onShutdown()

deactivate()
desstroy()

終了状態

Finalized

onShutdown:[SUCCESS]

shutdown()

ActiveError Raised

外部からのトリガによる遷移

動作状態

処理結果による遷移過渡状態を状態とみなしている以外はRTCをほぼ同じ
エラー処理が明確に、終了処理が⼀体になっている
23

ROS1とROS2のロジック実⾏⽅法の違い
ROS1
モジュール
（ノード）の粒度
⼤ROS2
モジュール（ノード）の粒度
⼩センサRTC
ロータリー
エンコーダ等制御器RTC-アクチュエータRTC

1+ Kp
TI sモータ等

TDs

ロジック

ロジック
main()

main()

ロジック
main()

ノードの実⾏タイミング・順序は制御できない
複数のノードを密結合してリアルタイムシステムを構成できない

センサRTCロータリー
エンコーダ等ロジック
実⾏

制御器RTC-

アクチュエータRTC

1+ Kp
TI sモータ等

TDs
ロジック

ロジック

実⾏

実⾏

Executor

ノードの実⾏タイミング・順序をExecutorで決定できる複数のノードを密結合してリアルタイムシステム化可能24

ROS2 リリース履歴• Ardent Apalone (2017.12)– コードネーム︓Ardent(熱烈) Apalone (アパロンカメ、北⽶原産のスッポン科のカメ）• Bouncy Bolson (2018.6)– コードネーム︓ Bouncy（弾む） Bolson (メキシコゴファーガメ、Bolson tortoise)• Crystal Clemmys (2018.12)– コードネーム︓ Crystal(透明な) Clemmys (キボシイシガメ Clemmys guttata)• Dashing Diamemata (2019.5→2021.5)– Dashing(⾛る) Diademata (カンムリヤマガメ（Rhinoclemmys diademata))– Componentノードの推奨、OMG IDL 4.2利⽤開始, MoveIt!2 alpha• Eloquent Elusor• Rolling Ridley: スナップショット開発版• Foxy Fitzroy (2020.6→2023.5)– Foxy (狐のような) Fitzroy (ハヤセガメ (Fitzroy River turtle))– バグ修正、雑多なAPI改善, Security Enclave機能（同⼀IDのノードのみのアクセス制御）• Galactic Geochelone (2021.5→2022.11)– Galactic (銀河の) Geochelone (ゾウガメ)– デフォルトのDDSがGalactic Geochelone（ADLINK社製）へ変更– Nav2 (navigation stack for ROS2)の強化• Humble Hawksbill (2022.5?)

ROS1同様にカメにまつわるコードネーム
25

ROSの基礎

26

ROS⽤語• ノード– モジュールプログラム、通常は実⾏可能な⼀つのプログラムとして、ソースおよびバイナリが提供される• パッケージ– ノードや設定ファイル、コンパイル⽅法などをまとめたもの• メッセージ– ノード間でやりとりするデータ• トピック– ノード間でやりとりするデータのラベル、同じトピック名を持つ出⼒と⼊⼒はデータがやり取りされる
同⼀トピック間のポートは⾃動で接続

ROS
ノード

トピック
velocity

トピック
velocity

トピック
velocity

トピック
position

ROS
ノード
ROS
ノード
ROS
ノード
27

ROSの仕組み• マスター︓ノードの参照やトピッ
クを保持するネームサービス– システム全体で原則⼀つ→SPOF（Single Point of Failure）– 他のノードより先に起動しなければならない• パラメータサーバ︓ノードのパラメータを保持するデータ
ベース– マスター内で動作、ノードからはXMLRPCでアクセス• rosout: ノードに対してstdout,stderrのような役割を果たす

Node0:…
Node1:…
Node2:…
:
Topic0:…
Topic1:…
Topic2:…
:

原則マスターは1つ他のノードより先に起動しなければならない#拡張機能でﾏﾙﾁﾏｽﾀｰも可

ROS
マスター

パラメータ
サーバ
/rosout

ノード参照・
トピックを登録ROS
ノード

XMLRPCで通信

同⼀トピック間のポートは⾃動で接続
ROS独⾃プロトコル

ROS
ノード

28

ROSによるノード開発の流れ• ワークスペース作成︓– ⾃作パッケージを置く場所– 通常ホームdir直下の “~/catkin_ws”とすることが多い– ⾃分で作る必要あり• mkdir catkin_ws• cd catkin_ws ; catkin build ← WS初期化• パッケージ作成︓– ワークスペースいかにパッケージを作成する

Catkinのワークスペース構成~/catkin_ws/ ←このディレクトリでビルド+ .catkin_workspace+ build/+ devel/+ src/+ CMakeLists.txt ←最上位のcmake file
+ PackageA/+ CMakeLists.txt+ package.xml ←マニュフェスト
+ include+ パッケージ名+ インクルードファイル+ src/ ← ソースファイルディレクトリ
+ ソースファイル• catkin create pkg my_pkg <opt>– パッケージ名は⼩⽂字と”_”のみ• ビルド:– catkin build でビルド

• cd ~/catkin_ws• catkin build <package name>29グラフリソース名• グラフリソース名– ノード名、トピック名、メッセージタイプ名、サービス名などに付与するユニークな名前– “/” から始まり、”/”で区切られて階層化される– /<name0>/<name1>/<name2>/…

• 相対名– デフォルトの名前空間が指定されている場合 <名前空間名>/<リソース名> で指定可能– 先頭に”/” がつかないことで区別される– 環境変数 ROS_NAMESPACE で指定したり、launchファイルで <node ns=“名前空間” />で指定することができる• プライベート名– “~” から始まる名前、ノード内でプライベートな名前空間• アノニマス名– 多数のノード名を⾃動でつけたい時などに使⽤– Ros::init()の引数にinit_options::AnonymousName を指定することで、⾃動的にノードtype名＋時刻で⼀意な名前を⾃動でつけてくれる
rxgraphの出⼒例

30

ROSのビルドツール (catkin)• ROSノードをビルドするツール– ROSは独⾃のビルド・パッケージツールを提供している。ROSの特徴の⼀つ。様々なソフトウェアを効率よく管理・ビルド・配布することができる。

• rosbuild– 廃⽌された最初のROS⽤ビルドツール• catkin (ヤナギなどの尾状花序)– 現⾏のROS⽤ビルドツール

ROS2以降• ament (ヤナギなどの尾状花序)– 最初のROS2⽤ビルドツール– 現在は表向きは次のcolconが利⽤されているが、内部的にはamentが使われている模様• colcon (collective construction)– ROS2⽤ビルドツール– メタビルドツール、内部的に⽤途ごとに適切なビルドツールを呼び出す– https://colcon.readthedocs.io/en/released/

31

ROSの起動ツール (rosrun/roslaunch)• ROSノード（群）を起動するツール– ROSは独⾃のビルド・パッケージツールを提供している。ROSの特徴の⼀つ。様々なソフトウェアを効率よく管理・ビルド・配布することができる。

• rosrun– ROSノード（1個）を起動するコマンド• roslaunch– ROSノード群（複数）を起動するコマンド– Roslaunch <package> <launch_file>32

roslaunch launch file
ROS launchファイル例<launch><arg name=“mode” default=“true”><group if=“$(arg mode)”><node name=“インスタンス1” pkg=“パッケージ名” type=“ノード名” output=“出力先”/></group><node name=“インスタンス名2” pkg=“パッケージ名” type=“ノード名” output=“出力先”><remap from=“改名前トピック名” to=“改名後トピック名"/><param name="content" value=“hogehoge"/></node></launch>•

XMLファイルとして記述•<node>タグ︓起動するノードを指定••<remap>タグ: トピック名を変更 from, toで改名前後のトピック名指定<arg>タグ︓roslaunch起動時にとる引数を宣⾔可能•<group>タグ︓グルーピング•<param >タグ︓パラメータ指定–<launch>タグで囲む––––

Name: インスタンス名、同⼀ノード名でも別名をつけて複数起動させることができる
Pkg: パッケージ名
Type: ノード名
Output: 出⼒先、screen で標準出⼒に出⼒される、複数のノードの出⼒を標準出⼒に出⼒可能–

nameで引数名、defaultでデフォルト値を指定–––

If⽂でargの引数をとることができる
上の例では、mode=falseを指定すると“インスタンス名1”のノードは起動しない
Ex. roslaunch <パッケージ名> <launchファイル>.launch mode:=false ← インスタンス名1を起動させない––

コード内であらかじめ定義されているパラメータを起動時に指定する
Ex. contentという名前のパラメータ(string型) に “hogehoge” を代⼊33MoveIt!とは︖• MoveIt!

– マニピュレータ（ロボットアーム）のためのモーションプラニングのフレームワーク・ライブ
ラリ– ⽬的の⼿先位置・姿勢を与えると、マニピュレータの⼿先の現在位置・姿勢から⽬的位置・姿勢までの経路を⾃動的に計算する– 計算結果に基づき、実際にマニピュレータを制御し移動させる– 障害物の情報があらかじめ与えられている場合、それらにぶつからない経路を計算することができる。

プランニングシーン
プランニングIF

衝突検出• ROS、rviz– MoveIt!には、ROSでMoveIt!利⽤するのに便利なパッケージ・ノード群っが提供されている。
– ROSの可視化ツールrvizと連携し、ロボットの実機がなくても、プランニング結果をアニメーションで表⽰することが可能– rviz上からGUIでMoveIt!でロボットの操作が可能• MoveIt! Commander– MoveIt!をコマンドラインから使⽤するインターフェースros pkg

MoveIt! pkg

提⾔• ⾃前主義はやめよう︕︕– 書きたてのコードより、いろいろな⼈に何万回も実⾏されたコードのほうが動くコードである︕︕– ⾃分にとって本質的でない部分は任せて、本当にやりたい部分・やるべき部分のコードを書こう︕︕– 誰かがリリースしたプログラムは⼀度は動いたことがあるプログラムである︕︕– ⼈のコードを読むのが⾯倒だからと捨ててしまうのはもったいない︕︕• オープンソースにコミットしよう︕︕– 臆せずMLやフォーラムで質問しよう︕︕– どんなに初歩的な質問でも他の⼈にとっては価値ある情報である。
– 要望を積極的にあげよう︕︕– できればデバッグしてパッチを送ろう︕
35