はじめに
皆さん,洗濯物干したり紙飛行機折ったりフルーツもぎもぎしたりロボット飛ばしたりされていますでしょうか?
高専ロボコンでは,近年ROSを導入する高専が増加傾向にあります.(独自研究)
そのため,本記事では高専ロボコニストに向けて,ROSを導入するメリット・デメリットを踏まえた上でどこから始めればいいか,何をすればいいかということを個人の思想強めで書いていきたいと思います.初学者には難しい単語にはカッコで補足していますが,おおよそかなりざっくりとしているので鵜呑みにしないでください
ROSとは
出来なかったことが出来るようになる魔法のツールではありません.
当然,足回りだけのロボットが飛んだりはしませんし,勝手にPID(位置や速度を制御するときに便利なやつ)を完璧に調整してくれるわけでもありません.
コントローラーや他ロボットとのTCP/IP通信(WiFiとかで通信するやつのこと)くらいなら,高専1年生レベルでもソケット通信を使って実装することが出来ます.
SLAM(環境地図を作成しながら自己位置推定を行うこと)だってやろうとすればROSなしでも出来るでしょう.
ログ保存だって,fprintf(指定した場所にprintfできる関数)で好きな保存先を指定してやれば,それだけで最低限のことは出来ます.
でも,ROSを使えば楽できます.
コントローラーの入力を複数の端末に送りたいとしたら?
LiDAR(周りの物体までの距離がわかるセンサ)の値を受け取るとこからSLAMして経路生成するとこまで来月までにやりたいとしたら?
様々な端末のログを管理して,再生することで挙動を再現したいとしたら?
自前で実装することも不可能ではないでしょうが,それの品質保証やデバッグまでをすることは難しいでしょう.
そういうときに,楽をするためのツール,それがROSです.(個人の見解です)
ROSはここがスゴい‼️
- 高機能を備えた通信システム
- ビルド・デバッグ・シミュレーションに便利なツール
- 豊富なライブラリ
- それらに対するコミュニティの保守管理
大抵の人は自分の書いたコードを100%信頼できるほど自信家ではないので,既に実績を持つライブラリを利用することを好むでしょう.そういうときに,ROSという統一されたアーキテクチャを持つことで,複数を同時に,簡単に導入できるわけですね.
これは,自分でコードを書くときも同様です.
- Aさんが書いた展開機構のプログラム
- Bさんが書いた足回り機構のプログラム
- Cさんが書いたコントローラーの値を受け取るプログラム
これらを同時に動かしたいときはどうすべきでしょうか?
もしかしたら,Aさんはコントローラーの各キーの値が格納された構造体を関数の引数のポインタで受け取る形式で,Bさんはソケット通信で受け取る形式かもしれない.そもそもCさんは,共有メモリを扱う予定かもしれない.
そこに,ROSという統一されたアーキテクチャが存在するならば,「/joy/にsensor_msgs/Joyという形式で値をpublishするよ!」という前提のもとに,彼らが互いを気にすることなく,独立したプロセスでプログラムを実行することができる.
これはROS自身だけでなく,同じシステムを扱うことのメリットではありますが,ROS側でそれらの通信やビルド,スケジューラーなどを保証してくれることがあってのものです.
長々と書きましたが,まずは「他人が書いたプログラムを簡単に使える」とか「通信が楽」くらいの印象でいいと思います.
ROSはここがキツい‼️
- モダンC++に対する理解が必要
- 日本語の公式ドキュメントがチョット...
- マイコン周りは厳しめ
ROSはたいていモダンC++で書かれています(宗教上の関係でニシキヘビはスルーします).1年生に,毎年ROSを教えることが出来るのかとか,技術継承コストが上がる覚悟はある程度必要です.atcoderの入門記事をやったうえでスマートポインタを軽く触れておくといいかなと思います.https://atcoder.jp/contests/APG4b
日本語の公式ドキュメントもちょっと怪しい節があります.https://ouxt-polaris.github.io/ros_handson/ などの,やさしいひとたちが書いてくださった解説記事などを読むといいかなと思います.
あとは最後に,マイコンの通信はちょっとROS通信だと難しいかもしれません.ROSはあくまでもTCP/IP通信とかを基調にしたものなので,マイコンとのCAN通信やSPI通信,EtherCATあたりは行うことが出来ません(多分).mROSなどのアプローチも存在していますが,今回は割愛します.つまり,ROSとマイコンを繋ぐプログラムを自前で実装する必要があるかも,というところです.
https://github.com/Ayrton2718/CSMBus-Document あたりの,csmbus for ROS2とかがある程度参考になるかなと思います.
追記(令和7年9月13日) https://zenn.dev/legityew/articles/080680f2539068 も良かったです!
導入について
既に詳しい記事がたくさんあるので詳しい方法は割愛します.
ただ,PCのOSはubuntu 24.04, ROSバージョンはJazzy または
PCのOSはubuntu 22.04, ROSバージョンはHumble
あたりにしておくのが無難です.(2025年現在)
まずなにしよっかな...
ROS2を導入してみたいけど,まず何から手をつければいいか分からない...という人には,「簡単な実物の足回りを/cmd_velで動くようにする」あたりを目標にしてみるのがいいと考えています.
-
/cmd_velをsubscribeする - 受け取ったデータをチョメチョメして(マイコンなどを介するなどして)モータードライバーに流す
- モーターが回る
という流れで実装できれば,流れがつかめるかなとは思います.
1年生教育などで,「/cmd_velを流してみよう!」という感じで,publishするとロボットが動く!という一連の流れを体験させることにも繋がります.
さいごに
ROSを使うにしても使わないにしても,自分が書いたコードが自己満コードにならないように気をつけましょう(17敗).楽しむことも大切だけどね
制御だけがロボコンではありません,積極的な技術交流を行うことでロボコン自体のレベルを高め,他のエンジニアに敬意を払うことを忘れずに,頑張っていきましょう.以上,yamatoでした.
