ABEJA Tech Blog

中の人の興味のある情報を発信していきます

Mentor Pi メカナムホイールを ROS 2 で動かす 〜 macOS 上のシミュレーション環境構築とフロンティアベース探索による検証

導入

ABEJA でインターンをさせていただいている青木です。 本記事では、インターンの成果として「メカナムホイールを搭載した 4 輪ロボット Mentor Pi (Mecanum) を ROS 2 で動かし、macOS 上でシミュレーション・探索まで行う環境を整える」という取り組みを紹介します。

私のロボットに関する記憶として、ポケモンのデオキシスの映画で出てきたホットドックが買える移動販売機のようなものが、幼い自分にとって魅力的に映った記憶があります。移動型のロボットは汎用性が高く、これからさらに普及していくであろうと思っています。

そんな中で出会ったのが、Hiwonder 社が提供する 4 輪メカナムホイールロボット「Mentor Pi (Mecanum)」です。全方向移動が可能なメカナムホイールと、ROS 2 による柔軟な制御を組み合わせることで、シミュレーションから実機検証まで一貫して試せるプラットフォームになり得ると感じました。

本記事では、Mentor Pi の概要紹介から、ROS 2 を用いたシミュレーション環境(macOS 上)と実機環境の構築、さらに SLAM の自動探索をfrontier exploraitonで検証するまでの流れをまとめます。

目次

Mentor Pi とは?

Mentor Pi(メンター・パイ)は、Raspberry Pi 5 を搭載した教育・開発向けの ROS 2 対応ロボットプラットフォームです。HiWonder 社が提供しており、Mecanum ホイールを持つ MentorPi-M1 と、Ackermann ステアリングの MentorPi-A1 の 2 つの車体バリエーションが存在します。どちらも TOF LiDAR や 3D 深度カメラなど高性能なセンサーを備え、環境マッピング(SLAM)、ナビゲーション、経路計画、画像認識、ビジョントラッキング、人間とロボットのインタラクションなどの高度な機能を実装できます。ROS 2 を基盤とすることでロボット制御やセンサーデータ処理、パッケージの利用が容易になるほか、標準的なツールやライブラリの活用も可能です。付属アプリやワイヤレスコントローラでの操作もサポートされ、教育用途から研究・プロトタイピングまで幅広い用途に対応しています。

ROS 2 とは?

ROS 2(Robot Operating System 2)は、ロボットアプリケーション構築のためのオープンソースソフトウェアフレームワークです。正式には「ロボットオペレーティングシステム」と名付けられていますが、実際には Linux や Windows 上で動作するミドルウェアおよびライブラリの集合体であり、ロボットの制御やセンサーデータ処理、通信機能を効率的に実装するための基盤を提供します。ROS 2 は旧来の ROS(ROS 1)の設計上の制約を克服するために再設計され、分散ノード間の通信に DDS(Data Distribution Service)を採用し、リアルタイム性、セキュリティ、マルチプラットフォーム対応の向上が図られています。また、C++ や Python、Rust など複数の言語で開発可能で、トピックやサービス、アクションといった通信モデルにより、センサーや制御アルゴリズムなどのモジュールを独立して組み合わせられます。現在は産業用ロボット、研究開発、教育、自律移動ロボットなど幅広い分野で利用されています。

sakigake-robo.com

macOS 上のシミュレーション環境について

今回、Mentor Pi の実機とできるだけ環境を揃えたかったため、ROS 2 とセンサーを macOS 上でシミュレーションできる環境を探していました。macOS 上で ROS 2 のシミュレーション環境を構築する際、いくつかの選択肢を検討しました。以下、検討した 3 つのシミュレーション環境について、それぞれの特徴と macOS での利用における課題をまとめます。

MuJoCo

MuJoCo(Multi-Joint dynamics with Contact)は、物理シミュレーションエンジンとして強化学習の研究開発で広く使われているシミュレーション環境です。XML 形式でロボットモデルを記述でき、高精度な物理演算と高速なシミュレーションが可能です。強化学習のベンチマーク環境としても定評があり、多くの研究で採用されています。

実際に XML ファイルを記述して Mentor Pi のモデルを動かしてみたのですが、以下の課題がありました:

  • センサー類の不足: LiDAR や深度カメラなどの ROS 2 でよく使われるセンサーのモデルやプラグインが限定的で、実機に近いセンサーデータを取得するのが困難でした
  • ROS 2 との統合の難しさ: MuJoCo は ROS 2 との直接的な統合が弱く、センサーデータを ROS 2 のトピックとして配信するためのブリッジ実装が必要でした。実機との互換性を重視する本プロジェクトでは、この追加の開発コストが課題となりました

