---
# System prepended metadata

title: '在WSL2中安裝Ubuntu-22.04, ROS2 humble, Moveit, tm手臂, 使用isaac sim'
tags: [機械手臂教學]

---

 # 在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就算安裝完成了
![image](https://hackmd.io/_uploads/SkiumQyM1g.png)
前面的"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`命令，之後應該要打開像是這樣的視窗
![image](https://hackmd.io/_uploads/rJ1xfwfMkx.png)

到這邊 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```
![image](https://hackmd.io/_uploads/SywYTwGGkg.png)
這邊選"Create New Moveit Configuration Package"
然後選"Browse"
![image](https://hackmd.io/_uploads/ByZ66PMfJe.png)
接著選擇./src/tmr_ros2/tm_description/urdf/tm5-900.urdf
![image](https://hackmd.io/_uploads/SJE-0Pzzyx.png)
選擇後，右下角點選Load Files
![image](https://hackmd.io/_uploads/HyFG0vff1x.png)
完成後應該要看到一個達明的機械手臂3D圖
### 設定碰撞檢查矩陣
![image](https://hackmd.io/_uploads/r1K7Awfz1x.png)
接著點選左側菜單中Self-Collisions
![image](https://hackmd.io/_uploads/rJCt0vGMyg.png)
上面Sampling Density 拉越高表示碰撞檢測的面數越多，但也越消耗資源，保持原樣即可
主要點選Generate Collision Matrix，這樣才有碰撞矩陣的描述
![image](https://hackmd.io/_uploads/Skcs0Dzz1e.png)

### 設定運動規劃群組
接著點選Planning Groups
![image](https://hackmd.io/_uploads/HJnAAwGf1e.png)
選擇Add Group
![image](https://hackmd.io/_uploads/r1i11dffJg.png)
這邊設定Group Name為任意名字
Kinematic Slover選擇**kdl_kinematics_plugin/KDLKinematicsPlugin**
Group Default Planner選擇**RRTConnect**
![image](https://hackmd.io/_uploads/Sy8H1_Mzyx.png)
接著點選**Add Kin. Chain**，然後依序把base底下所有collapse的選項都依序打開
![image](https://hackmd.io/_uploads/H1uKkuGzJe.png)
接著 Base Link選擇base， Tip Link選擇flange
![image](https://hackmd.io/_uploads/r1m1xuMf1e.png)
點選Save
![image](https://hackmd.io/_uploads/BySxluzMJe.png)

### 設定Robot Poses(可選)
![image](https://hackmd.io/_uploads/S1YzgdffJx.png)
右下角點選Add Pose
![image](https://hackmd.io/_uploads/S1CmldMf1e.png)
這邊就可以自由設定預設關節位置，方便未來調試
注意：右側關節數值為弧度，以3.1415為180度，1.5707為90度...依此類推
![image](https://hackmd.io/_uploads/SyKPluGfye.png)
我個人會將[0,0,0,0,0,0]位置 設為home, 將[0,0,1.5707, 0, 1.5707, 0]設為ready
![image](https://hackmd.io/_uploads/BJaaxOGfJl.png)

### 設定末端執行器
選擇End Effectors頁面
![image](https://hackmd.io/_uploads/rJLVbuMfkx.png)
施工中

### 設定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開始建起，這邊因為只有控制機器人，而且就目前版本來說足夠使用，因此直接使用作者驗證過的版本
:::
安裝好之後，看起來長這樣
![image](https://hackmd.io/_uploads/HkBLuDGGye.png)
上方選單選擇**EXCHANGE**，然後Search "Isaac"
![image](https://hackmd.io/_uploads/B1fcOvMMyl.png)
點選ISAAC SIM後，就會到Isaac Sim的介紹畫面
![image](https://hackmd.io/_uploads/H1zhdvff1x.png)
右上角選擇**INSTALL**(作者因為已經下載好了，所以是LAUNCH)

安裝路徑依照預設即可，也可以隨個人喜好放到不同位置
比如作者就把所有路徑都改到D:\Omniverse\下

下載後，就會在LIBRARY中看到下載好的ISAAC SIM
![image](https://hackmd.io/_uploads/SJiltwGGkx.png)
這時選擇LAUNCH後，會先跳出一個小視窗 決定參數
![image](https://hackmd.io/_uploads/SyCHtwGGJe.png)
這邊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也會同步被關掉
![image](https://hackmd.io/_uploads/SyP0YDffyx.png)

跑一段時間之後，就會自動打開Isaac Sim的頁面了，到此大功告成
![image](https://hackmd.io/_uploads/Bk2W9PfGJg.png)

接下來軟體操作的部分建議照著[教學](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，可以每個都打開來試試看
![image](https://hackmd.io/_uploads/r1hzFq_4yx.png)

打開這個專案之後，看起來應該會像是這樣的：
![image](https://hackmd.io/_uploads/r1_8K9uE1g.png)

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


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

接著，打開Isaac Utils->Workflows->URDF Importer
![image](https://hackmd.io/_uploads/S19X9cu41g.png)
找到Input->Input File的右邊資料夾Icon，點擊後應該會跳出檔案選擇器
![image](https://hackmd.io/_uploads/r1Ywi9dVJg.png)
在檔案選擇器中找到剛才複製到windows下的`tm_description`資料夾，找到`./urdf/tm5-900`文件並打開
![image](https://hackmd.io/_uploads/SJbjsqdV1e.png)
你應該會在剛才的URDF的Input File中看到路徑，並且多出了一個Joints的選單
![image](https://hackmd.io/_uploads/Hy9129OVJx.png)
打開之後可以看到每一個軸的運動來源及驅動類型，不過我們不特別做設定，直接拉到最底下按Import即可
![image](https://hackmd.io/_uploads/ryPgh5dVyx.png)
按下後會跳出一則訊息，直接點yes即可
![image](https://hackmd.io/_uploads/HkBrhqdEkl.png)
等待一段時間，你就能看到tm5-900手臂出現在omniverse中，並且右側有一個`/tm5-900`節點了
![image](https://hackmd.io/_uploads/S10Dn9d41e.png)
:::warning
這邊很重要!
接著，因為xacro檔案轉換urdf的問題，Articulation Root會跑到`root_joint`上，但這並不符合Isaac Sim對於機器人的要求，所以這邊要特別處理
Articulation Root這東西，可以理解成機器人的固定節點，每個機器人都必定會有且僅有一個
![image](https://hackmd.io/_uploads/SyD0hq_Ekg.png)
在`/tm5_900/root_joint`節點下，找到Articulation Root插件，在插件右上角會有刪除按鈕，點選X
![image](https://hackmd.io/_uploads/r1LBp9_Vkg.png)

刪除之後，在/tm5_900節點上點選右鍵，並找到`Add->Physcis->Articulation Root`，並按下之後，應該要能在`/tm5_900`節點上找到Articulation Root，到這邊匯入就算完成了
![image](https://hackmd.io/_uploads/rybFTquNyl.png)
:::
## 更改Action Graph
Action Graph基本上可以用GUI的方式連結常用的功能，當然也可以用python腳本做更靈活的處理
不過以"讓機器手臂可以跟隨moveit的控制"來說，Action Graph就很夠用了

首先，對`/ActionGraph`節點按右鍵->Open Graph
![image](https://hackmd.io/_uploads/r1ZfJidVJe.png)
在畫面的下方就會出現Moveit這個示範專案已經預先做好的幾個方塊
![image](https://hackmd.io/_uploads/rJxXJjuNyx.png)
放大後可以看到功能的細節，縮小則只有圖標，左側則有一大堆功能包，Omniverse官方應該有做對應說明，這邊就不做說明了
![image](https://hackmd.io/_uploads/S1UUkidEyl.png)
我們在這邊要做的工作，就是要將剛才的Franka機器手臂，全部改成tm5-900手臂所適用的情況

在rqt中使用Node graph功能，我們可以看到系統結構現在長這樣
![image](https://hackmd.io/_uploads/Bk8slou4kx.png)
如果把Topic也列入顯示的話，應該會清楚很多
![image](https://hackmd.io/_uploads/HJs9lsd41e.png)
我們這邊重點看`/joint_states`這個Topic，這個就是目前機器手臂的實際位置了，我們主要就是想要讀出這個東西

我們回到Omniverse中，看到 `ROS2 Subscribe Joint State`模塊，點開後看右邊的 `Inputs`，找到`topicName`，並改成`joint_states`
![image](https://hackmd.io/_uploads/HyZClju4kg.png)

接著找到`Articulation Controller`模塊，這就是主要在控制omniverse內機器人的模塊
![image](https://hackmd.io/_uploads/HJfzbsdNJl.png)
將右邊的`robotPath`更改成`/tm5_900`

然後找到`ROS2 Publish Joint State`模塊，這就是將機器人的當前位置再轉發出去的模塊
:::danger
注意：這就是做到虛擬環境最重要的事情：透過physics引擎，將模擬的負載等情況，施加在機器人上，模擬真實機器人會受到外力的情況，將回授位置傳遞回ROS系統處理的模塊，不過這邊為簡化系統，先不做處理
:::
![image](https://hackmd.io/_uploads/BkFF-iONkx.png)
將targetPrim改為`/tm5_900`，topicName刪除
![image](https://hackmd.io/_uploads/BJYvGo_Ekl.png)

## 嘗試以rviz透過moveit運動規劃器讓機器手臂動作
到這邊，前置工作就做完了，接著可以嘗試按下Isaac Sim畫面最左方的Play按鍵，看看在rviz中執行運動規劃時，Isaac Sim的畫面是否同步動作
![image](https://hackmd.io/_uploads/rytUmsOVkl.png)




# 將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訪問的
