🐥

Open Source RoboticsであるHeRo2.0のシミュレーション実験環境を構築する方法

2022/10/28に公開約5,800字

こんにちは、群ロボットとわちゃわちゃしているだいきです。

なんやねんこれ?

群×強化学習を研究テーマにするため、これまで使用していたロボット(Kilobot)より性能の高いロボットを用意する必要がありました。そこで、新しくHeRo2.0を研究室で取り扱うことになりました。
しかし、シミュレータ環境の構築方法が明確に示されていなかったりバグってたりで大苦戦。
本記事では、ROSを知らない人でもわかるようにUbuntu20.04にHero2.0のシミュレーション実験環境の構築方法を記します。

Hero2.0の詳細は下記記事をご覧ください。
https://github.com/verlab/hero_common
https://gigazine.net/news/20220424-hero-low-cost-swarm-robotics/

この記事のゴール

  • シミュレータの起動
  • サンプルプログラムを使用してランダムウォークアルゴリズムでHero2.0を動かす

必要な環境

  • Ubuntu20.04
  • Python3系

環境構築

ROSの環境構築

ROS Noeticのインストール

ROSのインストール手順は公式ドキュメントに詳しく書かれているのでこの記事では割愛します。
下記の記事を見ながらROS Noeticをインストールしてください。
http://wiki.ros.org/ja/noetic/Installation/Ubuntu

catkin buildのインストール

ROSのパッケージをビルドしてくれるコマンド catkin build をインストールします。

sudo apt install python3-osrf-pycommon python3-catkin-tools

ワークスペースの作成

ROSを用いて開発するワークスペースを作成します。

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/
catkin build

HeRo2.0の環境構築

GithubからHeRo2.0をダウンロード

作成した ~/catkin_ws/src にHeRo2.0のプログラムを配置します。

cd ~/catkin_ws/src
git clone https://github.com/verlab/hero_common.git

必要なライブラリのインストール

sudo apt install ros-noetic-usb-cam
sudo apt install urdfdom_py 

HeRo2.0のパッケージをビルド

HeRo2.0のプログラム入手したのでビルドします。

cd ~/catkin_ws
catkin build

ソースコードのバグ修正

いくつかバグがあるため修正します。
プルリクを投げる予定なのでアクセプトされたらこの作業はいらなくなります。

使用するPythonのバージョンを3系にする

pythonのソースコードに下記のようなプログラムが書かれています。

#!/usr/bin/env python

または

#!/usr/bin/python

これはShebang(シバン)と呼ばれるもので、スクリプトを実行するインタープリタが示されています。これにより、python コマンドが3系なら問題ないですが、2系の場合はエラーが起きます。
python コマンドが2系の環境の人は、下記のように書き換えることをお勧めします。

- #!/usr/bin/env python
+ #!/usr/bin/env python3
- #!/usr/bin/python
+ #!/usr/bin/python3

書き換える必要のあるファイルはpythonファイル全てなので大変です。エディタの一括変換機能などを使用して書き換えることをおすすめします。

random.launchの修正

サンプルプログラムのlaunchファイルがいくつか用意されています。今回はHeRo2.0にランダムウォークをさせるため random.launch を使用します。hero_common/hero_examples/launch/random.launch ファイルには下記のように書かれています。
type の値に random_walk2.py が指定されていることがわかります。
この値全てを random_walk.py に変更してください。
random_walk2.py のレーザセンサーの処理が正しくかかれていないため正常に動きません。

random.launch
 <launch>
