M1 macbook nativeでRos2 humble/jazzyは動きます！

備忘録としてROS2humbleのconda環境での構築をします。
直接ビルドするより動きます。とても楽です。
こちらを使ってGazebo ClassicとNavigation2とslam_toolboxが入れられます。

## ※追記2025/3/11
最近はpixiを利用したインストール方法があります。こちらは、自動でNav2+gazeboをインストールできるサンプルプログラムがあります。そちらの方法も検討ください。利用するパッケージ自体はRoboStackさんのものです。詳しくは公式サイトをご覧ください。解説は他の方がたくさん記事を書かれていらっしゃいますので、そちらをご覧ください。

https://pixi.sh/latest/

https://pixi.sh/latest/examples/ros2-nav2/




## 環境
* MacBook air m1 (2020) RAM 8GB
* MacOS 14.2 Sonoma

twitterでTaigaさんが宣伝されているros2_m1_nativeがありますが、そちらではなく、conda仮想環境で構築できるros2環境がありましたので共有します。
興味がある方はぜひこちらのビルドチャレンジもしてみてください！

https://github.com/TakanoTaiga/ros2_m1_native

Condaを使用してのROS2humbleの元ソースはこちらです。

※2025/3/11
上記のレポジトリは、Public Archiveになっています。
Jazzy版になってしまいますが、ネイティブで導入するならこちらのスクリプトが参考になります。

https://github.com/IOES-Lab/ROS2_Jazzy_MacOS_Native_AppleSilicon.git

https://youtu.be/GEgVpdZj3tY?si=wd2m0Zn_Pno_7bMK



こちらの記事の流れは
* brew導入
* Miniconda導入
* conda環境のセットアップ
* 必要パッケージの導入
* 注意点
となっております。

## brew導入
https://brew.sh/

こちらの指示に従ってください。
基本的にこちらに従ったらできます。
Versionによってコマンドが違う場合があるのでホームページをみて確認するようにしてください。
## MiniConda導入

https://docs.conda.io/projects/miniconda/en/latest/

こちらのQuickStart部分のコマンドをターミナルに打ち込んで導入してください。
コマンドを載せておきます。
```
mkdir -p ~/miniconda3
curl https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-arm64.sh -o ~/miniconda3/miniconda.sh
bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3
rm -rf ~/miniconda3/miniconda.sh
```
```
~/miniconda3/bin/conda init bash
~/miniconda3/bin/conda init zsh
```

## ROS 2 導入
Robostackさんのものを利用して導入することできます。

https://robostack.github.io/GettingStarted.html

こちらのGetting Startedの指示に従って導入してください。
今現在
* ROS 1 Noetic
* ROS 2 Foxy
* ROS 2 Galactic
* ROS 2 Humble
が導入可能になっています。ここではHumbleについて解説します。他のバージョンは上記のサイトから説明をみてください。コマンドはこの通りです。
```
conda install mamba -c conda-forge
mamba init zsh
```

ここでターミナルを再起動

```
# Create a ros-humble desktop environment
# manba → conda
mamba create -n ros_env
mamba activate ros_env

# this adds the conda-forge channel to the new created environment configuration 
conda config --env --add channels conda-forge
# and the robostack channel
conda config --env --add channels robostack-staging
# remove the defaults channel just in case, this might return an error if it is not in the list which is ok
conda config --env --remove channels defaults
```
```
# Install ros-noetic into the environment (ROS1)
conda install ros-noetic-desktop

# Install ros-humble into the environment (ROS2)
conda install ros-humble-desktop
```

::: note warn
Webページ上ではmanbaとなっていますが、そちらはcondaに変えて動かすようにしてください。manbaの場合デフォルトで導入されるPythonのバージョンが3.8となっていてこちらのパッケージの要件であるPython3.10の要件に満たないためエラーが発生してしまいます。
インストールが完了したらcondaを再起動してください。
:::
:::note warn
condaのBase部分にros環境は入れないようにしてください。Pythonのversionやらライブラリやらの問題でおかしくなってしまうようです。
:::
インストールが終わったらcondaの再起動をします。
```
conda deactivate
conda activate ros_env
```
ビルドツールやらなんやらを入れます。
```
conda install compilers cmake pkg-config make ninja colcon-common-extensions catkin_tools
```
これでRos2環境の導入は終わりです！
## テスト
::: note warn
この環境ではsourceコマンドは絶対に使用しないでください。
pythonのバージョンやら依存関係が仮想環境外のものを引っ張ってきてしまいます。
:::
rviz2とrqt_graphの起動確認をします。以下のコマンドで起動できます。
```
conda activate ros_env
rviz2
rqt_graph
```
## Gazebo11&Navigation2&SlamToolbox
以下のコマンドで導入できます。
Robostackさんのパッケージから持ってきます。
turtlebot3のシュミレーションも持ってきます

