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