# 01. ROS tools
tags: DIT 12th 教學 -- ROS 1
<!-- # title: HackMD Dark Theme
description: Use `{%hackmd BkVfcTxlQ %}` syntax to include this theme. -->
---
{%hackmd BJrTq20hE %}
<style>
html, body, .ui-content {
background-color: #333;
color: #ddd;
}
body > .ui-infobar {
display: none;
}
.ui-view-area > .ui-infobar {
display: block;
}
.markdown-body h1,
.markdown-body h2,
.markdown-body h3,
.markdown-body h4,
.markdown-body h5,
.markdown-body h6 {
color: #ddd;
}
.markdown-body h1,
.markdown-body h2 {
border-bottom-color: #ffffff69;
}
.markdown-body h1 .octicon-link,
.markdown-body h2 .octicon-link,
.markdown-body h3 .octicon-link,
.markdown-body h4 .octicon-link,
.markdown-body h5 .octicon-link,
.markdown-body h6 .octicon-link {
color: #fff;
}
.markdown-body img {
background-color: transparent;
}
.ui-toc-dropdown .nav>.active:focus>a, .ui-toc-dropdown .nav>.active:hover>a, .ui-toc-dropdown .nav>.active>a {
color: white;
border-left: 2px solid white;
}
.expand-toggle:hover,
.expand-toggle:focus,
.back-to-top:hover,
.back-to-top:focus,
.go-to-bottom:hover,
.go-to-bottom:focus {
color: white;
}
.ui-toc-dropdown {
background-color: #333;
}
.ui-toc-label.btn {
background-color: #191919;
color: white;
}
.ui-toc-dropdown .nav>li>a:focus,
.ui-toc-dropdown .nav>li>a:hover {
color: white;
border-left: 1px solid white;
}
.markdown-body blockquote {
color: #bcbcbc;
}
.markdown-body table tr {
background-color: #5f5f5f;
}
.markdown-body table tr:nth-child(2n) {
background-color: #4f4f4f;
}
.markdown-body code,
.markdown-body tt {
color: #eee;
background-color: rgba(230, 230, 230, 0.36);
}
a,
.open-files-container li.selected a {
color: #5EB7E0;
}
</style>
[toc]
## ROSbag
### introduction
rosbag可以儲存Topics當前的訊息,之後再回放出來,可以重複觀看數據進行debug
#### record
```linux=
$ rosbag record [TOPIC_NAME]
```
- 紀錄所有的訊息
```linux=
$ rosbag record -a
```
- 設定紀錄時長
```linux=
$ rosbag record --duration 10 [TOPIC_NAME]
```
- 紀錄某個node中接受的訊息
```linux=
$ rosbag record --node=/[NODE_NAME]
```
- 指定bag file名稱
```linux=
$ rosbag record -O [FILE_NAME]
```
#### play
- 回放儲存的bag file
```linux=
$ rosbag play [BAG_FILE_NAME.bag]
```
### example
1. 寫一個簡單的publisher(basiclearn中的talker.cpp)
```c
#include "ros/ros.h"
#include "std_msgs/Int64.h"
int main(int argc, char **argv)
{
ros::init(argc, argv, "talker");
ros::NodeHandle nh;
ros::Publisher pub = nh.advertise<std_msgs::Int64>("counter", 10);
ros::Rate loop_rate(2);
int number = 0;
std_msgs::Int64 msg;
while(ros::ok())
{
msg.data = number;
// ROS_INFO("%ld", msg.data);
pub.publish(msg);
number++;
loop_rate.sleep();
}
return 0;
}
```
2. 執行這個publisher,並利用rostopic echo來查看"counter"的即時訊息
```linux=
$ rosrun basiclearn talker
```
```linux=
$ rostopic echo /counter
```
3. 在 package 底下創建 bag folder ( 統一環境而已,也可以用自己的方式儲存要用的 bag file )
```linux=
$ roscd basiclearn
$ mkdir bag
```
4. rosrun 剛剛的 publisher 並使用開另一個terminal紀錄訊息 rosbag record,記得要先進去bag這一層資料夾
```linux=
$ rosbag record --duration 10 /counter
```
5. 使用 rosbag play 回放剛剛存好的 bag file ,用另一個terminal 進行rostopic echo
```linux=
$ rosbag play [BAG_FILE_NAME]
$ rostopic echo /counter
```
## rqt
ROS內建的GUI界面
* 先打開rqt
```linux=
$ rqt
```
打開來應該會是一個空白的頁面,點一下plugin後才開始有東西