::: note warn
brewでgazeboは導入しないでください！
ライブラリの参照エラーで動きません
:::

```
conda install ros-humble-gazebo
conda install ros-humble-navigation2
conda install ros-humble-nav2-bringup
conda install ros-humble-slam-toolbox
conda install ros-humble-turtlebot3-gazebo
conda install ros-humble-turtlebot3-bringup
```
基本的にこちらで大丈夫なはずです。
パッケージが欠けていたらこちらからパッケージリストを確認してダウンロードしてください。
ここで起動確認をします。

::: note 
Pythonの環境変数(PYTHONPATH)を直接指定しないと仮想環境外のPYTHONを指定してしまうので直接コマンドで宣言しましょう
:::
```
PYTHONPATH /Users/kaya/miniconda/envs/ros_env/bin/python
```
ここはminicondaがダウンロードされているディレクトリからenvsフォルダーの入っている仮想環境のPYTHONのPATHを指定してください。

## 動作確認
こちらを別々のターミナルから導入してください。


```
export TURTLEBOT3_MODEL=waffle pi
ros2 launch turtlebot3_gazebo turtlebot3_house.launch.py
```
:::note alert
現在正しくturtlebot3がシュミレーション上でスポーンされないため手動でスポーンさせています。
:::

二箇所のファイルのpathを書き換えてください（ユーザー名は自分のユーザー名にしてください）
```
/Users/kaya/miniconda3/envs/ros2_humble/lib/gazebo_ros/spawn_entity.py -entity waffle_pi -file /Users/kaya/miniconda3/envs/ros_env/share/turtlebot3_gazebo/models/turtlebot3_waffle_pi/model.sdf -x -2.0 -y -0.5 -z 0.01 --ros-args
```
```
export TURTLEBOT3_MODEL=waffle pi
ros2 launch turtlebot3_bringup turtlebot3_state_publisher.launch.py
```
```
ros2 launch nav2_bringup navigation_launch.py
```
```
ros2 lanch slam_toolbox online_async_launch.py 
```
こちらを利用するとこのような感じで動くと思います！
![スクリーンショット 2023-12-30 19.17.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579313/a7ff65ba-e95d-ad2a-0d2f-3b193499526b.png)

## tips
conda環境外のpythonを指定してしまう際は
```
find_package(Python3 3.10 EXACT REQUIRED COMPONENTS Interpreter Development)
```
をCmakeList.txtに追加するとconda環境のpythonを使用してくれます
※brewで導入しているpythonとcondaで導入しているpythonが異なっている場合は使うことができます。

## 追記 2023 2/11
macのクリーンインストールをする機会があったのでconda環境を再構築しました。その際にcmakeやrosdepをconda環境で導入するとconda環境で特にエラーなく使用することができました。エラーを出さないにはros2に関係する全てのパッケージをconda内のパッケージを使用するのが一番です。

## 追記 2024-09-06
ros2 jazzyとgazebo harmoricの導入はこのshellスクリプトで簡単にできるようになりました。こちらで、nativeビルド可能です。こちらは、brewパッケージを利用しているそうです。

https://github.com/IOES-Lab/ROS2_Jazzy_MacOS_Native_AppleSilicon

https://github.com/Jannkar/turtle_nest

最近でたGUIソフトのturtle_nestも問題なく動きました。

## 使用文献

https://brew.sh/

https://docs.conda.io/projects/conda/en/latest/user-guide/install/macos.html

https://robostack.github.io/index.html

https://numpy.org/devdocs/user/troubleshooting-importerror.html

https://youtu.be/GEgVpdZj3tY?si=wd2m0Zn_Pno_7bMK

それでは良いROS2ライフを！