###### tags: `ROS`
# ROS 安裝與教學與Gazebo
## 1. 使用Virtual machine
目前車上所使用的作業系統為Ubuntu 20.04,可使用以下虛擬機建立
1. [VMware](https://www.youtube.com/watch?v=9rUhGWijf9U&ab_channel=ProgrammingKnowledge)
2. [Virtual box](https://www.youtube.com/watch?v=x5MhydijWmc&ab_channel=ProgrammingKnowledge)(for IOS)
3. ~~window subsystem linux, WSL~~
- 如果平常有在用再用,架設起來有點複雜,而且GUI也不一定支援GPU
## 2. ROS安裝
ROS1我們所使用的版本為noetic,ROS2為galactic,
目前有的模擬軟體與車上軟體仍在noetic中所以先熟悉它就好。不過兩者是可兼容在同一系統的,galactic日後有需要再安裝。
以下為安裝教學。
- [noetic](http://wiki.ros.org/noetic/Installation/Ubuntu)
- [galactic](https://docs.ros.org/en/galactic/Installation/Ubuntu-Install-Debians.html)
## 3. ROS概念
未來會需要升級到galactic,兩者概念相似,只是底層架構以及API有部分變動。所以我覺得只要大概懂就好,反正升級後很多API和指令都會變動。
- [ROS 教學目錄](http://wiki.ros.org/ROS/Tutorials)
- [ROS2 教學目錄](https://docs.ros.org/en/galactic/Tutorials.html)
### ROS基礎概念
只需要看beginner level的1~6、8章節就差不多了,第8章的launch file正是目前需要修改的地方,最重要!
### launch file格式
- [教學](http://wiki.ros.org/roslaunch/XML)
### 看code會用到的
- [actionlib summary](http://wiki.ros.org/actionlib)
- [actionlib tutorial](http://wiki.ros.org/actionlib/Tutorials)
### 指令
#### rosdep自動安裝workspace中所depend的package
- [詳細介紹](http://wiki.ros.org/noetic/Installation/Source)
```
$ rosdep install --from-paths ./src --ignore-packages-from-source --rosdistro noetic -y
```
## ~~3.5使用gazebo範例~~(old)
- 因為廠商當初gazebo部分寫的太亂,所以我砍掉重練了,因此目前[gazebo_noetic_ws](https://github.com/Thuniinae/gazebo_noetic_ws)的東西就不用了。
- 取而代之,開了新的repository [Diff_car_Gazebo_ROS](https://github.com/Thuniinae/Diff_car_Gazebo_ROS)
:::spoiler
- 環境建置在user:ouros中
- 由於當初廠商給的是noetic當中的版本,所以是在以ros-noetic執行
- 若要移植到galactic中執行,還需要改一些東西,像package中的CMakeLists.txt、 package.xml之類的以符合ROS2 語法?
### 0. 以ourros使用者登入
我想我們需要一個共用的使用者,比較方便一起開發,所以就把範例建在/home/ourros/gazebo_noetic_ws下。
- 目前相同的檔案也在gazebo_galactic_ws中,但顯然版本上的問題使其沒辦法在galactic中執行。
### 1. 開啟廠商給的gazebo車子模擬
> $ roslaunch gyrobot gyrobot_xacro.launch
此時應該會看到以下畫面,可以用這個來熟悉gazebo的操作

### 2. 鍵盤控制模擬車子
開啟另一terminal(開新的ssh)
> $rosrun gyro_l4_teleope_key gyro_l4_teleope_key.py
會看到以下輸出,但要注意控制時,必須點著控制的terminal。(所以要自己喬好視窗的位子)

### 3. 在rviz看模擬資料
> $ roslaunch gyrobot display.launch
- 包含相機3個、Lidar 2個

### 備註
- 此模擬為萬象輪的移動,但實際上輪子不太會轉
- 具體來說,使URDF在模擬中動起來的關鍵都在以下檔案/home/ourros/gazebo_noetic_ws/src/gyrobot/gyrobot/urdf/gazebo_essential_plugin.xacro
### 用途
我想當中的gazebo plugin的寫法可以做為範例,當作參考讓我們建置出在galactic的模擬環境。(或直接使用這環境?)
:::
## 4. 使用gazebo範例
- [程式碼github頁面](https://github.com/Thuniinae/Diff_car_Gazebo_ROS)
### 1. 開啟gazebo模擬
> $ roslaunch myrobot_gazebo myrobot_gazebo_full.launch
### 2. 鍵盤控制模擬車子
開啟另一terminal(開新的ssh)
> $ rosrun myrobot_gazebo gyro_l4_teleope_key.py
### 3. 在rviz看模擬資料
> $ rviz -d Diff_car_Gazebo_ROS/src/myrobot_description/rviz/mybot.rviz
## 5. gazebo備忘與工具
### sdf 轉換工具
gazebo在處理model時是以sdf處理,但ROS的rviz使用URDF,可利用以下工具轉換。
$ xacro myrobot.xacro >myrobot.urdf
$ gz sdf -p myrobot.urdf > myrobot.sdf
- 一起使用
> $ xacro myrobot.xacro >myrobot.urdf | gz sdf -p myrobot.urdf > myrobot.sdf
轉換至sdf可確認所輸入的參數或設定是否被gazebo所接受,因為在xml(此處指xacro,urdf,sdf)中,無法辨識的參數會直接被忽略。因此即使設定的參數名稱錯誤,也不會跳error,導致使用default參數值。
### 摩擦係數設定
urdf並不支援摩擦力的設定,因此需要利用gazebo tag額外對link進行設定。
```xml=
<gazebo reference="BL_wheel_link">
<material>Gazebo/DarkGrey</material>
<mu1>0.001</mu1>
<mu2>0.001</mu2>
</gazebo>
```
- mu1/2: 主要/次要摩擦力方向的摩擦係數
- urdf雖也可設定顏色(material),但Gazebo有自己的顏色格式,因此同樣需要額外設定
::: warning
要設定摩擦力,除了新增額外的gazebo tag以外,還需要確認urdf中的collision的名字為<link_name>_collision,否則無法生效。(還需要確認真正的限制是什麼,但起碼這樣能用)
:::
```xml=
<link name = "${prefix}_wheel_link">
<collision name="${prefix}_wheel_link_collision">
<origin xyz="0 0 0" rpy="0 1.5707 1.5707"/>
<geometry>
<cylinder radius="0.1" length="0.05"/>
</geometry>
</collision>
</link>
```
### Gazebo /joint_states的產生與轉換至/tf
 為了讓joint(目前的只有輪子)的旋轉狀態,可與lidar等其他資料整合在rviz中。需要gazebo joint state publisher plugin(並非ROS的joint statepublisher)產生non-fixed joint的旋轉狀態(i.e. topic /joint_states),以及robot_state_publisher(ROS的)將/joint_states轉換為/tf。
- 至於fixed的joint states:
由於gazebo在將urdf轉換為sdf時,會將fixed joint連接的link整合為一link(此觀點由前面sdf轉換工具自行轉換sdf驗證),因此gazebo會自動產生fixed joint間的joint_states,即使gazebo joint state publisher plugin不存在。
具體資料流向如下:

### 壓縮與解壓縮
tar -zvcf file
tar -zvxf file.tar.sc