そのため、ROS 2 との統合を優先する本プロジェクトでは、MuJoCo は採用を見送りました。

Gazebo

Gazebo は、ROS 2 と最も親和性の高いロボットシミュレーション環境の一つです。ROS 2 の公式サポートも充実しており、多くの ROS 2 パッケージ(TurtleBot3 など)が Gazebo 用のモデルを提供しています。LiDAR、カメラ、IMU など、実機でよく使われるセンサーのプラグインが豊富で、実機に近い環境を構築しやすいのが特徴です。

しかし、macOS での利用には以下の課題がありました:

  • macOS との相性の問題: Gazebo は主に Linux 環境を想定して開発されており、macOS での動作は不安定な部分があります。公式の macOS サポートも限定的で、ネット上の情報の多くが Linux や Windows 向けの記事となっています
  • 環境構築の複雑さ: Docker などで環境を構築しようとしても、TurtleBot3 などのパッケージのインストールでエラーが発生し、環境構築に時間がかかりました

最終的には、pixi というパッケージマネージャーを使って Gazebo と ROS 2 の環境を構築する方法を見つけ、この方法でシミュレーションを実現しました。pixi を使うことで、macOS 上でも比較的スムーズに Gazebo と ROS 2 の環境を整えることができました。

zenn.dev

Webots

Webots(webots.cloud)は、Cyberbotics 社が開発する商用・教育用のロボットシミュレーション環境です。豊富なロボットモデルライブラリ、多様な環境・タスク、そして ROS 2 との連携機能が充実しています。GUI が直感的で使いやすく、教育用途から研究開発まで幅広く使われています。

macOS での利用については、以下の課題がありました:

  • macOS でのセットアップの複雑さ: Webots 自体は macOS をサポートしていますが、ROS 2 との統合を macOS 上で行う場合、UTM(仮想マシン)などを経由する必要があるなど、セットアップが複雑になる可能性があります

  • 情報の不足: macOS 上で Webots と ROS 2 を連携させる具体的な手順やトラブルシューティングの情報が少なく、環境構築に時間がかかることが予想されました

そのため、本プロジェクトでは Gazebo を採用し、pixi を使った環境構築で進めることにしました。

実機環境について

実機環境の構築は、HiWonder Mentor Pi の Wiki または付属の冊子を参考にしました。

wiki.hiwonder.com

実機の組み立て・初期設定

組み立ては冊子を見ながら行えます。コードを接続するだけなので、比較的簡単に組み立てることができました。

MentorPi

初期手順

Mentor Pi はスマホアプリ、PS2 コントローラー、PC 接続の 3 つの操作方法がありますが、ここでは PC 接続の設定手順を紹介します。

  1. Wiki 通りに、HW〜 から始まる Wi‑Fi に接続する
  2. VNC を使って起動後の Raspberry Pi に接続する(username、password は Wiki を参照)
  3. 自分の Wi‑Fi へ接続する
sudo nmcli device wifi connect "SSID名" password "パスワード"
  1. 接続後はリモート接続が切れるため、手持ちの PC 上で先ほど接続した Wi‑Fi に接続して以下のコマンドを実行する
arp -a
# ここで出てくる IP をメモ
ssh pi@IP

トラブルシューティング: Raspberry Pi が Wi‑Fi に接続できなくなった場合は、有線 LAN または micro HDMI で PC と接続して以下を実行する

sudo nmcli radio wifi on
sudo nmcli device wifi list
sudo nmcli device wifi connect "SSID名" password "パスワード"
トラブルシューティング:モーターの暴走問題

実機を動かしている際に、モーターの暴走問題に遭遇しました。外部からタイヤを回したり、内部からモーターに指示を出すと速度が異常に速くなり、操作の前後が反転するという症状が発生していました。最初はこれがデフォルトの動作だと思い込んでいましたが、実際には問題があったようです。

応急処置的な方法を見つけましたが、SLAM や navigation などの機能を使う際にこの処置が効かなくなり、Mentor Pi が 4 輪駆動から 3 輪駆動になってしまいました。

3輪駆動 メカナムホイール

暴走の原因: モーターのタイプ設定が内部で既に完了している可能性があり、再度設定しようとすると暴走が発生する可能性があります。以下のコードの set_motor_type() をコメントアウトすることで対応できます。

