DockerでnoVNC環境を構築し、MyCobotをROS2とMoveIt2を使用して動かす

# はじめに

 MacでMycobot 280 M5をRos2環境でシミュレーションする際の環境構築のメモです
 あまり記事がなかったので執筆します

 *ROS初学者です、指摘、補足などありましたらコメントお願いいたします🙇

 # 環境
 - M3 MacBook Air
 - メモリ16GB

 # Ros2環境の構築
 Docker上でRos2(humble)環境を構築します
 
 こちらを参考にRos2インストール済みUbuntuGUI環境の構築を行います
 https://memoteki.net/archives/2955#index_id3

 ### dockerコンテナの作成
 *Mチップの場合、`-arm64`をつける
 `shm-size`：共有メモリ defautは64MBで少ないので少なくとも2gb以上に設定した方が良いです
 ```
 docker run -p 6080:80 --security-opt seccomp=unconfined --shm-size=2G tiryoh/ros2-desktop-vnc:humble-amd64
```

起動に成功したら`http://127.0.0.1:6080/`へアクセスします
ubuntuが起動しているはずです
![noVNC - VNC______ · 7.44pm · 11-15.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900278/a1e704c6-b057-1e05-203f-a8717258dd50.jpeg)

# MoveIt2環境の構築
公式のチュートリアルを参考に行います
https://moveit.picknik.ai/main/doc/tutorials/getting_started/getting_started.html

コマンドを順に実行します
*ubuntuのターミナル
```
source /opt/ros/humble/setup.bash
```

rosdepインストール（おそらくすでにインストール済み）
```
sudo apt install python3-rosdep
```
```
sudo rosdep init
rosdep update
sudo apt update
sudo apt dist-upgrade
```

colconのmixin拡張をインストール
```
sudo apt install python3-colcon-common-extensions
sudo apt install python3-colcon-mixin
colcon mixin add default https://raw.githubusercontent.com/colcon/colcon-mixin-repository/master/index.yaml
colcon mixin update default
```
vsctoolのインストール
```
sudo apt install python3-vcstool
```
colconワークスペースを作成
```
mkdir -p ~/ws_moveit/src
```

moveitソースコードの取得
```
cd ~/ws_moveit/src
git clone -b humble https://github.com/moveit/moveit2_tutorials
vcs import --recursive < moveit2_tutorials/moveit2_tutorials.repos
```

colconワークスペースの構築
```
sudo apt remove ros-humble-moveit*
```
```
sudo apt update && rosdep install -r --from-paths . --ignore-src --rosdistro humble -y
```
ビルドします
数十分〜1時間程度かかります

:::note 
`build`の引数について

docker環境の場合、メモリ不足になる可能性があるので、以下の引数を指定することを推奨
- `--executor sequential`：ひとつずつビルド
- `--parallel-workers 2`：同時ビルド数を指定
できるのであればdockerの共有メモリを増やすと、ビルド時間が早くなります
:::

```
cd ~/ws_moveit
colcon build --mixin release
```
sourceする
```
source ~/ws_moveit/install/setup.bash
echo 'source ~/ws_moveit/install/setup.bash' >> ~/.bashrc
```

### ビルドエラーについて
様々なエラーが出たのでメモとして残します
-  pick_ikエラー
    [参考](https://github.com/moveit/moveit2_tutorials/issues/880)
    ```
    sudo apt-get remove ros-humble-pick-ik
    ```
- ament_cmakeエラー
    特権ユーザーでビルドコマンドを実行
    [参考](https://github.com/ros2/ros2/issues/1236)
    ```
    su
    ```

## moveit2でmycobotシミュレータを動かせるようにする
こちらを参考に作成します
https://www.youtube.com/watch?v=ZOIKEV_BCBE&t=566s

### ROS2用mycobotソースを取得
`ws_moveit/src`下にclone
```
git clone https://github.com/elephantrobotics/mycobot_ros2.git
```


### セットアップアシスタントを起動

```
ros2 launch moveit_setup_assistant setup_assistant.launch.py
```

![noVNC - VNC______ · 12.31pm · 11-19.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900278/6da9a137-4d46-7ab7-f183-fd9c3afcf52d.jpeg)

#### Create New MoviItを選択
mycobotのURDFを選択し、loadFileを押下
`mycobot_ros2/mycobot_description/urdf/mhcobot_280_m5/mycobot_280_m5.urdf`

:::note
先端にpumpやカメラがついたモデルが用意されているので状況に応じて選択できます
:::

#### self collisionの設定
デフォルトのまま`Generate Collision matrix`

#### Virtual jointsの設定
`Add Virtual joint`で追加、適当な名前をつけて保存
![noVNC - VNC______ · 1.03pm · 11-19.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900278/c9c1398b-192f-6d16-472f-30d798b6a7e4.jpeg)

#### Planning Groupsの定義
`Add Group`で追加
Solverは`kdl_kinematics_plugin`を選択
`Kin. parameters file`は`3`に設定
![noVNC - VNC______ · 1.07pm · 11-19.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900278/54ce007b-1b6b-2520-263f-4449b9d22869.jpeg)

**Jointsの追加**
`g_base`以外を追加
![noVNC - VNC______ · 1.12pm · 11-19.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900278/e8818e91-a02e-633d-98bf-98813f208c65.jpeg)

**Linksの追加**
同じく`g_base`以外を追加
![noVNC - VNC______ · 1.14pm · 11-19.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900278/157301de-a316-1a07-6aa6-fb9d3d773a2c.jpeg)

#### ポーズの追加
スライダーを使用してポーズを作成します
あとから追加することも可
![noVNC - VNC______ · 1.39pm · 11-19.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900278/d4692c0f-86b3-6ce8-377f-455102451ad0.jpeg)

#### ROS2コントローラーのセットアップ
Auto Addでok

![noVNC - VNC______ · 1.41pm · 11-19.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900278/1642468f-c1b8-54b8-92f4-38a7d18a22ff.jpeg)

#### moveitコントローラーのセットアップ
Auto Addでok

![noVNC - VNC______ · 1.43pm · 11-19.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900278/3f8b6768-21ad-9d7a-d92a-c4c896b2d2cd.jpeg)

#### Authorとメールの追加
![noVNC - VNC______ · 1.45pm · 11-19.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900278/3502f7eb-668f-1175-79b7-6f08e31ed8dc.jpeg)

#### ジェネレート&保存
colconワークスペースのsrc下に保存
![noVNC - VNC______ · 1.50pm · 11-19.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900278/3d630605-6b68-9a56-75c2-2dcbd41efad1.jpeg)

#### ビルド・インストール
```
cd ~/ws_moveit
colcon build --mixin release
. install/setup.bash
```

#### 起動
```
ros2 launch mycobot_move_it demo.launch.py
```

![noVNC - VNC______ · 1.56pm · 11-19.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900278/9fbf936d-9989-f262-b44f-c9a348def94b.jpeg)

# おわりに
とりあえずシミュレータ上で動かすことができました

*macだとDocker経由でusb使えないらしいので実機を動かせないのがネックですね。。。