### some plugins
#### rqt_graph
可視化node和topic間的關係
* rqt->Plugin->intorspection->Node Graph
* 直接開啟rqt_graph
```linux=
$ rqt_graph # or
$ rqt -s rqt_graph # or
$ rosrun rqt_graph rqt_graph
```
1. 選擇想查看的類型

2. 濾出想看的topic或是Node

3. example
例如底下的圖,/navMec_node 為 publisher 並傳送資料到 topic /push_vel 上,接著 /encoder_node 為 subscriber 接收這些資訊

#### rqt_bag
將 topic 中的 message 錄製下來,並以圖形化界面加上時間條顯示,尤其是在比賽前實際到比賽場地測試時,將所有資訊錄下來,即便測試時間有限,回去仍舊可以 debug
1. 開啟
- rqt -> Plugin -> Logging -> Bag
- 僅開啟 rqt_bag
```linux=
$ rqt_bag # or
$ rqt -s rqt_bag # or
$ rosrun rqt_bag rqt_bag
```
2. 選擇要紀錄的 topic
- 按紅色按鈕
-
- 選擇topic並紀錄

- 再按一次紅色按鈕停止紀錄
3. 播放
```linux=
$ rqt_bag [BAG_FILE]
```
#### rqt_plot
rqt_plot 將 topic 中的資料圖形化,方便查看 message 的變化
1. 開啟
- rqt -> Plugin -> Visualization -> Plot
- 僅開啟 rqt_plot
``` linux
$ rqt_plot # or
$ rqt -s rqt_plot # or
$ rosrun rqt_plot rqt_plot
```

2. 輸入要監控的 topic
3. 點擊加號將其加入到底下的圖表
4. 點擊減號的小三角形取消監聽某一 topic
5. 點放大鏡右邊的圖示可以設置圖表邊框距離
6. 設置圖表的 x-y 軸範圍以及圖表顯示的各種數據
#### rqt_topic
監控 topic 的資料以及 頻寬 和 頻率,可以想像成 rostopic 圖形界面
1. 開啟
- rqt -> Plugin -> Topics -> Topic Monitor
- 僅開啟 rqt_topic
```linux
$ rqt_topic # or
$ rqt -s rqt_topic # or
$ rosrun rqt_topic rqt_topic
```
2. 勾選欲監控的 topic
3. 點擊查看更詳細的資訊
<!-- #### rqt_console
取得當前 Node 或 Topic 印出於 console 的東西
相較於使用終端機看,rqt_console 能濾出一些不必要的訊息,加速 debug
1. 開啟
- rqt -> Plugin -> Logging -> Console
- 僅開啟 rqt_console
```
$ rqt_console # or
$ rqt -s rqt_console # or
$ rosrun rqt_console rqt_console
```
2. 選擇欲加入的方式
3. 查看 messages

4. 用 ...containing 濾掉不要的訊息
- EX : 濾掉所有含有 4 的訊息
-->
<!-- #### rqt_launch
圖形化的 launch 界面
1. 開啟
- rqt -> Plugin -> Configuration -> Launch
- 僅開啟 rqt_launch
```linux
$ rqt -s rqt_launch
```
2. 選擇 launch file

3. 加入該 launch 檔需要的參數

4. 增加其他 node 需要的 args

5. 執行全部 / 停止全部
 -->
## Gazebo
Gazebo 是一個三維物理模擬平台,它可以模擬現實世界中的各種物理行為,因此當我們手上沒有實驗環境,我們便可以透過於此來搭建模擬環境。剛開啟gazebo什麼也沒有,不過我們可以透過左邊 insert的選項插入我們下載的不同的地圖物件。
1. 單獨開啟
```linux=
$ gazebo
```
## Rviz
Rviz能將sensor的各種數據可視化,以圖像的方式表達
1. 單獨開啟
```linux=
$ rviz
```
### examples
- 在workspace/src裡執行下列操作
```linux=
git clone https://github.com/6-robot/wpr_simulation.git
git clone https://github.com/6-robot/wpb_home.git
```
```linux=
$ cd ..
$ sudo apt update
$ cd wpr_simulation/scripts/
$ ./install_for_noetic.sh
回到workspace
$ cd wpb_home/wpb_home_bringup/scripts/
$ ./install_for_noetic.sh
回到workspace
$ catkin_make
接下來source一下
```
- launch以下檔案來開啟gazebo rviz and 控制器
```linux=
$ roslaunch wpr_simulation wpb_gmapping.launch(用於開啟rviz gazebo)
$ rosrun wpr_simulation keyboard_vel_ctrl(open controller)
```
- 以下是gazebo和rviz


- 在terminal通過鍵盤控制機器人行走
- rviz左方可調整想可視化的topic