はじめに
皆さん,洗濯物干したり紙飛行機折ったりフルーツもぎもぎしたりロボット飛ばしたりされていますでしょうか?
高専ロボコンでは,近年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++で書かれています(様々な理由でPythonは一旦スルーします).毎年,1年生にROSを教えることの難易度を踏まえると,技術継承コストが上がる覚悟は必要です.モダンC++を学習するならば,atcoderの入門記事をやったうえでスマートポインタを軽く触れておくといいかなと思います.https://atcoder.jp/contests/APG4b
ROS2の日本語の公式ドキュメントも少し躓く要素があります.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する - 受け取ったデータを処理して(マイコンなどを介するなどして)モータードライバーに流す
- モーターが回る
という流れで実装できれば,流れがつかめるかなとは思います.
「/cmd_velを流す=ロボットが動く」という一連の流れを体験できるでしょう.
最後に
ROSを使うにしても使わないにしても,自分が書いたコードが自己満コードにならないように注意する必要があります.
制御だけがロボコンではありません,積極的な技術交流を行うことでロボコン自体のレベルを高め,他のエンジニアに敬意を払うことを忘れずに,頑張っていきましょう.以上,yamatoでした.
