ElixirでROS 2 Client Libraryを作ったら幸せになれる（かもしれない）

この記事は「[ROSアドベントカレンダー Advent Calendar 2018](https://qiita.com/advent-calendar/2018/ros)」の21日目（2日遅れ）です

昨日は @shimoe さんの「[ROSでRTK-GNSS](https://qiita.com/shimoe/items/989c0d10acd46fb9adde)」でした．これを待望していた！

12/17(月)に開催された「[ROS Japan UG #27 勉強会](https://rosjp.connpass.com/event/111853/)」に参加された皆さま，ありがとうございました．私は今回は会場提供の一端で協力させていただきました．東海大学の関係者の皆さまに改めて感謝いたします．
東京でも関西でも，ROS JPに会場提供いただける方々を絶賛募集中です．もちろん企画ネタに発表立候補も大歓迎！！

さて今回は，こんなのやってみました作ってます的な技術ネタではありません．
よく言えば所信表明，ざっくりいえばポエムです^^;


# はじめに

先のROSJP #27では，ROSJPの主宰でもある[@youtalk](https://twitter.com/youtalk)さんから，ROS2の最新アップデートに関する発表がありました．
ROS 2のROS 1との違いや開発状況，ROS 1とのintegrationに関する情報など，めちゃくちゃ有益な資料です！

- [ROS 2 Crystal Clemmysアップデート](https://speakerdeck.com/youtalk/dds)

<div style="width: 380px">
<script async class="speakerdeck-embed" data-id="0e0f975fcbd843eb810422eba436a61a" data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"></script>
</div>

今回の記事は，このyoutalkさんの発表に触発されて端を発しています．

# ROS 1の実装言語

皆さんご存知[wiki.ros.org](http://wiki.ros.org/ROS/Introduction#Goals)に記載の通り，現行バージョンであるROS 1は，その実装言語としてPython，C++およびLispが採用されています．
また，公式にサポートされているプログラミング言語としては，JavaおよびLuaもあります．

> - Language independence: the ROS framework is easy to implement in any modern programming language. We have already implemented it in Python, C++, and Lisp, and we have experimental libraries in Java and Lua.

ROSノードやアプリケーションの開発には得意な／大好きな言語を使いたいのは，技術者の本能でしょうか？？
ROS 1システムの開発においては，PythonまたはC++が採用されることが圧倒的でしょう．[rosjava](http://wiki.ros.org/rosjava)勢も少なくないと聞きますが，Kineticでサポートが止まっているのは痛いところです．

## ちなmROSでは？？

ちなみにAdvent Calendar2日目の記事で紹介した[mROS](https://github.com/tlk-emb/mROS)は，C++でclient libraryもどきを実装しています．組込み向けですしねぇ．

- [mROSの開発環境とビルド＆実行方法：Advent Calendar 2018版](https://qiita.com/takasehideki/items/7d783ecd605dcee29ee0)

## rosgo

ところがROS 1では，通信層を管理・制御するclient libraryに階層構造がありません．このため，それに対応する機能を使いたい言語でスクラッチ実装する必要があります．

ROS 1におけるそんな取り組みの例として， [@__akio__](https://twitter.com/__akio__) さんが開発されている[rosgo](http://wiki.ros.org/rosgo)があります．GolangでROSノード開発したかったのでclientから実装しました！という勢いです．
[ROSCon JP 2018](http://roscon.jp/)でも発表がありました．


- wiki.ros.org: [rosgo](http://wiki.ros.org/rosgo)
- GitHub: [Pure Go implementation of ROS client library](https://github.com/akio/rosgo)
- ROSCon JP 2018: [Slides](http://roscon.jp/presentations/ROSCon_JP_2018_presentation_8.pdf) / [Video](https://vimeo.com/292564494)


私もakioさんと会場で直接お話しする機会がありましたが，「新しい言語でclient library実装するの，そんなに難しくないよ〜」と軽く言っていました．
この頃から本記事後段の構想はあったのですが，（いやっそんなことはないだろう，，，）というのが凡人の直感だったことを覚えています^^;

# ROS 2ではどうなったのか？

冒頭の[@youtalk](https://twitter.com/youtalk)さんの発表で，P.12にて下記の話題がありました．

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ROS2はcommon libraryのCモジュールが綺麗に分離されていて，他言語からこれを呼び出すclient libraryをとっても作りやすい <a href="https://twitter.com/hashtag/rosjp?src=hash&amp;ref_src=twsrc%5Etfw">#rosjp</a> <a href="https://t.co/JlyYb00X8h">pic.twitter.com/JlyYb00X8h</a></p>&mdash; TAKASE hideki (@TAKASEhideki) <a href="https://twitter.com/TAKASEhideki/status/1074608105260933120?ref_src=twsrc%5Etfw">2018年12月17日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

上記の通り，ROS 2ではcommon libraryが階層化され，全てのプログラミング言語に備わっているべき機能（パラメータや名前空間管理など）は，ROS Client Library (RCL) interfaceとして共通化されることになりました．

- GitHub: [rcl: Library to support implementation of language specific ROS Client Libraries.](https://github.com/ros2/rcl)
- index.ros.org: [ROS 2 Client Libraries](https://index.ros.org/doc/ros2/ROS-2-Client-Libraries/)

RCLの実装にはC言語が採用されています．どの言語でもたいていはC言語実装モジュールの呼び出し機能が備わっているということが理由でしょう．

このため，多言語でのClient Libraryがとっても実装しやすくなりました．

## ROS 2の実装済みclient library

公式開発チームではC++とPythonがサポートされています．
他のチームが開発を進めているものとして，下記の言語もリストアップされています．

- JVM and Android
- Objective C and iOS
- C#
- Swift
- Node.js
- Ada

RCLAdaはROSCon 2018でも発表がありましたね（[Video](https://vimeo.com/293310573) / [Slides](https://roscon.ros.org/2018/presentations/ROSCon2018_rcladatheadaclientlibraryforros2.pdf)）


# Elixirとは？？

さて本題です．
本能に従うなら，私は<font color="red">**Elixir**</font>を選びます！！
なお私は，ROS稼業の傍らで『[fukuoka.ex](https://fukuokaex.connpass.com/)』という（なぜか）福岡のElixirな技術コミュニティにてIoT芸人を担当しています．

Elixirは2012年に登場した新しい関数型言語で，ErlangのVM上で走ります．
Phoenixというウェブフレームワークを備えており，[次に来る大物Web言語](https://qiita.com/HirofumiTamori/items/0dfdbada30c7d8f183fd)と言われています．
/* ぶっちゃけこのへんがFF由来で格好良いところに惚れたというウワサも */

Elixirには以下の特徴があります．

- 読み書きしやすく，生産性が高い．
- 並行処理（並列処理）のプログラミングが簡単に実現できる．
- 分散システム対応／スケールしやすい．
- 軽量で耐障害性が高い．


Elixirの開発者であるJose Valimは，もともとはRubyの強力なコミッタでした．
関数型言語と言われると取っ付きにくさを感じる方もいるかと思いますが，Rubyに大きく影響を受けた記法となっており，プログラミングの生産性は非常に高くなっています．また，データ加工に特化したライブラリであるEnumを備えており，プログラミング初心者でも親しみやすい仕様になっています．

気になる方は， @piacere_ex さんの「[Excelから関数型言語マスター](https://qiita.com/search?utf8=%E2%9C%93&sort=created&q=title%3AExcel%E3%81%8B%E3%82%89%E9%96%A2%E6%95%B0%E5%9E%8B%E8%A8%80%E8%AA%9E%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC+user%3Apiacere_ex)」シリーズをご覧ください！

## 並列処理が簡単に記述できる

Elixirには，MapReduceに基づく並列処理ライブラリであるFlowを備えています．また，関数の結果を次の処理の関数に渡すパイプライン演算子を備えています．
これらの仕様によって，マルチコア／メニーコア時代の並列アプリケーションをさくっと記述できます．データフロー型の処理を実現でき，また，実行モデルの由来で並列性能も最大限に発揮できます！

詳細は @zacky1972 先生の[こちらの記事の解説](https://qiita.com/zacky1972/items/c4ae3f34a4406ee99487#elixir-%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E4%B8%A6%E5%88%97%E5%87%A6%E7%90%86)をご参照いただくのが良いかと！

## 耐障害性と分散システム対応

ElixirではGCなどのメモリ管理はプロセス単位で独立しています．
基本的に例外が発生しても例外をrescueせずにプロセスごと落ちるように設計しておき，監視プロセスにより該当プロセスを再起動することで復旧させることが一般的です．これにより，煩雑なtry/rescueによる例外処理を記述することなく，シンプルに障害復旧をすることができます．

また，Elixirで記述された変数の実体は基本的に一度値が決まったら不変である，すなわちイミュータブル性を備えています．
このため，並列処理をした時に値の同期や排他制御をする必要がなく，並列処理性能が向上します．また，イミュータブルであるからこそ，プロセスごとに変数をコピーしても問題がなくなるので，メモリ管理をプロセスごとに閉じることができます．

（この辺りの説明も @zacky1972 先生の記事から引用しましたm(_ _)m

# おわりに


こういった上記の特徴って，IoTだけじゃなくって，分散ロボットでも活きると思いませんか？？
ということで，2019年には，**『ElixirでROS』**の世界を実現すべく動きたいと思います！！という技術ポエムでした．

とはいえ所信表明したからには走り出さないといけません！！
おー『ElixirでROS』とかめっちゃおもろいやん！？という方がいましたら，ぜひ協力して進めませんか？ご連絡をお待ちしています！！


来年はROSCon本体にProposal通したい〜〜
（JPではAcceptいただいたmROSは玉砕しましてん><;