Mini Pupperの動かし方(Gazebo)

[ROS Advent Calendar 2021](https://qiita.com/advent-calendar/2021/ros) 19日目の記事です。こんにちは、にっしゃんです。

# Mini Pupperとは

「Mini Pupperは、学校、ホームスクール家庭、愛好家、そしてそれ以外の人々にも、ロボット工学をより身近なものにしてくれることでしょう」 by MangDang

Mini Pupperの経緯について、以下のように理解しています。

1. Nathan Kauさんが[Stanford Pupper](https://stanfordstudentrobotics.org/pupper)を公開した。
1. Nathan KauさんとAfreez Ganさんが[Mini Pupper](https://github.com/mangdangroboticsclub/QuadrupedRobot)を公開した。
1. MangDang(代表Afreez Ganさん)が[Kickstarter](https://www.kickstarter.com/projects/336477435/mini-pupper-open-sourceros-robot-dog-kit)でプロジェクトをスタートし、ファンディングゴールを達成した。

![MangDang_MiniPupper.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630585/0dd2e2ea-ed52-ed86-8ca4-0e351a8b9e9b.png)

なお、pupperは子犬という意味なので、miniが付いてるのでさらに小さいという意味ですね。

# champとは

champはシンガポールの[Juan Miguel Jimeno氏](https://twitter.com/joemeno)が作った、四脚ロボットをROSで動かすプロジェクトです。こちらはROS World 2020でJuan氏によるプレゼンです。

![Juan_presentation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630585/2b64fd0a-c38a-53b3-a625-3e7309cb2503.png)

[ROS World 2020 Technical Session: CHAMP Quadruped Control](https://vimeo.com/480603868)

特徴：

* 色んな販売されている4脚ロボットをROSで制御するためのパッケージ群
* 4脚で歩くための歩容も含まれている。
* Lidarを搭載すればnavigationも可能。
* ハードのインタフェースを用意すれば実機も動かせる。
* 実機がなくてもGazebo内で動かせる。
* ROSのバージョンはROS1。kinitic, melodic, noeticで動作する。

というもの。なのでPCがあれば、色んな4脚ロボットをPCの中で歩かせることができるわけです。ぜひ遊んでみましょう。

# なんで紹介記事書いてんねん

すいません、私のプルリクがchampに採用されました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">4脚ロボットのリポジトリchvmpにmini pupperを追加しました。<br>Added mini pupper to the repository chvmp for quadruped robots.<a href="https://t.co/a2Yq394nLQ">https://t.co/a2Yq394nLQ</a><a href="https://twitter.com/hashtag/ros?src=hash&amp;ref_src=twsrc%5Etfw">#ros</a> <a href="https://twitter.com/hashtag/chvmp?src=hash&amp;ref_src=twsrc%5Etfw">#chvmp</a> <a href="https://twitter.com/hashtag/champ?src=hash&amp;ref_src=twsrc%5Etfw">#champ</a> <a href="https://twitter.com/hashtag/minipupper?src=hash&amp;ref_src=twsrc%5Etfw">#minipupper</a></p>&mdash; nisshan_ にっしゃん (@nisshan_) <a href="https://twitter.com/nisshan_/status/1471450792175767557?ref_src=twsrc%5Etfw">December 16, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">New PR from <a href="https://twitter.com/nisshan_?ref_src=twsrc%5Etfw">@nisshan_</a> allows you to spawn <a href="https://twitter.com/LeggedRobot?ref_src=twsrc%5Etfw">@LeggedRobot</a> Mini Pupper in <a href="https://twitter.com/GazeboSim?ref_src=twsrc%5Etfw">@GazeboSim</a>. <a href="https://t.co/m80lWD9U1V">https://t.co/m80lWD9U1V</a> <a href="https://t.co/7smpV9GO4l">pic.twitter.com/7smpV9GO4l</a></p>&mdash; Juan Miguel Jimeno (@joemeno) <a href="https://twitter.com/joemeno/status/1471451802348376066?ref_src=twsrc%5Etfw">December 16, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

きっかけは、Juanから「Mini Pupper、プレッジしたんでしょ？　じゃChampに追加よろ」とメッセが来たことですw　champを良く知りたかったので良いタイミングでした。

# Mini Pupperを動かす準備

2021/12/16現在の動かし方です。

## [champ](https://github.com/chvmp/champ)の準備

### クローン

```
sudo apt install -y python-rosdep
cd <your_ws>/src
git clone --recursive https://github.com/chvmp/champ
git clone https://github.com/chvmp/champ_teleop
cd ..
rosdep install --from-paths src --ignore-src -r -y
```

--recursive のオプションを忘れるとビルドが通らないので、気をつけましょう。

## [robots](https://github.com/chvmp/robots/)の準備

こちらにmini pupperのデータが入っています。

### クローン

```
cd <your_ws>/src
git clone https://github.com/chvmp/robots
cd robots
./install_descriptions
```
取ってくるデータが多いので、そこそこ時間がかかります。

### ビルド

unitreeの実機用コードが上手く動かないので消してからビルドします。

```
rm -r descriptions/unitree_ros/unitree_legged_real/
cd ../..
rosdep install --from-paths src --ignore-src -r -y
catkin_make
source <your_ws>/devel/setup.bash
```

# Mini Pupperの動かし方(Gazebo)

動かすためのコマンドは[こちら](https://github.com/chvmp/robots/tree/master/configs/mini_pupper_config)に記載していますが、さらっと紹介します。

## rvizのなかでリモコン操作で歩く

Terminal #1 `roslaunch mini_pupper_config bringup.launch rviz:=true`

Terminal #2 `roslaunch champ_teleop teleop.launch`

キーボード操作で歩き出します。操作方法はターミナルの中を参照ください。キーを長押しします。例えばiキーを押し続けると前進します。

なお、パソコンにROS対応のJoystickが無線か有線でつながっていれば、ジョイスティックでも操縦できます。PS3やPS4のコントローラが有名ですね。ジョイスティックだと体の高さ、傾きを変えることができます。ジョイスティックを使う場合は、ターミナル2のコマンドは以下のように変わります。

Terminal #2 `roslaunch champ_teleop teleop.launch joy:=true`

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">載せてるステレオカメラが大きすぎて塊魂感が出てる。 <a href="https://t.co/sWcgvLkGig">pic.twitter.com/sWcgvLkGig</a></p>&mdash; nisshan_ にっしゃん (@nisshan_) <a href="https://twitter.com/nisshan_/status/1470420412773584898?ref_src=twsrc%5Etfw">December 13, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## Gazeboの中でmapを作りながら歩く

Terminal #1 `roslaunch mini_pupper_config gazebo.launch`

Terminal #2 `roslaunch mini_pupper_config slam.launch rviz:=true`

もし仮想環境を使っているなどGazeboの表示の更新が遅い場合は、GazeboのWorld→scene→shadowのTrueをFalseに変更すると多少改善します。

このMini Pupperモデルはステレオデプスカメラと2D Lidarを搭載しているので、周囲の環境をスキャンできます。navigationは、

1. 地図を作る
2. その地図を使って移動する

と2段階に手順が分かれますが、これは1.です。Rviz上の2D Nav Goalを押して、好きな場所まで歩かせましょう。そして、空間を網羅できたら、次の手順でmapを保存します。

```
roscd mini_pupper_config/maps
rosrun map_server map_saver
```

ただ、このリポジトリにはあらかじめmapが入ってるので、次のステップに進めます。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Gazeboの中で動くmini pupper <a href="https://t.co/RRPTCc9xeO">pic.twitter.com/RRPTCc9xeO</a></p>&mdash; nisshan_ にっしゃん (@nisshan_) <a href="https://twitter.com/nisshan_/status/1471490021702406145?ref_src=twsrc%5Etfw">December 16, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## Gazeboの中でnavigationで歩く

Terminal #1 `roslaunch mini_pupper_config gazebo.launch`

Terminal #2 `roslaunch mini_pupper_config navigate.launch rviz:=true`

さっそくMangDang公式でも動かしてくれました。
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Lidar SLAM Simulation based on the champ. <a href="https://t.co/a3q93LGvuz">pic.twitter.com/a3q93LGvuz</a></p>&mdash; MangDang (@LeggedRobot) <a href="https://twitter.com/LeggedRobot/status/1471459751586193411?ref_src=twsrc%5Etfw">December 16, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 今後

* はやく実機が届かないかな…
* 歩くときに胴体が揺れすぎてるので、パラメータ調整したい。
* ステレオデプスカメラと2D Lidarのモデルが大きいので、小さい機種に変えたい。
* 顔を付けたい (Gazeboで不具合が出たので一旦消した)

# さいごに

[さいとてつや](https://twitter.com/saitotetsuya)さん、本記事を事前レビューいただきありがとうございました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">にっしゃんさんの記事を参考にWindows 11のWSL2（WSLg，Ubuntu-18.04）でMini Pupperを動かせました。まぁ，遅いですけど…… <a href="https://twitter.com/hashtag/minipupper?src=hash&amp;ref_src=twsrc%5Etfw">#minipupper</a> <a href="https://twitter.com/hashtag/%E3%83%9F%E3%83%8B%E3%81%B7%E3%81%B1?src=hash&amp;ref_src=twsrc%5Etfw">#ミニぷぱ</a> <a href="https://t.co/KOzTMFpIQg">https://t.co/KOzTMFpIQg</a> <a href="https://t.co/m8OgkUTz4B">pic.twitter.com/m8OgkUTz4B</a></p>&mdash; さいとてつや (@saitotetsuya) <a href="https://twitter.com/saitotetsuya/status/1472424712504770562?ref_src=twsrc%5Etfw">December 19, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>