エムスリーテックブログ

エムスリー(m3)のエンジニア・開発メンバーによる技術ブログです

ROSでSLAMラジコンをつくった

エムスリーエンジニアリンググループ/BIRの滝安(@juntaki)です。 BIRはビジネスインテリジェンス&リサーチの略で、そこでは医療従事者の会員向けアンケートをベースに、製薬会社へのマーケティング支援を提供する事業を行っています。

さて、BIRの事業とはまったく関係ないのですが、先日のTechTalkでROSを使ったSLAMラジコンについて発表したので、紹介したいと思います。

デモ

www.youtube.com

赤い点がLIDARで検出した点、動いている座標原点みたいなのが初期位置と、現在のロボットの位置です。

部屋になんにも障害物がないと映像の意味がわかりにくいので、木の板で初期位置を囲っているのと、ゴミ箱を置いていたりします。また、ちょうどカメラの位置(地図だと上の方)に5本足の椅子があります。 ロボットが動くと、白黒でそれら障害物と、部屋の壁のマップが作成されていく様子がわかると思います。

ハードウェアの構成

デモでは、こういったものが床を動き回っています。

f:id:juntaki1:20200902125644p:plain

レーザスキャナ(LIDAR)は周囲の障害物の点群データがえられるセンサーで、ちゃんとしたものはかなり高価なのですが、これはAmazonで1万円くらいで購入できます。 メカナムホイールは4つの車輪の回転方向を1つ1つ変えることで、横にも進める車輪です。

電源はモーター駆動用とRaspberryPi+センサー用で分けています。

ソフトウェア構成

ROSというフレームワークを使っています*1。 OSと名前がついているものの、LinuxなどのOSとは抽象化のレベルが違っていて、実体としてはLinux上で動くユーザ空間ソフトウェアの集合体になっています。

ROS上でモジュールは「ノード」と呼ばれ、モジュール間通信を行うことで連携して1つのロボットを構成します。 ノード間の通信はPubSubで行われており、そこに流れるデータの内容はROS側が規定しているため、既存のパッケージとの統合なども容易です。 センサーは同期的に値を取るのではなく、常時有効になっていて非同期に利用できるほうが便利なケースが多くあるので、PubSubの構成は非常に理にかなっているなと思いました。

ちなみに、GoでROSノードを書く場合は下記が便利でした。

github.com

IMUノード*2や、モータードライバ、Google Cloud PubSubを転送するノードを作っています。

github.com

github.com

SLAMのパッケージはCartographerを利用したのですが、セットアップや依存パッケージの構成が難解なので、Dockerでゼロから再現できることを確認しながら進めていくほうがおすすめです。

まとめ

ROSを使ってSLAMで地図を表示できるラジコンをつくりました。ROSはPubSubを使ってモジュール間の通信を行いますが、BIRのアンケート回収のシステムも、PubSubを使ってアンケートの回収状況を集約するアーキテクチャになっています。ぜひ関連記事も読んでみてください。

We are hiring!

エムスリー、とくにBIRではGo/Reactエンジニアや、データ基盤開発に興味があるエンジニアを募集しています。社員とカジュアルにお話することもできますので、興味を持たれた方は下記よりお問い合わせください。

open.talentio.com

jobs.m3.com

関連

www.m3tech.blog

*1:実はROSにはROS2という次期バージョンがあるのですが、多くのパッケージがROS2未対応というのと、世の中のドキュメントがほぼROS1の話なので採用しませんでした。ホビーで使うにはまだROS1のほうが手軽だと思います。

*2:cartographerは2DだとIMU不要なので結局使わず