# 在WSL2中安裝Ubuntu-22.04, ROS2 humble, Moveit, tm手臂, 使用isaac sim
在這篇文章中,主要介紹筆者個人測試可用的方法,如果遵照此文有任何問題,請發訊息到qazsskevin@gmail.com,以供改進
# 基本安裝
:::danger
開始前強烈提醒
請將Windows升級到Windows 11,否則後續實作Moveit等需要打開GUI介面的程式時還要再裝XLaunch,超級麻煩
Windows 11能夠自動打開WSL中的GUI程式,不用特別設定
:::
:::success
個人推薦
使用Visual Studio Code 左下角可以與WSL連線,還可以選特定的distro,又可以直接打開終端,左邊還能做文件管理
另外 卡關時請善用ChatGPT,將出錯的終端訊息告訴ChatGPT,大概都能得到解答,或是官方教學中會告訴你有哪些應該要裝的,建議從這兩處debug
:::
[安裝WSL2, Ubuntu-22.04方法](https://hackmd.io/@hsueh945/HyzwaR4X3)
**注意:請安裝到"安裝Linux"這個章節就好,底下可以不用看**
**注意:請在安裝時正確輸入"UNIX NAME"與"PASSWORD"這兩個東西,輸入PASSWORD時按下按鍵時不會出現任何符號是正常現象,是為了防止偷窺**
安裝好之後 應該能用terminal打開wsl 並看到底下這個畫面,wsl就算安裝完成了

前面的"kevin"表示剛剛輸入的UNIX NAME,@後面的"DESKTOP-VSAMISU"是我那台WINDOWS電腦的電腦名稱,可以不用管他,重點只有前面的"kevin"
# 安裝ROS2
[安裝ROS2方法](https://docs.ros.org/en/humble/Installation/Ubuntu-Install-Debs.html)
只要能做到Talker-listener章節,能夠看到每秒鐘發送/接收一個訊息就算完成,後面就不用再做了,本教學不會使用
:::info
注意
``` bash=
source /opt/ros/humble/setup.bash
```
這句可以考慮加入到~/.bashrc的最後面,使得每次啟動終端機都自動執行這個命令
使用以下命令
``` bash=
sudo nano ~/.bashrc
```
:::
:::warning
注意:
做到這邊請記得備份系統,避免接下來的操作把系統弄炸
接下來請記得,每做一個段落就自己匯出一次,避免出問題
建議儲存在C槽以外的地方,避免windows本身炸了,導致資料丟失
匯出前請在/etc/wsl.conf增加設定,以便解決每次重新匯入時,使用者會變成root的問題
```
sudo nano /etc/wsl.conf #用這個命令打開
```
```
#在文件末增加這些東西
[user]
default=<使用者名稱>
```
以我的狀況(UNIX NAME = kevin),就會把wsl.conf改成以下的樣子
```
[user]
default=kevin
```
在powershell中
匯出wsl系統(路徑請自己改)
```
#distro名,路徑記得改
wsl --export Ubuntu-22.04 D:\path\to\save\.backup\myBackup.tar
```
導入wsl系統
```
wsl --unregister Ubuntu-22.04 #移除目前的系統
wsl --import Ubuntu-22.04 D:\path\to\install D:\path\to\save\.backup\myBackup.tar
```
:::
接著安裝colcon
``` bash=
sudo apt install python3-colcon-common-extensions
```
建立工作區
``` bash=
cd ~/
mkdir colcon_ws
cd colcon_ws
mkdir src
cd ..
colcon build
```
能成功到這裡 請記得**備份**
# 安裝moveit2
以下方法二擇一
:::spoiler 從原代碼安裝
[從原代碼安裝 (本人使用這種)](https://moveit.ai/install-moveit2/source/)
從原代碼安裝時,請看清楚版本,不要灌到其他版本的東西
另外有關Create a colcon workspace的章節
moveit官方對於colcon workspace的定義是**ws_moveit2**,而本教學使用**colcon_ws**,請不要無腦照著教學複製貼上執行
另外編譯要跑很久,10幾~20分鐘都是正常現象,CPU越好就跑越快,19-12900K要跑10幾分鐘,筆電可能會跑很久
如果是從原碼編譯,建議編譯成功後先**備份**
:::
:::spoiler 直接安裝(推薦)
直接裝底下的命令 應該就可以直接用moveit了
```bash=
sudo apt install ros-humble-moveit
```
:::
安裝好後 可以嘗試執行`rviz2`命令,之後應該要打開像是這樣的視窗

到這邊 moveit就算安裝完成
# 安裝tm手臂必要包
在Ubuntu 22.04中,安裝[tmr_ros2](https://github.com/TechmanRobotInc/tmr_ros2)包
``` bash=
cd ~/colcon_ws/src
#注意,後面的-b 選擇分支超級重要,沒寫通常直接用的話,編譯都會錯
#如果用了Ubuntu-22.04以外的版本,通常每個repo的branch也會不同
#比如使用Ubuntu-20.04,則ros對應版本是foxy,就要把"humble"替換成"foxy"
git clone https://github.com/TechmanRobotInc/tmr_ros2 -b humble
```
然後編譯
``` bash=
cd ~/colcon_ws
colcon build
source install/setup.bash#這個在每次build完之後都要加,不然ros2命令中的所有目標都不會被更新
```
## 在Isaac Sim中匯入URDF檔案並建立工作區(moveit_setup_assistance)
### 匯入URDF檔案
:::danger
注意:在tmr_ros2於028a012這個commit中,已經提供了官方的launch包,因此本教學僅供參考,不必實作,除非有考慮碰到很底層的東西再研究即可
:::
輸入以下命令 打開moveit_setup_assistance
```ros2 launch moveit_setup_assistant setup_assistant.launch.py```

這邊選"Create New Moveit Configuration Package"
然後選"Browse"

接著選擇./src/tmr_ros2/tm_description/urdf/tm5-900.urdf

選擇後,右下角點選Load Files

完成後應該要看到一個達明的機械手臂3D圖
### 設定碰撞檢查矩陣

接著點選左側菜單中Self-Collisions

上面Sampling Density 拉越高表示碰撞檢測的面數越多,但也越消耗資源,保持原樣即可
主要點選Generate Collision Matrix,這樣才有碰撞矩陣的描述

### 設定運動規劃群組
接著點選Planning Groups

選擇Add Group

這邊設定Group Name為任意名字
Kinematic Slover選擇**kdl_kinematics_plugin/KDLKinematicsPlugin**
Group Default Planner選擇**RRTConnect**

接著點選**Add Kin. Chain**,然後依序把base底下所有collapse的選項都依序打開

接著 Base Link選擇base, Tip Link選擇flange

點選Save

### 設定Robot Poses(可選)

右下角點選Add Pose

這邊就可以自由設定預設關節位置,方便未來調試
注意:右側關節數值為弧度,以3.1415為180度,1.5707為90度...依此類推

我個人會將[0,0,0,0,0,0]位置 設為home, 將[0,0,1.5707, 0, 1.5707, 0]設為ready

### 設定末端執行器
選擇End Effectors頁面

施工中
### 設定ros2 control URDF Modificatins
### 設定ROS 2 Controllers
# 安裝Isaac Sim (Omniverse Launcher)
首先需要先到NVIDIA官方網站,建立NVIDIA的帳號(沒建立的話無法使用)
:::info
如果有裝過GeForce Experience,那麼帳號應該是共通的
:::
然後到[這個網址](https://developer.nvidia.com/omniverse#section-getting-started),並找到其中Access Omniverse Launcher for Windows or Linux.部分,選擇Windows的安裝
下載之後,應該會是一個叫做omniverse-launcher-win.exe的檔案,大約86MB,接下來安裝即可
:::danger
警告:此方法(4.2版本)已過期,目前(2025/03/17)的Isaac sim已經升級到4.5版本,可以不須依賴Omniverse Launcher啟動
:::
:::warning
注意:NVIDIA官方說,Omniverse Launcher將在2024年底停止支援,推薦願意試錯的人從Omniverse Kit SDK開始建起,這邊因為只有控制機器人,而且就目前版本來說足夠使用,因此直接使用作者驗證過的版本
:::
安裝好之後,看起來長這樣

上方選單選擇**EXCHANGE**,然後Search "Isaac"

點選ISAAC SIM後,就會到Isaac Sim的介紹畫面

右上角選擇**INSTALL**(作者因為已經下載好了,所以是LAUNCH)
安裝路徑依照預設即可,也可以隨個人喜好放到不同位置
比如作者就把所有路徑都改到D:\Omniverse\下
下載後,就會在LIBRARY中看到下載好的ISAAC SIM

這時選擇LAUNCH後,會先跳出一個小視窗 決定參數

這邊ROS Bridge Extension請選擇**omni.isaac.ros2_bridge**
Use Internal ROS Library則選擇humble
:::danger
Use Internal ROS Library如果沒東西,請考慮先安裝Ubuntu 22.04及ROS2
:::
配置好後,會看到一個cmd視窗,上面會跑出一堆東西,那是Isaac Sim的輸出主控台,**請不要關掉它**,否則Isaac Sim也會同步被關掉

跑一段時間之後,就會自動打開Isaac Sim的頁面了,到此大功告成

接下來軟體操作的部分建議照著[教學](https://docs.omniverse.nvidia.com/isaacsim/latest/core_api_tutorials/tutorial_core_hello_world.html)走一次,最起碼Helloworld部分看完,理解基本操作
# 使Isaac Sim中的tm5-900被Moveit控制
首先,為了方便,我們直接套用Isaac Sim提供的ROS2->Moveit範例專案,你可以在Isaac Examples找到所有的Examples,可以每個都打開來試試看

打開這個專案之後,看起來應該會像是這樣的:

裡面會有一隻[moveit教學](https://docs.omniverse.nvidia.com/isaacsim/latest/ros2_tutorials/tutorial_ros2_moveit.html)在使用的Franka手臂,使用者可以參照omniverse官方的tutorial進行測試,這邊就不特別實作,請將這隻Franka手臂刪除,讓Isaac Sim呈現以下狀態:

## 匯入tm5-900手臂
首先,請將打開Ubuntu下的`~/colcon_ws/src/tmr_ros2`底下的`tm_description` 資料夾複製一份到Windows系統中,位置以使用者方便為主
接著,打開Isaac Utils->Workflows->URDF Importer

找到Input->Input File的右邊資料夾Icon,點擊後應該會跳出檔案選擇器

在檔案選擇器中找到剛才複製到windows下的`tm_description`資料夾,找到`./urdf/tm5-900`文件並打開

你應該會在剛才的URDF的Input File中看到路徑,並且多出了一個Joints的選單

打開之後可以看到每一個軸的運動來源及驅動類型,不過我們不特別做設定,直接拉到最底下按Import即可

按下後會跳出一則訊息,直接點yes即可

等待一段時間,你就能看到tm5-900手臂出現在omniverse中,並且右側有一個`/tm5-900`節點了

:::warning
這邊很重要!
接著,因為xacro檔案轉換urdf的問題,Articulation Root會跑到`root_joint`上,但這並不符合Isaac Sim對於機器人的要求,所以這邊要特別處理
Articulation Root這東西,可以理解成機器人的固定節點,每個機器人都必定會有且僅有一個

在`/tm5_900/root_joint`節點下,找到Articulation Root插件,在插件右上角會有刪除按鈕,點選X

刪除之後,在/tm5_900節點上點選右鍵,並找到`Add->Physcis->Articulation Root`,並按下之後,應該要能在`/tm5_900`節點上找到Articulation Root,到這邊匯入就算完成了

:::
## 更改Action Graph
Action Graph基本上可以用GUI的方式連結常用的功能,當然也可以用python腳本做更靈活的處理
不過以"讓機器手臂可以跟隨moveit的控制"來說,Action Graph就很夠用了
首先,對`/ActionGraph`節點按右鍵->Open Graph

在畫面的下方就會出現Moveit這個示範專案已經預先做好的幾個方塊

放大後可以看到功能的細節,縮小則只有圖標,左側則有一大堆功能包,Omniverse官方應該有做對應說明,這邊就不做說明了

我們在這邊要做的工作,就是要將剛才的Franka機器手臂,全部改成tm5-900手臂所適用的情況
在rqt中使用Node graph功能,我們可以看到系統結構現在長這樣

如果把Topic也列入顯示的話,應該會清楚很多

我們這邊重點看`/joint_states`這個Topic,這個就是目前機器手臂的實際位置了,我們主要就是想要讀出這個東西
我們回到Omniverse中,看到 `ROS2 Subscribe Joint State`模塊,點開後看右邊的 `Inputs`,找到`topicName`,並改成`joint_states`

接著找到`Articulation Controller`模塊,這就是主要在控制omniverse內機器人的模塊

將右邊的`robotPath`更改成`/tm5_900`
然後找到`ROS2 Publish Joint State`模塊,這就是將機器人的當前位置再轉發出去的模塊
:::danger
注意:這就是做到虛擬環境最重要的事情:透過physics引擎,將模擬的負載等情況,施加在機器人上,模擬真實機器人會受到外力的情況,將回授位置傳遞回ROS系統處理的模塊,不過這邊為簡化系統,先不做處理
:::

將targetPrim改為`/tm5_900`,topicName刪除

## 嘗試以rviz透過moveit運動規劃器讓機器手臂動作
到這邊,前置工作就做完了,接著可以嘗試按下Isaac Sim畫面最左方的Play按鍵,看看在rviz中執行運動規劃時,Isaac Sim的畫面是否同步動作

# 將robotiq 2f-85接上tm5-900的flange
[參考文章:使用UR5手臂,in ROS1](https://s-nam.github.io/docs/robotics/ros/2023-02-09-Moveit_setup.html)
[參考文章:Xacro的修改方法](http://www.lxshaw.com/tech/ros/2021/12/19/urdf-tutorial%EF%BC%88%E4%BA%8C%EF%BC%89%EF%BC%9Axacro/)
[參考資料:2f-85在Isaac Sim的關節設定](https://www.youtube.com/watch?v=UpGgq-BR0Gg&ab_channel=JooLAB)
[參考資料:在Isaac Sim中把2f-85接上UR5手臂](https://medium.com/@joolab/how-to-assemble-a-gripper-on-a-robot-manipulator-in-isaac-sim-f7ba8e6f18fc)
TODO:修改namespace教學
# wsl ubuntu的對外連線
通常在不更改任何設定的情況 ubuntu是無法直接穿透任意網路卡進行IP訪問的