home/ubuntu/ros2_ws/src/driver/ros_robot_controller/ros_robot_controller/ros_robot_controller_node.py

    def send_machine_type(self):

        if 'Acker' in self.machine_type or 'Mecanum' in self.machine_type:
            self.motor_type = 0x02
            self.battery_level = 0x1af4
        else:
            self.motor_type = 0x02
            self.battery_level = 0x1af4
        if self.motor_type is not None:
            for i in range(2):
                '''
                MOTOR_TYPE_JGB520 ox00
                MOTOR_TYPE_JGB37  0x01
                MOTOR_TYPE_JGB27  0x02
                MOTOR_TYPE_JGB528 0x03
                '''
                self.board.set_motor_type(self.motor_type) # ここをコメントアウト
                self.board.set_battery_level(self.battery_level)
        else:

シミュレーション・実世界での検証

ROS 2 を使って動かす

実機には Docker が入っているため、以下のコマンドで Docker コンテナに入ります。

docker exec -it -u ubuntu MentorPi /bin/zsh

以降はDocker内にある程度実装済みのものがあるため、Mentor Pi の Wiki やコマンドファイル通りに実行すれば操舵や SLAM、navigation が可能です。

注意: 実機の電源を入れると bringup.launch.py が自動的に起動するため、他の機能を実行する前に停止しておいた方が良いでしょう。

SLAM

2D LiDAR を用いて実環境のマッピングを行います。詳細は Mentor Pi の Wiki を参照してください。コントローラーはwasdでもps2でも良いですが個人的にはps2のコントローラがおすすめです。

~/.stop_ros.sh
ros2 launch slam slam.launch.py
ros2 launch slam rviz_slam.launch.py

Bizflexのオフィスの一部
slamのmappingの様子
3 輪駆動の影響かもしれませんが、マップが拡大し続けてしまう問題があり、まだ改善の余地があります。

以下のコマンドでマップを保存できます("map_01" を任意の名前に変更してください)。

cd ~/ros2_ws/src/slam/maps && ros2 run nav2_map_server map_saver_cli -f "map_01" --ros-args -p map_subscribe_transient_local:=true

bizflexのオフィス

先ほどのマッピング結果を元に、UI を使って目標位置へ到達します。詳細は Mentor Pi の Wiki を参照してください。

~/.stop_ros.sh
ros2 launch navigation navigation.launch.py map:=map_01
ros2 launch navigation rviz_navigation.launch.py

操作手順: 1. rviz2 の UI が開かれるため、「2D Pose Estimate」で実際の向きと位置を設定する 2. 「Nav2 Goal」で目標位置と向きを設定する

rviz2上のnavigationの様子

navigationの実世界での様子

Frontier exploration

SLAM のマッピングは今回は手動でコントローラーを用いて行いましたが、自動で SLAM マッピングを行うために Frontier Exploration を使用しました。安全のため、シミュレーション環境で実装を行いました。

Frontier explorationとは?

フロンティア探索とは、占有グリッド地図上で未知領域と既知領域の境界にあたるフロンティアセルを検出し、それらを連結成分としてフロンティア領域にまとめ、各領域の代表点を探索目標として順次移動する探索手法である。https://www.cs.cmu.edu/~motionplanning/papers/sbp_papers/integrated1/yamauchi_frontiers.pdf

frontier 探索中のシミュレーション
即興で作ったプログラムのため、途中で障害物に引っかかってしまう問題がありました。この境界(frontier)のあるところへ進むという探索を、より賢い探索手法(強化学習や VLA など)でも実装されているようです。

どんなことができそうか?

今回のインターン中に国際ロボット展に参加させていただきました。展示を見る限り、メカナムホイールロボットの上に台車やアームを取り付けることで、物を運搬する用途で使われている印象があります。また、メカナムホイールの振動抑制技術も進歩しているようなので、上に人が乗る形での利用も増えていくでしょう。

おわりに

今回はインターンの成果として、Mentor Pi の 3 輪メカナムホイールロボットを ROS 2 で動かす環境構築について記事を書かせていただきました。

ロボットにトラブルが発生した時は焦りましたが、その過程を通じて、ロボット開発の奥深さを実感することができました。正直、自分でも購入して触ってみたいと思えるほど、ロボット開発にハマることができたと思います。

We Are Hiring!

ABEJAは、テクノロジーの社会実装に取り組んでいます。 技術はもちろん、技術をどのようにして社会やビジネスに組み込んでいくかを考えるのが好きな方は、下記採用ページからエントリーください! (新卒の方やインターンシップのエントリーもお待ちしております!) careers.abejainc.com

特に下記ポジションの募集を強化しています!ぜひ御覧ください!

MLOps・データ基盤エンジニア(ロボティクス)

Physical AI ソフトウェアエンジニア

Physical AI メカニカルエンジニア

Physical AI ミドルウェア・組み込みエンジニア