---
# System prepended metadata

title: ROS 安裝與教學與Gazebo
tags: [ROS]

---

###### 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的操作

![](https://i.imgur.com/XxJMHJ7.png"" =500x)

### 2. 鍵盤控制模擬車子
開啟另一terminal(開新的ssh)
> $rosrun gyro_l4_teleope_key gyro_l4_teleope_key.py

會看到以下輸出，但要注意控制時，必須點著控制的terminal。(所以要自己喬好視窗的位子)

![](https://i.imgur.com/bmvnWyO.png"" =500x)

### 3. 在rviz看模擬資料
> $ roslaunch gyrobot display.launch
- 包含相機3個、Lidar 2個
![](https://i.imgur.com/FsCXoUn.png)


### 備註
- 此模擬為萬象輪的移動，但實際上輪子不太會轉
- 具體來說，使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

&emsp;為了讓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不存在。


具體資料流向如下：

![](https://i.imgur.com/JIEdT4r.png)

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