-    <node pkg="hero_examples" type="random_walk2.py" name="hero_0_random" output="screen" args="/hero_0" />
-    <node pkg="hero_examples" type="random_walk2.py" name="hero_1_random" output="screen" args="/hero_1" />
-    <node pkg="hero_examples" type="random_walk2.py" name="hero_2_random" output="screen" args="/hero_2" />
-    <node pkg="hero_examples" type="random_walk2.py" name="hero_3_random" output="screen" args="/hero_3" />
-    <node pkg="hero_examples" type="random_walk2.py" name="hero_4_random" output="screen" args="/hero_4" />
+    <node pkg="hero_examples" type="random_walk.py" name="hero_0_random" output="screen" args="/hero_0" />
+    <node pkg="hero_examples" type="random_walk.py" name="hero_1_random" output="screen" args="/hero_1" />
+    <node pkg="hero_examples" type="random_walk.py" name="hero_2_random" output="screen" args="/hero_2" />
+    <node pkg="hero_examples" type="random_walk.py" name="hero_3_random" output="screen" args="/hero_3" />
+    <node pkg="hero_examples" type="random_walk.py" name="hero_4_random" output="screen" args="/hero_4" />
 </launch>

random_walk.pyを修正

hero_common/hero_examples/scripts/random_walk.py の51行目にパブリッシャーノードが定義されています。このノードの名前が正しくないため、ロボットが値を受け取れません。
下記のようにノード名を "/velocity_controller/cmd_vel" から "/cmd_vel" 書き換えてください。

random_walk.py
    def run(self):
        rospy.init_node("random_walk", anonymous=True)

        self.pub = rospy.Publisher(
-            self.namespace + "/velocity_controller/cmd_vel", Twist, queue_size=1)
+            self.namespace + "/cmd_vel", Twist, queue_size=1)

        self.pub_color = rospy.Publisher(
            self.namespace + "/led", ColorRGBA, queue_size=1)

シミュレータの起動

HeRo2.0のシミュレータは、環境とロボットを配置するためのウィザードソフトウェアが用意されています。
下記のコマンドでこのソフトウェアを起動してみましょう。

roslaunch hero_gazebo gazebo_wizard.launch

ガゼボとUIインターフェイスが起動します。

launchファイルの作成

任意の実験環境を用意するためのlaunchファイルの作成を行います。

  1. Select Arenaでは、四種類の環境を選択できます。ここでは、arena_4を選択してください。
  2. Commit Arenaボタンを押してください。gazeboにarena_4が表示されます。
  3. Swarm Sizeでは、実験に使用するHeRo2.0のロボット数を選択できます。ここでは、5を選択してください。
  4. Robot Sensorsでは、HeRo2.0に使用するセンサーを選択できます。ここでは、すべての項目をチェックしてください。
  5. Commit Swarmボタンを押してください。gazeboに5匹のHeRo2.0が表示されます。

下記のような画面が表示されていれば正しくできています。

最後のステップとして、この用意した環境をlaunchファイルに変換します。
Play Physics を押してから Generate Launch File を押してtest_env.launchという名前でhero_common/hero_gazebo/launch/に保存してください。

サンプルプログラムの実行

いよいよHeRo2.0を実際に動かしていきます!
ターミナルを3つ用意してください。
それぞれのターミナルで下記を実行してください。

1つ目のターミナル
roslaunch hero_gazebo gazebo_bringup.launch 
2つ目のターミナル
roslaunch hero_gazebo test_env.launch

シミュレータが立ち上がります。

そして、シミュレータ下にある▶︎ボタンを押します。
HeRo2.0が起動します。

下記のコマンドでサンプルプログラムのランダムウォークでHeRo2.0を動かしましょう。

3つ目のターミナル
roslaunch hero_example random.launch

このように、ランダムウォークをしながら赤外線センサを使用して、障害物回避も行なっていることがわかります。

まとめ

以上、HeRo2.0のシミュレーション環境構築の方法を紹介しました。
バグが多かったため動かすのに苦労しましたが、OSRの貢献の一部と考えたら嬉しいものです。
OSSコミットをしたことなかったのでワクワクしています😏

HeRo2.0は実機で協調行動を研究するにはかなり良いOSRだと思います。研究者の方もそうでない方も一度触ってみてはいかがでしょうか?

本記事がHeRo2.0の知名度向上の一助となるなら幸いです。

Discussion

ログインするとコメントできます